NavigationView和自定义布局

89

我正在使用设计支持库中的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与布局而不是菜单一起使用?


你可不可以直接使用header view,nav_header文件呢? - RuAware
我想要标题视图,而且我想使用自定义布局代替菜单。 - Panayiotis Irakleous
2个回答

193
这是我是如何解决的,而且完美地运行了:
<android.support.design.widget.NavigationView
    android:id="@+id/navigationView"
    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/menuItemsListView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

    </LinearLayout>

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

完美的方法!我已经厌倦了寻找这个,但是我为什么没有尝试扩展闭合标签呢,太愚蠢了!太好了!实际上我需要一个可扩展的ListView! - sud007
2
这会在状态栏下绘制HeaderView吗? - marilion91
当然可以,因为它仍然是NavigationView的一部分。 - Hamzeh Soboh
这是我目前找到的唯一基于XML的可行解决方案。+1 - michnovka
太棒了。我寻找解决方案已经很长时间了..上帝保佑你 :) - geeky_monster
显示剩余11条评论

38

是的,你可以......就像我做的一样......只需将你的自定义布局放在 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>

以上的代码对我有用... 但是别忘了从NavigationView中删除app:menu。否则它会覆盖在菜单项上的自定义视图。


1
列表视图出现在页眉视图上方。如何将其放置在页眉视图下方? - Sudheesh Mohan
如果您将ListView用作子视图,则无法使用NavigationView的标题。因此,如果您正在使用ListView,则可以在其中添加HeaderView。 - Moinkhan
1
当我在ListView中添加headerview时,headerview消失了。代码如下: <ListView app:headerLayout="@layout/nav_header" android:entries="@array/test" android:layout_width="match_parent" android:layout_height="match_parent"/> - Sudheesh Mohan
7
如果我们在NavigationView中使用自定义行的ListView,那么它会给予我们什么更多的东西? - Davideas
NavigationView仅用于在应用程序中提供导航。您也可以在没有抽屉的情况下使用它。如果您想在菜单中使用简单的标签和图像,它只允许您编写较少的代码,可选标题就是这样.... - Moinkhan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接