在导航视图android中将标题视图下方的自定义视图膨胀

时间:2017-09-05 12:25:34

标签: android android-layout navigationview android-navigationview

我有一个带有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中,标题视图会动态膨胀,如下所示。

View headerView = getCustomHeaderView(navigationView);
        if (headerView != null) {
            navigationView.addHeaderView(headerView);
        }

NavigationView中包含另一个布局,其中包含ExpandableListView。我需要将这个布局放在膨胀的headerView下面。我通过动态获取headerView的高度并将其设置为&#34; marginTop&#34;来实现此目的。包含布局的属性。但是如果headerView没有静态高度(如果是wrap_content),则会失败(两个视图重叠)。 如何以有效的方式在NavigationView中的headerView下面设置包含的布局。请帮忙。

1 个答案:

答案 0 :(得分:1)

答案就是这么简单。只需使用onWindowFocusChanged方法获取动态标题视图的高度(使用高度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);
        }
    }