NavigationView获取/查找页眉布局

在我的NavigationView我有一个标题布局ID为'viewId'与活动button。 要设置这些button,我在activity的onPostCreate执行以下onPostCreate

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

有了新版本的android支持库,( 23.1.0 ),查看无法find,它返回null。 与以前的版本,它运作良好。 这是一个错误还是我使用这个function错了? 如果是这样,如何访问页眉布局并添加行为?

版本23.1.0切换NavigationView使用RecyclerView (而不是以前的ListView )和标题被添加为其中一个元素。 这意味着它不能立即调用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。

现在使用devise支持库的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); 

对于我来说那是23.1.0的情况,更新之后空指针exception变成了。 在这种情况下,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的解决scheme,但它不起作用。 然后我用这个句子夸大了:

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

之后,我可以通过idfind在nav_heard中定义的所有视图。

这就是我使用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);