NavigationView i układ niestandardowy


83

Używam bibliotek obsługi projektów w NavigationViewnastępujący sposób:

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

I ustawiłem to menu:

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

Czy istnieje sposób użycia NavigationView z układem zamiast menu?


czy nie możesz po prostu użyć widoku nagłówka, pliku nav_header?
— RuAware

chcę widok nagłówka i zamiast menu używać niestandardowego układu
— Panayiotis Irakleous

Odpowiedzi:


187

Oto jak to rozwiązałem i działało idealnie:

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

Doskonały sposób! Byłem zmęczony znajdowaniem tego, ale głupio z mojej strony, dlaczego nie spróbowałem rozwinąć zamykających tagów! Niezłe! Właściwie potrzebowałem eksplorowalnego ListView!
— sud007

2
czy to rysuje widok głowy pod paskiem stanu?
— marilion91

Tak, na pewno, ponieważ nadal jest częścią NavigationView.
— Hamzeh Soboh

jest to jedyne działające rozwiązanie oparte na XML, jakie do tej pory znalazłem. +1
— michnovka

Czy ktoś mógłby podać odnośnik do tego rozwiązania? ponieważ próbowałem tego, ale mam problemy.
— realpranav

34

Tak, możesz .... Tak jak ja ... Po prostu weź swój niestandardowy układ wewnątrz 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>

Powyższy kod działa dla mnie ... Ale nie zapomnij usunąć app:menuz NavigationView. W przeciwnym razie będzie nakładał się na niestandardowy widok elementów menu.


1
Widok listy pojawia się nad widokiem głowy. Jak umieścić to poniżej widoku głowy?
— Sudheesh Mohan

Jeśli używasz ListViewwidoku podrzędnego, nie możesz używać NavigationView'snagłówka. Więc jeśli używasz ListView, możesz dodać headerView w ListView.
— Moinkhan

1
Kiedy dodałem headerview w Listview, headerview zniknął. code <ListView app: headerLayout = "@ layout / nav_header" android: wpisy = "@ array / test" android: layout_width = "match_parent" android: layout_height = "match_parent" />
— Sudheesh Mohan

Bracie, obecnie biblioteka wsparcia projektowania jest wadliwa ... Możesz to zrobić. Jeśli chcesz dodać widok głowy, musisz go zawyżyć i dodać programowo w
— widoku

7
Co NavigationView daje więcej, jeśli użyjemy w nim ListView z niestandardowym wierszem, tak jak robimy to do tej pory?
— Davideas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.