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.