2015-06-26 54 views
8

我有這樣的佈局:動態菜單中NavigationView

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <!-- The ActionBar --> 
    <include 
     layout="@layout/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <!-- The main content view --> 
    <FrameLayout 
     android:id="@+id/flContent" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</LinearLayout> 

<!-- The navigation drawer --> 
<android.support.design.widget.NavigationView 
    android:id="@+id/nvView" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="@android:color/white" 
    app:menu="@menu/drawer_menu" 
    app:headerLayout="@layout/nav_header"/> 

所以,看在NavigationView我們有屬性:

app:menu="@menu/drawer_menu" 

而且我有這個XML ID菜單文件夾。

我想製作dinamicament菜單,即在代碼中,我應該安裝'MenuItem'對象並將其設置爲NavigationView

這是正確的? 這是最好的實踐嗎? 這可能嗎?

注意:我的代碼與static drawer_menu一起工作,我想改進它。

我在等。

[編輯]

我做它:

Menu menu = nvDrawer.getMenu(); 
     for (KSMenuItem kmi : menus.values()) { 
      if (menu.size() == 0) { 
       menu.add(kmi.getId()); 
      } 
      if (menu.getItem(kmi.getId()) == null) { 
       menu.add(kmi.getId()); 
      } 
      MenuItem mi = menu.getItem(kmi.getId()); 
      mi.setIcon(kmi.getIcon()); 
      mi.setTitle(kmi.getTittle()); 
     } 

但這個錯誤發生了:

06-27 15:26:15.538 15335-15335 /? E/AndroidRuntime:致命例外:main 進程:com.example.sticdev30.newdrawer,PID:15335 java.lang.RuntimeException:無法啓動活動ComponentInfo {com.example.sticdev30.newdrawer/com.example.sticdev30.newdrawer .MainActivity}:android.content.res.Resources $ NotFoundException:字符串資源ID#0x1

KSMenuItem是一個包含我的菜單數據的POJO。在kmi.id我告訴增量整數...

我waitning

+1

結帳我的答案在這裏:http://stackoverflow.com/a/30706233/3544839 – Moinkhan

+1

請參閱我的編輯。 –

回答

1

似乎kmi.getId()返回int(或long)。

Menu.add(int)添加了來自給定字符串資源的標題的菜單,該資源通常表示爲R.string.something,而不是用於通常的整數值。

Menu.add(CharSequence)確實與CharSequence的標題添加菜單,所以你需要做一些INT-到字符串的轉換像menu.add(kmi.getId() + "");

11

您可以通過以下步驟動態地添加菜單:

第一步。從導航視圖中獲取菜單對象NavigationView.getMenu()

Step2。添加任何項目到菜單使用Menu.add()

+0

請參閱我的編輯。 –

+0

方法[Menu.add(int)](http://developer.android.com/reference/android/view/Menu.html#add(int))需要一個字符串資源ID。從日誌結帳第五行,它說沒有找到資源(字符串資源)。 –

30

您可以用公共的方法inflateMenu兩行代碼在運行時再充氣NavigationView。在這個例子中,我重新使用new_navigation_drawer_items.xml

navigationView.getMenu().clear(); //clear old inflated items. 
navigationView.inflateMenu(R.menu.new_navigation_drawer_items); //inflate new items. 
2

我們可以動態添加/刪除菜單項。 假設我們有這樣的菜單項`

<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/nav_home" 
     android:icon="@mipmap/home_icon_x48" 
     android:title="Home" /> 
    <item 
     android:id="@+id/nav_part_catalouge" 
     android:icon="@mipmap/catalogue_icon_x48" 
     android:title="Parts Catalogue" /> 
    <item 
     android:id="@+id/nav_favourite" 
     android:icon="@mipmap/my_favourate_x48" 
     android:title="My-Favourite" />\ 
    <item 
     android:id="@+id/nav_opencarrequest" 
     android:icon="@mipmap/cart_request" 
     android:title="Cart-Request" /> 

    <item 
     android:id="@+id/nav_setting" 
     android:icon="@mipmap/settings_x48" 
     android:title="Settings" /> 
</group> 


<item android:title=""> 
    <menu> 
     <item 
      android:id="@+id/nav_logout" 
      android:icon="@mipmap/logout_icon_x48" 
      android:title="Logout" /> 
    </menu> 
</item> 

`

在活動,我們可以添加或刪除基於我們條件的菜單項

protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);// your activity layout here 
    NavigationView navigationView= (NavigationView) findViewById(R.id.nav_view); // navigation view which holds menu items 
    navigationView.setNavigationItemSelectedListener(this); 
    if(yourCondition){ 
      navigationView.getMenu().getItem(0).setVisible(false); //if you want to hide first item 
      navigationView.getMenu().getItem(1).setVisible(true); // if you want to show second menu item should be visible 
    } 


} 

希望這將有助於。