NavigationView get/find 头布局

在我的 NavigationView 中,我有一个带有活动按钮的 id 为‘ viewId’的头部布局。为了设置这些按钮,我在活动的 onPostCreate中执行以下操作:

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

使用新版本的 android 支持库(23.1.0) ,视图无法找到,它返回 null。与以前的版本工作得很好。这是一个错误还是我用错了这个特性?如果是这样,如何访问头布局和添加行为到它?

104478 次浏览

版本23.1.0将 NavigationView切换为使用 RecyclerView(而不是以前的 ListView) ,并将头部作为这些元素之一添加。这意味着它不能立即调用 findViewById()-布局通行证是需要的,然后才能连接到 NavigationView

对于 Support Library 的 版本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。

对于我来说,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布局中定义的所有视图。

现在,随着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);
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 ")
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 ");

在 Kotlin@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)

Kotlin 版本。

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

在爪哇为我工作

   navigationView = findViewById(R.id.nav_view);
View viewHeader = navigationView.getHeaderView(0);
((TextView)viewHeader.findViewById(R.id.tv_name)).setText(preferences.getString(MyConstant.NAME,"n/a"));