Заголовок NavigationView перекрывает дочерний элемент содержимого

У меня есть DrawerLayout, в котором вторым дочерним элементом является NavigationView, который содержит содержимое NavigationDrawer.

Когда я запускаю проект, открывая ящик, содержимое NavigationView перекрывает вид заголовка, установленный для NavigationView.

Деятельность построена следующим образом:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/drawer_main_layout">

    <android.support.design.widget.CoordinatorLayout>
        <!-- contents of activity-->
    </android.support.design.widget.CoordinatorLayout>

    <!-- nav drawer -->

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view_drawer"
        android:orientation="vertical"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start">

        <RelativeLayout
            android:id="@+id/drawer_body"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/navigation_drawer_header_height"
            ></RelativeLayout>
    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

В действии я программно устанавливаю представление заголовка. Я должен сделать это, потому что заголовок и тело навигации будут меняться в течение жизненного цикла приложения.

LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        RelativeLayout headerView = new RelativeLayout(this);
        View mHeadernav =  inflator.inflate(resourceViewId,headerView);
        mNavigationView.addHeaderView(mHeadernav);

Содержимое дочернего элемента NavigationView добавляется таким же образом, вызывая addView(View) для объекта RelativeLayout.

Обходной путь: чтобы обойти эту проблему, я установил значение в ресурсах (@dimen/header_view_height) и использую его, чтобы указать высоту моего представления заголовка и как marginTop содержимого NavigationView дочернего элемента.

Еще один обходной путь, о котором я думал, — создать отдельное представление и использовать его как представление заголовка. В этом случае RelativeLayout (дочерний элемент NavView) будет иметь двух дочерних элементов, первый будет заголовком, второй — содержимым.

Я знаю, что NavigationView работает так же, как FrameLayout, но есть ли способ сделать контент последовательно размеченным, как в LinearLayout, с помощью пользовательских представлений?


person MikeKeepsOnShine    schedule 20.09.2016    source источник
comment
Скриншот пожалуйста   -  person M D    schedule 20.09.2016
comment
Рассматривали ли вы просто использование вертикального LinearLayout для вашего ящика? Не похоже, что вы используете NavigationView для чего-то, что не может быть легко воспроизведено с помощью LinearLayout.   -  person Mike M.    schedule 20.09.2016


Ответы (1)


Вместо того, чтобы помещать ViewGroup внутри вашего NavigationView и раздувать заголовок, попробуйте следующее:

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@color/background_color"
    app:headerLayout="@layout/drawer_header"
    app:menu="@menu/menu_drawer_items"/>

Затем вы можете определить свой заголовок в файле макета drawer_header.xml.

person jch000    schedule 20.09.2016
comment
Я не могу этого сделать. Я должен загрузить тело и заголовок программно, потому что мне нужно изменить его в каждом действии. - person MikeKeepsOnShine; 22.09.2016