NavigationView获取/查找标题布局

khu*_*rav 161 android android-support-library android-design-library navigationview

在我的NavigationView中,我有一个标题布局,其id为'viewId',带有活动按钮.要设置这些按钮,我在活动中执行以下操作onPostCreate:

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

使用新版本的android支持库(23.1.0),无法找到视图,它返回null.以前的版本运行良好.这是一个错误还是我使用此功能错了?如果是这样,如何访问标题布局并向其添加行为?

ian*_*ake 409

版本23.1.0切换NavigationView到使用RecyclerView(而不是以前ListView)和报头被添加作为这些元素中的一个.这意味着它无法立即调用findViewById()- 在连接到之前需要布局传递NavigationView.

对于支持库的版本23.1.1,您现在可以使用getHeaderView()以下命令获取对标题视图的引用:

View headerLayout = navigationView.getHeaderView(0); // 0-index header
Run Code Online (Sandbox Code Playgroud)

这样做的好处是可以处理通过XML和代码添加的头文件.

如果你还在使用23.1.0,按照相关的错误,你可以抬高头的代码,并使用findViewById()上:

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

直到你转到23.1.1.

  • 我更喜欢降级libs.引入错误就像来自Google的签名.如果新版本有错误,那么谷歌发布了新版本 (4认同)
  • @AlexanderFarber - 我发布的代码可以回到API 7 (2认同)

Fra*_*rmu 137

现在有了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);
Run Code Online (Sandbox Code Playgroud)


Wah*_*Haq 13

这就是我使用ButterKnife它的方式,它对我有用.

protected static class HeaderViewHolder {

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

    HeaderViewHolder(View view) {
        ButterKnife.bind(this, view);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用这个视图持有者:

View header = navigationView.getHeaderView(0);
headerViewHolder = new HeaderViewHolder(header);
Run Code Online (Sandbox Code Playgroud)

  • 当您想从“活动”中删除“视图”相关逻辑时,这是完美的选择。好点子! (2认同)
  • 它非常适合ButterKnife,谢谢兄弟。 (2认同)

Cam*_*ino 8

对于我来说,与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"/>
Run Code Online (Sandbox Code Playgroud)

我尝试了ianhanniballake的解决方案提案,但它不起作用.然后我夸大了句子:

LayoutInflater.from(getContext()).inflate(R.layout.nav_header, mNavigationView);
Run Code Online (Sandbox Code Playgroud)

之后,我可以通过id找到nav_heard布局中定义的所有视图.


小智 5

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 ")
Run Code Online (Sandbox Code Playgroud)