如何在NavigationView菜单中获取没有标题的分隔符?

40
我正在使用新的NavigationView从XML创建我的导航抽屉菜单。我需要在应用程序各个部分之间切换的部分菜单项和底部的设置和帮助&支持链接之间放置一个分隔符。
在所有我看过的示例中,我看到可以通过在<item>中放置另一个<menu>来实现此操作,但是<item>需要具有android:title属性,因此我所能做的最好的方式是使标题为空,这会在设置和帮助&反馈之前留下一个空白空间。
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_section_1"
            android:icon="@drawable/ic_dashboard"
            android:title="@string/section_1"
            android:checked="true" /> <!-- default selection -->
        <item
            android:id="@+id/nav_section_2"
            android:icon="@drawable/ic_dashboard"
            android:title="@string/section_2" />
        <item
            android:id="@+id/nav_section_3"
            android:icon="@drawable/ic_dashboard"
            android:title="@string/section_3" />
    </group>

    <item android:title="@null"> <!-- I don't want a title or space here! -->
        <menu>
            <item
                android:id="@+id/nav_settings"
                android:icon="@drawable/ic_settings"
                android:title="@string/settings" />
            <item
                android:id="@+id/nav_help_feedback"
                android:icon="@drawable/ic_help"
                android:title="@string/help_feedback" />
        </menu>
    </item>
</menu>

我尝试了各种组合的<menu><item><group>标签,但没有找到有效的解决方法。例如,以下代码会出现使用上一个组中的最后一项作为组标题的问题:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_section_1"
            android:icon="@drawable/ic_dashboard"
            android:title="@string/section_1"
            android:checked="true" /> <!-- default selection -->
        <item
            android:id="@+id/nav_section_2"
            android:icon="@drawable/ic_dashboard"
            android:title="@string/section_2" />
        <item
            android:id="@+id/nav_section_3"
            android:icon="@drawable/ic_dashboard"
            android:title="@string/section_3" />
    </group>

    <group> <!-- This puts @string/section_3 as the group title! -->
        <menu>
            <item
                android:id="@+id/nav_settings"
                android:icon="@drawable/ic_settings"
                android:title="@string/settings" />
            <item
                android:id="@+id/nav_help_feedback"
                android:icon="@drawable/ic_help"
                android:title="@string/help_feedback" />
        </menu>
    </item>
</menu>

使用菜单XML描述就可以轻松实现这一点。Google在Material design spec中展示了这种行为。

设置和支持

编辑:

另一次尝试:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="@null"> <!-- Still a space here though! -->
        <menu>
            <group android:checkableBehavior="single"> <!-- And this checkable behavior behaves strangely for some reason -->
                <item
                    android:id="@+id/nav_section_1"
                    android:icon="@drawable/ic_dashboard"
                    android:title="@string/section_1"
                    android:checked="true" /> <!-- default selection -->
                <item
                    android:id="@+id/nav_section_2"
                    android:icon="@drawable/ic_dashboard"
                    android:title="@string/section_2" />
                <item
                    android:id="@+id/nav_section_3"
                    android:icon="@drawable/ic_dashboard"
                    android:title="@string/section_3" />
            </group>
        </menu>
    </item>

    <group> <!-- Finally, no space or title here! -->
        <item
            android:id="@+id/nav_settings"
            android:icon="@drawable/ic_settings"
            android:title="@string/settings" />
        <item
            android:id="@+id/nav_help_feedback"
            android:icon="@drawable/ic_help"
            android:title="@string/help_feedback" />
    </item>
</menu>

这样做会让分隔线上下的项目之间没有空格,但现在顶部还有空格。此外,android:checkableBehavior="single" 的行为很奇怪。第一次选择项目时不会被选中,当其他项目被选中后也无法取消选中。

请查看下面的答案,它完美地适合您。 NaviagtionMenuList Divider - Ness Tyagi
你应该检查你的答案,你有未完成的标签并且不工作。 - Gustavo Baiocchi Costa
2个回答

117

来源:NavigationView: how to insert divider without subgroup?

看起来你只需要给你的group标签分配唯一的ID。

<group android:id="@+id/my_id">
    <!-- Divider will appear above this item -->
    <item ... />
</group>

正如回答所说:

[NavigationView] 在组ID更改时会创建一个分隔线


9
好发现!在这里没找到我的问题。将ID添加到群组中解决了问题。 - Jeff Lockhart
但我想我们不能在组之间应用android:checkableBehavior="single"。哎 - androidguy
@user3175580 我不知道自从你发表这个评论以来是否有任何变化,但根据API,在菜单中支持groups的这种行为:https://developer.android.com/guide/topics/ui/menus.html#groups - Kenny Worden

5
这是你问题的确切解决方案。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <group
        android:id="@+id/menu_top"
        android:checkableBehavior="single">
        <item android:title="Switch Team">
            <menu>
                <item
                    android:id="@+id/team"
                    android:title=""
                    app:actionLayout="@layout/layout_spinner_for_drawer"/>
            </menu>
        </item>
    </group>

    <group
        android:id="@+id/menu_bottom"
        android:checkableBehavior="single">
            <item
                android:id="@+id/nav_home"
                android:icon="@drawable/home"
                android:title="Home" />
            <item
                android:id="@+id/nav_share"
                android:icon="@drawable/sharebox"
                android:title="Sharebox" />
            <item
                android:id="@+id/nav_recognize"
                android:icon="@drawable/recognize"
                android:title="Recognize" />
            <item
                android:id="@+id/nav_contact_us"
                android:icon="@drawable/contactus"
                android:title="Contact Us" />
            <item
                android:id="@+id/nav_logout"
                android:icon="@drawable/signout"
                android:title="Logout" />
    </group>
</menu>

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