web-dev-qa-db-ja.com

NavigationViewのカスタマイズ-動的headerViewの追加、Android Support Design Library

新しいAndroidサポートデザインライブラリからnavigationViewを試してみました。動的なヘッダービューが必要です。基本的に、ヘッダービューにはその日の引用のようなものが表示されます。引用をランダムに選択し、headerViewのテキストビューに表示したいまた、headerViewにonClickメソッドを追加したい。

現時点では、ヘッダービューのレイアウトをプログラムで変更する可能性はありません。これを実装するための提案はありますか?

20
Abdul Rahman

最初にlay_header.xmlのようなヘッダーXMLを作成します

<TextView
    Android:id="@+id/tvThought"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content" />

あなたのJavaファイルはTextViewの上記のヘッダーを膨張させます。

TextView headerView = (TextView) LayoutInflater.from(this).inflate(R.layout.lay_header, null);
headerView.setText("Your_thoght");

次に、HeaderViewとして追加します

navView = (NavigationView) findViewById(R.id.navView);
navView.addHeaderView(headerView);

それでおしまい...

24
Moinkhan

新しいサポートライブラリの更新(23.1.1)の後、

これを行うことができます-

NavigationView内のapp:headerLayout="@layout/drawer_header"にヘッダービューを追加します。

その後、次の方法でアクセスできます。

View header = navigationView.getHeaderView(0);
TextView text = (TextView) header.findViewById(R.id.textView);

または、複数のヘッダーがある場合

navigationView.getHeaderCount()

参照: https://code.google.com/p/Android/issues/detail?id=190226#c31

14
RmK
TextView txt2;
txt2 = (TextView) navigationView.inflateHeaderView(R.layout.nav_header_main).findViewById(R.id.textView2);
txt2.setText("wow! It works like a charm");
6
Shwarz Andrei

enter image description here

ヘッダーレイアウトを作成し、内部にテキストビューを表示します。

<TextView
                Android:id="@+id/profile_email_text"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@id/profile_image"
                Android:layout_alignParentBottom="true"
                Android:layout_toLeftOf="@id/expand_account_box_indicator"
                Android:ellipsize="end"
                Android:maxLines="1"
                Android:paddingBottom="16dp"
                Android:singleLine="true"
                Android:clickable="true"
                Android:onClick="onSelectText"
                Android:text="[email protected]"
                Android:textColor="@color/body_text_2_inverse"
                Android:textSize="@dimen/text_size_medium" />

onCreateで、

((TextView) findViewById(R.id.profile_email_text)).setText("test");

アクティビティでonSelectTextメソッドを作成します

public void onSelectText(View v){
        if(v.getId() == R.id.profile_email_text){
            Snackbar
                    .make(fab, "clicked on sub title", Snackbar.LENGTH_LONG)
                            //.setAction(R.string.snackbar_action, myOnClickListener)
                    .show();
            drawer_layout.closeDrawers();
        }
    }
2
Dhaval Parmar

findViewById()を使用して、NavigationView内のヘッダー要素にアクセスできます。これは、headerLayoutプロパティでヘッダーを初期化した場合でも機能します。 app:headerLayout="@layout/drawer_header"。その後、新しいヘッダーを膨らませたり追加したりすることなく、ヘッダーを動的に変更できます。

@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {

...

if(mNavItemId == R.id.drawer_item_1)
{
  View headerView = mNavigationView.findViewById(R.id.drawer_header_root);
  // Test modifying the size of the header root element (FrameLayout)
  // when the first menu item is clicked.
  LinearLayout.LayoutParams p = (LinearLayout.LayoutParams) headerView.getLayoutParams();
  p.height = p.height == 700 ? 400 : 700;
  headerView.setLayoutParams(p);
  return true;
}
...

drawer_header.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="196dp"
Android:background="@color/drawer_header_bg"
Android:orientation="vertical"
Android:id="@+id/drawer_header_root">
...

ダワールも同じことを言っていると思いますが、それはあまり明確ではありませんでした。

1
Jarrod Smith

NavigationViewでaddHeaderViewを呼び出してプログラムでカスタムヘッダーを追加するか、app:headerLayout="@layout/myheader"を使用してレイアウトファイルで定義することができます。

1
Vera Rivotti

私のこのリンクはあなたを助けます

よりスリムな質問

final NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);

View headView = navigationView.getHeaderView(0);

((TextView) headView.findViewById(R.id.nav_title)).setText("New title");
0
Bikesh M