NavigationView y diseño personalizado

82

Estoy usando las Bibliotecas de soporte de diseños NavigationViewcomo esta:

<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>

Y he configurado este menú:

<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>

¿Hay alguna forma de usar NavigationView con un diseño en lugar de un menú?

Panayiotis Irakleous
fuente
¿No puede simplemente usar la vista de encabezado, el archivo nav_header?
RuAware
Quiero la vista del encabezado y quiero que en lugar del menú use un diseño personalizado
Panayiotis Irakleous

Respuestas:

186

Así es como lo resolví y funcioné perfectamente:

<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>
Hamzeh Soboh
fuente
¡Manera perfecta! Estaba cansado de encontrar esto, pero estúpido de mi parte, ¿por qué no intenté expandir las etiquetas de cierre? ¡Buena esa! ¡Necesitaba un ListView explicable en realidad!
sud007
2
¿Esto dibuja la vista del encabezado debajo de la barra de estado?
marilion91
Sí, seguro, ya que sigue siendo parte de NavigationView.
Hamzeh Soboh
esta es la única solución de trabajo basada en XML que he encontrado hasta ahora. +1
michnovka
¿Alguien podría dar un enlace de referencia para esta solución? porque intenté esto pero tengo problemas.
realpranav
34

Sí, puede ... Como yo lo he hecho ... Simplemente tome su diseño personalizado dentro de 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>

El código anterior funciona para mí ... Pero no olvide eliminar app:menude NavigationView. De lo contrario, se superpondrá a su vista personalizada en los elementos del menú.

Moinkhan
fuente
1
La vista de lista aparece sobre la vista de encabezado. ¿Cómo ponerlo debajo de headerview?
Sudheesh Mohan
Si está usando ListViewuna vista secundaria, no puede usar NavigationView'sHeader. Entonces, si está utilizando ListView, puede agregar headerView en formato ListView.
Moinkhan
1
Cuando agregué headerview en Listview, headerview desapareció. código <ListView app: headerLayout = "@ layout / nav_header" android: entries = "@ array / test" android: layout_width = "match_parent" android: layout_height = "match_parent" />
Sudheesh Mohan
Bro, actualmente, la biblioteca de soporte de diseño tiene errores ... Puedes hacerlo. Si desea agregar headerview, lo ha inflado y agregado en listview programáticamente ..
Moinkhan
7
¿Qué ofrece NavigationView más si usamos ListView dentro de él con una fila personalizada como lo estamos haciendo hasta ahora?
Davideas