web-dev-qa-db-fra.com

Comment puis-je ajouter un élément personnalisé à un NavigationView avec une disposition de menu?

J'ai essayé de simplifier certains codes de tiroir de navigation en utilisant la nouvelle classe NavigationView dans la bibliothèque de prise en charge de la conception Android. Cela fonctionne très bien si vous voulez simplement des icônes à gauche et du texte à droite, comme dans l'exemple de la documentation. Mais si je veux ajouter un seul affichage personnalisé à la mise en page qui a un Android.support.v7.widget.SwitchCompat comme dans l'application Google Play Films (voir capture d'écran ci-dessous)?

Google Play Movies

J'ai essayé d'utiliser l'attribut actionLayout pour spécifier un fichier de présentation personnalisé, comme dans l'exemple de code ci-dessous. Cependant, cet attribut semblait être ignoré car il ne fonctionnait pas.

res/menu/navigation_drawer.xml

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <group Android:id="@+id/group1"
            Android:checkableBehavior="single">
        <item
            Android:id="@+id/nav_screen1"
            Android:icon="@drawable/ic_list_black_24dp"
            Android:title="Screen 1" />
        <item
            Android:id="@+id/nav_screen2"
            Android:icon="@drawable/ic_search_black_24dp"
            Android:title="Screen2"/>
    </group>
    <group  Android:id="@+id/group2">
        <item
            Android:id="@+id/nav_custom"
            Android:icon="@drawable/custom_icon_24dp"
            app:actionLayout="@layout/nav_drawer_switch"
            Android:title="Custom item with switch"/>
        <item
            Android:id="@+id/nav_settings"
            Android:icon="@drawable/ic_settings_black_24dp"
            Android:title="Settings"/>
    </group>
</menu>

res/layout/nav_drawer_switch.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="horizontal" Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <Android.support.v7.widget.SwitchCompat
        Android:layout_width="fill_parent"
        Android:layout_height="match_parent"
        Android:text="Custom item with switch"/>
</LinearLayout>

Comment puis-je obtenir que cela fonctionne? Idéalement, j'aimerais ajouter la vue personnalisée tout en continuant d'utiliser la disposition de mon menu, mais si cela n'est pas possible sans utiliser un piratage grossier (comme pour accéder à une disposition existante générée par la bibliothèque de support), j'aimerais connaître solution avec le moins de code possible, ce qui le rend tout de même digne de passer à NavigationView.

46
Tim Rae

L'attribut actionLayout est est maintenant pris en charge dans Android Support Library 23.1 :

NavigationView fournit un moyen pratique de créer un tiroir de navigation, y compris la possibilité de créer des éléments de menu à l'aide d'un fichier XML de menu. Nous avons étendu les fonctionnalités possibles avec la possibilité de définir des vues personnalisées pour les éléments via app: actionLayout ou à l'aide de MenuItemCompat.setActionView ().

Le code de la question devrait donc fonctionner maintenant.

32
Tim Rae

NavigationView est une sous-classe de FrameLayout, qui peut avoir plusieurs enfants:

Vous pouvez cependant ajouter plusieurs enfants à un FrameLayout et à un contrôle leur position dans FrameLayout en attribuant la gravité à chacun child, en utilisant l'attribut Android: layout_gravity.

Cela signifie que vous pouvez ajouter une vue personnalisée à votre NavigationView:

<Android.support.design.widget.NavigationView
    Android:layout_height="match_parent"
    Android:layout_width="wrap_content"
    Android:layout_gravity="start"
    Android:fitsSystemWindows="true"
    app:menu="@menu/side_menu">

    <LinearLayout 
        Android:orientation="horizontal" 
        Android:layout_width="match_parent"
        Android:layout_height="200dp"
        Android:layout_gravity="bottom">

        <Android.support.v7.widget.SwitchCompat
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:text="night_mode"/>
    </LinearLayout>
</Android.support.design.widget.NavigationView>
14
Vera Rivotti

créez une mise en page avec switchcompat et mentionnez-la dans le menu

<item Android:id="@+id/notification"
        Android:title="Notification"
        app:actionLayout="@layout/notify" />`

puis notifier la mise en page ajouter ceci

<Android.support.v7.widget.SwitchCompat
    Android:id="@+id/switch_compat"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="10dp"
    Android:checked="false"
    Android:onClick="notify"/>

onclick est le keyPoint, gestionnaire d'implémentation dans votre activité, puis il fonctionnera.

5
Ramesh Bhupathi

Vous voudrez peut-être consulter cette bibliothèque: https://github.com/mikepenz/MaterialDrawer . Il facilite l'utilisation du tiroir de navigation et prend en charge les vues personnalisées.

0
Loša

J'ai eu le même problème et j'ai constaté que NavigationView se comporte différemment selon:

  • Si vous définissez les attributs Android:title et Android:icon sur item ou non
  • Quel type de vue contient votre mise en page d'action (par exemple, TextView ou autre)

Ne pas définir les attributs a fonctionné pour personnaliser complètement l'élément:

<?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"
    xmlns:tools="http://schemas.Android.com/tools"
    tools:showIn="navigation_view">

    <item
        Android:id="@+id/nav_custom"
        Android:title="@null"
        app:actionLayout="@layout/nav_drawer_switch" />
</menu>

(Notez que vous pouvez également ne pas définir Android:title, mais cela entraîne un avertissement dans Android Studio.)

Le résultat:

 navigation view with switch as custom action layout

(Ceci est avec la version 27.1.1 de com.Android.support:design, pas sûr des autres versions.)

0
robinst