在我的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
),并将标题添加为其中一个元素。这意味着它无法立即调用findViewById()
- 在连接到NavigationView
之前需要布局传递。
对于支持库的version 23.1.1,您现在可以使用getHeaderView()
获取对标题视图的引用:
View headerLayout = navigationView.getHeaderView(0); // 0-index header
这样做的好处是可以处理通过XML和代码添加的头文件。
如果您仍在使用23.1.0,根据the related bug,您可以在代码中膨胀标头并使用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的情况相同,更新后空指针异常变为。在这种情况下,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);
之后,我可以通过id找到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 ");