web-dev-qa-db-fra.com

Modifier les éléments NavigationView lorsque l'utilisateur est connecté

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?

51
Marco Zanetti

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)
99
Lamorak

Solution simple:
Ajoutez deux fichiers XML dans le répertoire du menu:

  1. 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>
    
  2. 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);
    }
54
manish jain

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);
}
3
yubaraj poudel

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

2
Harry