web-dev-qa-db-ja.com

NavigationViewヘッダレイアウトの取得/検索

私のNavigationViewでは、アクティブなボタンを持つid 'viewId'のヘッダレイアウトがあります。これらのボタンを設定するために、アクティビティのonPostCreateで次のことを行います。

final View panel = findViewById(R.id.viewId);
panel.setOnClickListener(new View.OnClickListener() {
... setup goes here ...
});

新しいバージョンのAndroidサポートライブラリでは、(23.1.0)、ビューが見つからず、nullを返します。以前のバージョンではうまくいきました。それはバグですか、それとも私はこの機能を間違って使っていますか?もしそうなら、どのようにヘッダーレイアウトにアクセスし、それに動作を追加するには?

156
khusrav

バージョン23.1.0では、(以前のNavigationViewではなく)RecyclerViewListViewの使用に切り替え、ヘッダーをそれらの要素の1つとして追加しています。これはfindViewById()を呼び出すために即座に利用可能ではないことを意味します - レイアウトパスはそれがNavigationViewにアタッチされる前に必要とされます。

サポートライブラリの バージョン23.1.1 では、getHeaderView()を使用してヘッダビューへの参照を取得できるようになりました。

View headerLayout = navigationView.getHeaderView(0); // 0-index header

これには、XMLおよびコードを介して追加されたヘッダーを処理するという利点があります。

関連するバグ に従って、まだ23.1.0を使用している場合は、ヘッダーをコード内で展開し、それにfindViewById()を使用できます。

View headerLayout = 
    navigationView.inflateHeaderView(R.layout.navigation_header);
panel = headerLayout.findViewById(R.id.viewId);
// panel won't be null

23.1.1に移動するまで.

404
ianhanniballake

デザインサポートライブラリの23.1.1リリースでは、次のものを使用できます。

NavigationView navigationView = (NavigationView) findViewById(R.id.your_nav_view_id);
View header = navigationView.getHeaderView(0)
TextView text = (TextView) header.findViewById(R.id.textView);
133
Francois Dermu

これが私がButterKnifeを使ってそれをした方法であり、それは私のために働きます。

protected static class HeaderViewHolder {

    @BindView(R.id.button)
    Button button;

    HeaderViewHolder(View view) {
        ButterKnife.bind(this, view);
    }
}

そしてこのビューホルダーを次のように使います。

View header = navigationView.getHeaderView(0);
headerViewHolder = new HeaderViewHolder(header);
12
Wahib Ul Haq

私にとっては、23.1.0と同じ状況でしたが、更新後にnullポインタ例外が発生しました。この場合、NavigatorViewは以下のようになります。

<Android.support.design.widget.NavigationView
  Android:id="@+id/navigation_view"
  Android:layout_height="match_parent"
  Android:layout_width="wrap_content"
  Android:layout_gravity="start"
  Android:fitsSystemWindows="true"
  app:headerLayout="@layout/nav_header"
  app:menu="@menu/menu_nav"/>

私はianhanniballakeによる解決策の提案を試みましたが、うまくいきません。それから私は文で膨らませた:

LayoutInflater.from(getContext()).inflate(R.layout.nav_header, mNavigationView);

その後、nav_heardlayoutで定義されているすべてのビューをidで見つけることができます。

8
Campino
NavigationView navigationView = findViewById(R.id.your_nav_view);
View header = navigationView.getHeaderView(0);
TextView textUsername = header.findViewById(R.id.textView);
textUsername.setText("you text here ");
1
indrit saveta