在导航视图 android 中的 header 视图下方扩充自定义视图
Inflating a custom view below header view in Navigation view android
我有一个带 NavigationView 的 DrawerLayout,如下所示
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:openDrawer="start">
<include
layout="@layout/app_bar_dynamic_screen"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start">
<include layout="@layout/navigation_drawer_content"/>
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
在 NavigationView 中,header 视图动态膨胀,如下所示。
View headerView = getCustomHeaderView(navigationView);
if (headerView != null) {
navigationView.addHeaderView(headerView);
}
NavigationView 中包含另一个布局,其中包含一个 ExpandableListView。我需要将此布局放置在膨胀的 headerView 正下方。我通过动态获取 headerView 的高度并将与 "marginTop" 属性 相同的高度设置为包含的布局来实现这一点。但是如果 headerView 没有静态高度(如果 wrap_content),这将失败(两个视图重叠)。
如何有效地在 NavigationView 中的 headerView 下方设置包含的布局。请帮忙。
答案就这么简单。只需使用 onWindowFocusChanged 方法获取动态 header 视图(高度 wrap_content)的高度,并将其设置为 NavigationView 中包含的布局的 margin_top 属性。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (navigationView.getHeaderView(0) != null) {
int headerHeight = navigationView.getHeaderView(0).getHeight();
RelativeLayout navigationParentView = (RelativeLayout) findViewById(R.id.navigation_parent_view);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
params.setMargins(0,headerHeight,0,0);
navigationParentView.setLayoutParams(params);
}
}
我有一个带 NavigationView 的 DrawerLayout,如下所示
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:openDrawer="start">
<include
layout="@layout/app_bar_dynamic_screen"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start">
<include layout="@layout/navigation_drawer_content"/>
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
在 NavigationView 中,header 视图动态膨胀,如下所示。
View headerView = getCustomHeaderView(navigationView);
if (headerView != null) {
navigationView.addHeaderView(headerView);
}
NavigationView 中包含另一个布局,其中包含一个 ExpandableListView。我需要将此布局放置在膨胀的 headerView 正下方。我通过动态获取 headerView 的高度并将与 "marginTop" 属性 相同的高度设置为包含的布局来实现这一点。但是如果 headerView 没有静态高度(如果 wrap_content),这将失败(两个视图重叠)。 如何有效地在 NavigationView 中的 headerView 下方设置包含的布局。请帮忙。
答案就这么简单。只需使用 onWindowFocusChanged 方法获取动态 header 视图(高度 wrap_content)的高度,并将其设置为 NavigationView 中包含的布局的 margin_top 属性。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (navigationView.getHeaderView(0) != null) {
int headerHeight = navigationView.getHeaderView(0).getHeight();
RelativeLayout navigationParentView = (RelativeLayout) findViewById(R.id.navigation_parent_view);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
params.setMargins(0,headerHeight,0,0);
navigationParentView.setLayoutParams(params);
}
}