私のNavigationViewでは、アクティブなボタンを持つid 'viewId'のヘッダレイアウトがあります。これらのボタンを設定するために、アクティビティのonPostCreate
で次のことを行います。
final View panel = findViewById(R.id.viewId);
panel.setOnClickListener(new View.OnClickListener() {
... setup goes here ...
});
新しいバージョンのAndroidサポートライブラリでは、(23.1.0)、ビューが見つからず、nullを返します。以前のバージョンではうまくいきました。それはバグですか、それとも私はこの機能を間違って使っていますか?もしそうなら、どのようにヘッダーレイアウトにアクセスし、それに動作を追加するには?
バージョン23.1.0では、(以前のNavigationView
ではなく)RecyclerView
をListView
の使用に切り替え、ヘッダーをそれらの要素の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に移動するまで.
デザインサポートライブラリの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);
これが私が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);
私にとっては、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_heard
layoutで定義されているすべてのビューをidで見つけることができます。
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 ");