2015-06-18 71 views
40

我的應用程序的主要活動是抽屜式導航,這種方式在XML實例:變化NavigationView項目

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

我希望做的是改變的第一項(也可能是其他人也)動態地在某些條件下。例如,我想在用戶登錄後用「註銷」一項更改「登錄」條目;-)

我該如何實現這一目標?我設法以這種方式添加一個項目到抽屜

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

但它聽起來對我來說並不好,我敢肯定,必須有一個更清潔的方式。

...但是呢?

+0

調用該方法以更新值再次設置抽屜。 – Harry

回答

83

我最好的辦法是在菜單中包含所有項目並更改其可見性。

<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

它的作品,但空間remails,因此,任何想法如何刪除空間? –

+1

很好的回答!我認爲很少有關於NavigationView的實用信息。 – hata

+4

改爲使用navigationView.getMenu()。findItem(R.id.login).setVisibility(View.GONE)和setVisibility(View.VISIBLE),以便不可見的UI元素不佔用空間。 –

1

我把它做了,試試這個,當你需要更改標題:

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

希望它幫助!

+1

這當然會起作用,但我還需要更改相關操作和圖標......我寧願使用Lamorak在下面提供的顯示/隱藏解決方案。不管怎樣,謝謝你! :-) –

43

簡單的解決方案的整個羣體做到這一點:
在菜單目錄添加兩個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); 
    } 
+0

這是正確的答案 – Odaym

+0

謝謝** Odaym ** –

+0

這是最好的解決方案! –

2

FRST得到navigationmenu

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,菜單項文本)

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