NavigationView и настраиваемый макет

83

Я использую библиотеки поддержки проектов NavigationViewследующим образом:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:fitsSystemWindows="true">

    <!-- put your main layout here -->
    <include layout="@layout/drawer_main_layout"/>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_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/drawer_view"/>

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

И я установил это меню:

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_dashboard"
            android:title="Home" />
        <item
            android:id="@+id/nav_messages"
            android:icon="@drawable/ic_event"
            android:title="Messages" />
        <item
            android:id="@+id/nav_friends"
            android:icon="@drawable/ic_headset"
            android:title="Friends" />
        <item
            android:id="@+id/nav_discussion"
            android:icon="@drawable/ic_forum"
            android:title="Discussion" />
    </group>

    <item android:title="Sub items">
        <menu>
            <item
                android:icon="@drawable/ic_dashboard"
                android:title="Sub item 1" />
            <item
                android:icon="@drawable/ic_forum"
                android:title="Sub item 2" />
        </menu>
    </item>

</menu>

Есть ли способ использовать NavigationView с макетом, а не с меню?

Панайотис Ираклеус
источник
Вы не можете просто использовать представление заголовка, файл nav_header?
RuAware 03
Мне нужен вид заголовка, и я хочу вместо меню использовать настраиваемый макет
Панайотис Ираклеус

Ответы:

187

Вот как я решил это и отлично сработал:

<android.support.design.widget.NavigationView
    android:id="@+id/navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include layout="@layout/nav_header" />

        <ListView
            android:id="@+id/lst_menu_items"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>
</android.support.design.widget.NavigationView>
Хамзе Собо
источник
Отличный способ! Я устал находить это, но я был глуп с моей стороны, почему я не попытался расширить закрывающие теги! Хороший! На самом деле мне нужен был расширяемый ListView!
sud007
2
отображает заголовок в строке состояния?
marilion91
Да, конечно, поскольку он все еще является частью NavigationView.
Hamzeh Soboh
это единственное рабочее решение на основе XML, которое я нашел до сих пор. +1
мичновка 06
Может ли кто-нибудь дать ссылку на это решение? потому что я пробовал это, но возникли проблемы.
realpranav
34

Да, вы можете .... Как я сделал ... Просто возьмите свой собственный макет в NavigationView

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.NavigationView
        android:id="@+id/navView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start">

        <ListView
            android:entries="@array/test"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </android.support.design.widget.NavigationView>

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

Приведенный выше код работает для меня ... Но не забудьте удалить app:menuиз NavigationView. В противном случае он будет перекрывать ваш пользовательский вид пунктов меню.

Мойнхан
источник
1
Список отображается поверх заголовка. Как поставить его под заголовком?
Судиш Мохан,
Если вы используете ListViewкак дочернее представление, вы не можете использовать NavigationView'sзаголовок. Итак, если вы используете, ListViewвы можете добавить headerView в ListView.
Moinkhan
1
Когда я добавил заголовок в Listview, заголовок исчез. code <ListView app: headerLayout = "@ layout / nav_header" android: entries = "@ array / test" android: layout_width = "match_parent" android: layout_height = "match_parent" />
Судиш Мохан
Братан, в настоящее время в библиотеке поддержки дизайна есть ошибки ... Вы можете это сделать. Если вы хотите добавить headerview, вы должны раздуть его и программно добавить в listview ..
Моинхан
7
Что дает NavigationView больше, если мы используем внутри него ListView с настраиваемой строкой, как мы это делали до сих пор?
Davideas