web-dev-qa-db-fra.com

Comment obtenir des séparateurs dans le menu NavigationView sans titres?

J'utilise le nouveau NavigationView pour créer mon menu de tiroir de navigation à partir de XML. Je dois placer un séparateur entre les éléments de menu de section, qui basculent entre les sections de mon application, et les paramètres et les liens d'aide et de support en bas.

Dans tous les exemples que j'ai vus, je vois comment cela peut être fait en mettant un autre <menu> dans un <item>, mais le <item> nécessite d'avoir le Android:title attribut, donc le mieux que je puisse faire est de rendre le titre vide, ce qui laisse un espace vide avant les paramètres et l'aide et les commentaires.

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

J'ai essayé différentes combinaisons de <menu>, <item> et <group> tags, mais je n'ai rien trouvé qui fonctionne. Cela a par exemple le problème d'utiliser le dernier élément du groupe précédent comme titre de groupe:

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

Il doit simplement y avoir un moyen facile de le faire en utilisant uniquement la description XML du menu. Google a ce comportement dans leurs Material design spec .

Settings and support

MODIFIER:

Encore une autre tentative rapprochée:

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

Cela ne laisse aucun espace entre les éléments au-dessus et en dessous du séparateur, mais il y a toujours de l'espace en haut maintenant. Également Android:checkableBehavior="single" se comporte étrangement. Les éléments ne sont pas sélectionnés lorsqu'ils sont sélectionnés la première fois et les éléments ne sont pas désélectionnés une fois que d'autres sont sélectionnés.

38
Jeff Lockhart

De: NavigationView: comment insérer un séparateur sans sous-groupe?

Il semble que vous ayez juste besoin de donner à vos balises group des ID uniques.

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

Comme le dit la réponse:

[NavigationView] créera un séparateur chaque fois que l'ID de groupe est changé

109
Kenny Worden

C'est la solution exacte pour votre question ici.

<?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>
4
Sagar Yadav