NavigationView get/find header 布局
NavigationView get/find header layout
在我的 NavigationView 中,我有一个 header 布局,其 ID 'viewId' 带有活动按钮。要设置这些按钮,我在 activity 的 onPostCreate
中执行以下操作:
final View panel = findViewById(R.id.viewId);
panel.setOnClickListener(new View.OnClickListener() {
... setup goes here ...
});
使用新版本 android 支持库,(23.1.0),找不到视图,它 returns 为空。对于以前的版本,它运行良好。是错误还是我错误地使用了此功能?如果是这样,如何访问 header 布局并向其添加行为?
版本 23.1.0 将 NavigationView
切换为使用 RecyclerView
(而不是之前的 ListView
),并且添加 header 作为这些元素之一。这意味着它不能立即用于调用 findViewById()
- 在附加到 NavigationView
.
之前需要布局传递
对于支持库的 version 23.1.1,您现在可以使用 getHeaderView()
:
获取对 header 视图的引用
View headerLayout = navigationView.getHeaderView(0); // 0-index header
这有利于处理通过 XML 和代码添加的 header。
如果您仍在使用 23.1.0,按照 the related bug,您可以在代码中膨胀 header 并在其上使用 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
layout 中定义的所有视图。
现在随着设计支持库的 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 中,我有一个 header 布局,其 ID 'viewId' 带有活动按钮。要设置这些按钮,我在 activity 的 onPostCreate
中执行以下操作:
final View panel = findViewById(R.id.viewId);
panel.setOnClickListener(new View.OnClickListener() {
... setup goes here ...
});
使用新版本 android 支持库,(23.1.0),找不到视图,它 returns 为空。对于以前的版本,它运行良好。是错误还是我错误地使用了此功能?如果是这样,如何访问 header 布局并向其添加行为?
版本 23.1.0 将 NavigationView
切换为使用 RecyclerView
(而不是之前的 ListView
),并且添加 header 作为这些元素之一。这意味着它不能立即用于调用 findViewById()
- 在附加到 NavigationView
.
对于支持库的 version 23.1.1,您现在可以使用 getHeaderView()
:
View headerLayout = navigationView.getHeaderView(0); // 0-index header
这有利于处理通过 XML 和代码添加的 header。
如果您仍在使用 23.1.0,按照 the related bug,您可以在代码中膨胀 header 并在其上使用 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
layout 中定义的所有视图。
现在随着设计支持库的 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"