Navigationsansicht und benutzerdefiniertes Layout

81

Ich verwende die Designs Support Libraries NavigationViewwie folgt:

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

Und ich habe dieses Menü eingestellt:

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

Gibt es eine Möglichkeit, die Navigationsansicht mit einem Layout anstelle eines Menüs zu verwenden?

Panayiotis Irakleous
quelle
Können Sie nicht einfach die Header-Ansicht nav_header verwenden?
RuAware
Ich möchte die Kopfzeile und ich möchte anstelle des Menüs ein benutzerdefiniertes Layout verwenden
Panayiotis Irakleous

Antworten:

184

So habe ich es gelöst und perfekt funktioniert:

<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
quelle
Perfekter Weg! Ich war es leid, das zu finden, aber dumm von mir, warum habe ich nicht versucht, die schließenden Tags zu erweitern! Schön! Ich brauchte tatsächlich eine erweiterbare ListView!
Sud007
2
Zeichnet dies die Kopfansicht unter die Statusleiste?
marilion91
Ja sicher, da es immer noch Teil der Navigationsansicht ist.
Hamzeh Soboh
Dies ist die einzige XML-basierte Arbeitslösung, die ich bisher gefunden habe. +1
michnovka
Könnte jemand einen Referenzlink für diese Lösung geben? weil ich das versucht habe, aber Probleme bekommen habe.
Realpranav
34

Ja, Sie können ... Wie ich es getan habe ... Nehmen Sie einfach Ihr benutzerdefiniertes Layout in die Navigationsansicht

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

Der obige Code Arbeit für mich ... Aber vergessen Sie nicht , entfernen app:menuaus NavigationView. Andernfalls überlappt es Ihre benutzerdefinierte Ansicht der Menüelemente.

Moinkhan
quelle
1
Die Listenansicht wird über der Kopfansicht angezeigt. Wie kann man es unter die Kopfansicht setzen?
Sudheesh Mohan
Wenn ListViewSie eine untergeordnete Ansicht verwenden, können Sie die NavigationView'sKopfzeile nicht verwenden . Wenn Sie also verwenden ListView, können Sie headerView hinzufügen ListView.
Moinkhan
1
Als ich in der Listenansicht die Kopfansicht hinzufügte, verschwand die Kopfansicht. Code <ListView App: headerLayout = "@ layout / nav_header" android: entry = "@ array / test" android: layout_width = "match_parent" android: layout_height = "match_parent" />
Sudheesh Mohan
Bro derzeit Design Support-Bibliothek ist fehlerhaft ... Sie können es tun. Wenn Sie Headerview hinzufügen möchten, müssen Sie es aufblasen und programmgesteuert in Listview hinzufügen.
Moinkhan
7
Was bietet die Navigationsansicht mehr, wenn wir ListView darin mit einer benutzerdefinierten Zeile verwenden, wie wir es bisher tun?
Davideas