L'activité principale de mon application comporte un tiroir de navigation, instancié dans le XML de la manière suivante:
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/application_drawer"
Android:background="@color/white"/>
Maintenant, l'entrée de menu pour le tiroir de navigation est la suivante:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group Android:checkableBehavior="single">
<item
Android:id="@+id/login"
Android:icon="@drawable/ic_action_person"
Android:title="@string/login"/>
<item
Android:id="@+id/settings"
Android:icon="@drawable/ic_action_settings"
Android:title="@string/settings"/>
<item
Android:id="@+id/terms"
Android:icon="@drawable/ic_action_about"
Android:title="@string/terms_and_conditions_menu"/>
<item
Android:id="@+id/about"
Android:icon="@drawable/ic_action_about"
Android:title="@string/info_hotelsclick"/>
</group>
Ce que j'aimerais faire, c'est changer le premier élément (et éventuellement les autres) de manière dynamique dans certaines conditions. Par exemple, j'aimerais modifier l'entrée "Connexion" par une "déconnexion" une fois que l'utilisateur s'est connecté ;-)
Comment puis-je y arriver? J'ai réussi à ajouter un article au tiroir de cette façon
Menu menu = navigationView.getMenu();
menu.add("Test");
mais cela ne me semble pas très bon, je suis presque sûr qu'il doit y avoir une méthode plus propre.
... mais le fait-il?
Je pense que la meilleure approche consiste à inclure tous vos éléments dans le menu et à modifier leur visibilité.
<item
Android:id="@+id/login"
Android:icon="@drawable/ic_action_person"
Android:title="@string/login"
Android:visible="true" />
<item
Android:id="@+id/logout"
Android:icon="@drawable/ic_action_person"
Android:title="@string/logout"
Android:visible="false" />
puis
navigationView.getMenu().findItem(R.id.login).setVisible(false);
navigationView.getMenu().findItem(R.id.logout).setVisible(true);
Vous pouvez également le faire avec des groupes entiers d'éléments
<group
Android:id="@+id/group_1"
Android:checkableBehavior="single"
Android:visible="false">
...
</group>
et
navigationView.getMenu().setGroupVisible(R.id.group_1, true)
Solution simple:
Ajoutez deux fichiers XML dans le répertoire du menu:
navigation_with_login.xml
Menu de navigation pour les utilisateurs connectés
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group Android:checkableBehavior="single">
<item
Android:id="@+id/nav_camera"
Android:icon="@drawable/ic_menu_camera"
Android:title="Import" />
<item
Android:id="@+id/nav_gallery"
Android:icon="@drawable/ic_menu_gallery"
Android:title="Gallery" />
<item
Android:id="@+id/nav_slideshow"
Android:icon="@drawable/ic_menu_slideshow"
Android:title="Slideshow" />
<item
Android:id="@+id/nav_login"
Android:icon="@drawable/ic_menu_login"
Android:title="Login" />
</group>
</menu>
navigation_with_logout.xml
Menu de navigation pour l'utilisateur par défaut:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group Android:checkableBehavior="single">
<item
Android:id="@+id/nav_camera"
Android:icon="@drawable/ic_menu_camera"
Android:title="Import" />
<item
Android:id="@+id/nav_gallery"
Android:icon="@drawable/ic_menu_gallery"
Android:title="Gallery" />
<item
Android:id="@+id/nav_slideshow"
Android:icon="@drawable/ic_menu_slideshow"
Android:title="Slideshow" />
<item
Android:id="@+id/nav_logout"
Android:icon="@drawable/ic_menu_logout"
Android:title="Logout" />
</group>
</menu>
Vous pouvez maintenant modifier les éléments NavigationView
, écrivez simplement quelques lignes de code.
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
if(islogin)
{
navigationView.getMenu().clear();
navigationView.inflateMenu(R.menu.navigation_with_login);
} else
{
navigationView.getMenu().clear();
navigationView.inflateMenu(R.menu.navigation_with_logout);
}
D'abord, obtenez le menu de navigation
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
Menu menu = navigationView.getMenu();
Pour ajouter le menu dynamiquement
if(loggedOut){
menu.add(R.id.submenu_others, R.id.action_logout, Menu.NONE, "logout");
}
Voici menu.add (groupId, menuItemId, orderOfMenu, texte de menuItem)
if(loggedIn){
menu.removeItem(R.id.action_logout);
}
Je l'ai fait, essayez ceci quand vous devez changer le titre:
navigationView.getMenu().findItem(R.id.yourItemId).setTitle("my title");
J'espère que ça a aidé!