NavigationView get/find header layout
Version 23.1.0 switches NavigationView
to using a RecyclerView
(rather than the previous ListView
) and the header is added as one of those elements. This means it is not instantly available to call findViewById()
- a layout pass is needed before it is attached to the NavigationView
.
For version 23.1.1 of the Support Library, you can now get a reference to the header view using getHeaderView()
:
View headerLayout = navigationView.getHeaderView(0); // 0-index header
This has the advantage of working on headers added via XML and via code.
If you are still using 23.1.0, as per the related bug, you can inflate the header in code and use findViewById()
on that:
View headerLayout =
navigationView.inflateHeaderView(R.layout.navigation_header);
panel = headerLayout.findViewById(R.id.viewId);
// panel won't be null
Until you move to 23.1.1.
Now with the 23.1.1 release of the design support library, you can use
NavigationView navigationView = (NavigationView) findViewById(R.id.your_nav_view_id);
View header = navigationView.getHeaderView(0)
TextView text = (TextView) header.findViewById(R.id.textView);
This is how I did it using ButterKnife
and it works for me.
protected static class HeaderViewHolder {
@BindView(R.id.button)
Button button;
HeaderViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
and then use this view holder like this :
View header = navigationView.getHeaderView(0);
headerViewHolder = new HeaderViewHolder(header);
For me that was the same situation with 23.1.0, after of update the null pointer exception become. In this case the NavigatorView
look like:
<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"/>
I tried the solution proposal by ianhanniballake but it does not work. Then I inflated with the sentence:
LayoutInflater.from(getContext()).inflate(R.layout.nav_header, mNavigationView);
After that, I can find by id all views defined in nav_heard
layout .
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 ");