用户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文件:
-
navigation_with_login.xml
login用户的导航菜单<?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();
要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");
希望它有帮助!