私のアプリのメインアクティビティには、次のように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");
しかし、それは私にはそれほど良く聞こえません、私はかなりきれいな方法があるに違いないと確信しています。
...しかしそれは?
これに対する最善のアプローチは、すべてのアイテムをメニューに含め、それらの可視性を変更することです。
<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)
簡単なソリューション:
メニューディレクトリに2つのxmlファイルを追加します。
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>
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);
}
最初にナビゲーションメニューを取得
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);
}
タイトルを変更する必要があるときにこれを試してください:
navigationView.getMenu().findItem(R.id.yourItemId).setTitle("my title");
お役に立てば幸いです!