Как получить разделители в меню NavigationView без заголовков?

Я использую новый NavigationView для создания меню навигационного ящика из XML. Мне нужно разместить разделитель между пунктами меню разделов, которые переключаются между разделами моего приложения, и настройками и ссылками справки и поддержки внизу.

Во всех примерах, которые я видел, я вижу, как это можно сделать, поместив еще один <menu> в <item>, но <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 использует именно такое поведение в своей спецификации дизайна материалов.

Настройки и поддержка

ИЗМЕНИТЬ:

Еще одна близкая попытка:

<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" ведет себя странно. Элементы не выбираются, когда они выбраны в первый раз, и элементы не снимаются, как только другие становятся выбранными.


person Jeff Lockhart    schedule 11.06.2015    source источник
comment
Проверьте мой ответ ниже, который идеально подходит для вас. РазделительNaviagtionMenuList   -  person Ness Tyagi    schedule 26.10.2016
comment
Вы должны проверить свой ответ, у вас есть незаполненные теги и не работает   -  person Gustavo Baiocchi Costa    schedule 22.12.2017


Ответы (2)


From: NavigationView: как вставить разделитель без подгруппы?

Похоже, вам просто нужно дать своим group тегам уникальные идентификаторы.

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

Как говорится в ответе:

[NavigationView] будет создавать разделитель при каждом изменении идентификатора группы.

person Kenny Worden    schedule 11.06.2015
comment
Хорошая находка! Не удалось найти вопрос здесь с моим поиском. Добавление идентификаторов в группы помогло. - person Jeff Lockhart; 11.06.2015
comment
Но я думаю, мы не можем применять android:checkableBehavior="single" к группам. Вздох - person androidguy; 30.12.2016
comment
@user3175580 user3175580 Я не знаю, изменилось ли что-нибудь с тех пор, как вы опубликовали этот комментарий, но, согласно API, такое поведение поддерживается для groups в меню: developer.android.com/guide/topics/ui/menus.html#groups - person Kenny Worden; 17.07.2017

Это точное решение вашего вопроса здесь.

<?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>
person Sagar Yadav    schedule 13.09.2016