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)?
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
.
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.
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>
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.
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.
J'ai eu le même problème et j'ai constaté que NavigationView
se comporte différemment selon:
Android:title
et Android:icon
sur item
ou nonTextView
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:
(Ceci est avec la version 27.1.1 de com.Android.support:design
, pas sûr des autres versions.)