web-dev-qa-db-ja.com

ユーザーがログインしているときにNavigationViewアイテムを変更する

私のアプリのメインアクティビティには、次のようにXMLでインスタンス化されたナビゲーションドロワーがあります。

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

ナビゲーションドロワーのメニューエントリは次のとおりです。

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

私がしたいのは、ある条件下で最初のアイテム(そしておそらく他のアイテムも)を動的に変更することです。たとえば、ユーザーがログインしたら、「Login」エントリを「logout」エントリに変更します;-)

どうすればそれを達成できますか?このようにして、なんとか引き出しにアイテムを追加できました

    Menu menu = navigationView.getMenu();
    menu.add("Test");

しかし、それは私にはそれほど良く聞こえません、私はかなりきれいな方法があるに違いないと確信しています。

...しかしそれは?

51
Marco Zanetti

これに対する最善のアプローチは、すべてのアイテムをメニューに含め、それらの可視性を変更することです。

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

それから

navigationView.getMenu().findItem(R.id.login).setVisible(false);
navigationView.getMenu().findItem(R.id.logout).setVisible(true);

アイテムのグループ全体でこれを行うこともできます

<group
    Android:id="@+id/group_1"
    Android:checkableBehavior="single"
    Android:visible="false">
    ...
</group>

そして

navigationView.getMenu().setGroupVisible(R.id.group_1, true)
99
Lamorak

簡単なソリューション:
メニューディレクトリに2つのxmlファイルを追加します。

  1. navigation_with_login.xmlログインしているユーザーのナビゲーションメニュー

    <?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デフォルトユーザーのナビゲーションメニュー:

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

これで、NavigationViewアイテムを変更でき、数行のコードを書くだけです。

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

最初にナビゲーションメニューを取得

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
Menu menu = navigationView.getMenu();

メニューを動的に追加するには

 if(loggedOut){
        menu.add(R.id.submenu_others, R.id.action_logout, Menu.NONE, "logout");
}

ここにmenu.add(groupId、menuItemId、orderOfMenu、menuItem text)があります

     if(loggedIn){
        menu.removeItem(R.id.action_logout);
}
3
yubaraj poudel

タイトルを変更する必要があるときにこれを試してください:

navigationView.getMenu().findItem(R.id.yourItemId).setTitle("my title");

お役に立てば幸いです!

2
Harry