NavigationView获取/查找标题布局

时间:2015-10-18 05:20:53

标签: 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 ...
});

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

7 个答案:

答案 0 :(得分:402)

版本23.1.0将NavigationView切换为使用RecyclerView(而不是之前的ListView),并将标头添加为其中一个元素。这意味着无法立即调用findViewById() - 在将NavigationView附加到布局传递之前需要进行布局传递。

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

View headerLayout = navigationView.getHeaderView(0); // 0-index header

这样做的好处是可以处理通过XML和代码添加的标题。

如果您仍然按照the related bug使用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。

答案 1 :(得分:132)

现在有了设计支持库的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);

答案 2 :(得分:12)

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

答案 3 :(得分: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"/>

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

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

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

答案 4 :(得分:0)

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 ");

答案 5 :(得分:0)

在科特林@Francois Dermu代码中就像

val navigationView : NavigationView = findViewById(R.id.your_nav_view_id);
val header = navigationView.getHeaderView(0)
val textView = header.findViewById<TextView>(R.id.textView)

答案 6 :(得分:0)

科特林版本。

val navView: NavigationView = findViewById(R.id.nav_view)       
// set User Name
val headerView: View = navView.getHeaderView(0)
headerView.txtUserName.text = "User Name Goes here"