用户login时更改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> 

我想要做的是在某些条件下dynamic更改第一个项目(也可能是其他项目)。 例如,我想在用户login后更改“login”条目的“login”条目;-)

我怎样才能做到这一点? 我设法以这种方式添加一个项目到抽屉里

  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) 

简单的scheme:
在菜单目录中添加两个xml文件:

  1. navigation_with_login.xmllogin用户的导航菜单

     <?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); } 

首先得到导航菜单

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

要dynamic添加菜单

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

这里是menu.add(groupId,menuItemId,orderOfMenu,menuItem文本)

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

我完成了,当你需要改变标题时试试这个:

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

希望它有帮助!