如何以编程方式将新的子菜单项添加到新的材料deviseandroid支持库

我正在尝试将新的菜单项添加到新的“材质devise”抽屉面板的子菜单中。

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> ... <android.support.design.widget.NavigationView android:id="@+id/main_navigation" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/channel_list_header" app:menu="@menu/menu_nav" /> </android.support.v4.widget.DrawerLayout> 

我有@菜单/ menu_nav设置,但现在想添加新的菜单项:

 NavigationView mDrawerList = (NavigationView) findViewById(R.id.main_navigation); Menu menu = mDrawerList.getMenu(); Menu topChannelMenu = menu.addSubMenu("Top Channels"); topChannelMenu.add("Foo"); topChannelMenu.add("Bar"); topChannelMenu.add("Baz"); mDrawerList.invalidate(); // Trying to force a redraw, doesn't help. 

显示@ menu / menu_nav文件中的菜单项,但是新添加的项不是。 任何想法如何做到这一点?

[更新20-03-2016] Bug已解决。 所以不用担心

[这个下面的话已经过时了。]

向NavigationView添加一个dynamic菜单目前是devise支持库上的错误我已经报告给android bug源跟踪 。 所以等到bug修复。 但如果你想要临时解决scheme,你可以做到这一点。 首先添加您的dynamic菜单..

  navView = (NavigationView) findViewById(R.id.navView); Menu m = navView.getMenu(); SubMenu topChannelMenu = m.addSubMenu("Top Channels"); topChannelMenu.add("Foo"); topChannelMenu.add("Bar"); topChannelMenu.add("Baz"); 

添加菜单后只需写下面的代码

  MenuItem mi = m.getItem(m.size()-1); mi.setTitle(mi.getTitle()); 

这是目前哈克解决scheme。 但是为我工作…

[更新26-06-2015]

正如我在Android Bug源中报告这个错误现在的Bug被标记为将来的版本 ,这里是链接https://code.google.com/p/android/issues/detail?id=176300

所以我们可以说未来的图书馆不存在这个bug。 所以你不必使用棘手的解决scheme。 当未来的版本号是这个bug的主要时候,我也会再次更新这个答案。

您可以通过更改可见性来添加和删除导航视图中的项目。 获取索引和setVisible项目为true显示和false来隐藏它。

 MenuItem item = navigationView.getMenu().getItem(3); item.setVisible(false); 

我发现更简单的方法来改变导航视图(与子菜单和菜单工作)。 您可以在运行时用两行代码重新填充NavigationView 。 在这个例子中,我使用公共方法inflateMenu重新new_navigation_drawer_items.xml充气(你可以用你的新子菜单创build一个菜单xml文件)

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

使用此方法添加菜单和子菜单

 private void addItemsRunTime(NavigationView navigationView) { //adding items run time final Menu menu = navigationView.getMenu(); for (int i = 1; i <= 3; i++) { menu.add("Runtime item "+ i); } // adding a section and items into it final SubMenu subMenu = menu.addSubMenu("SubMenu Title"); for (int i = 1; i <= 2; i++) { subMenu.add("SubMenu Item " + i); } // refreshing navigation drawer adapter for (int i = 0, count = mNavigationView.getChildCount(); i < count; i++) { final View child = mNavigationView.getChildAt(i); if (child != null && child instanceof ListView) { final ListView menuView = (ListView) child; final HeaderViewListAdapter adapter = (HeaderViewListAdapter) menuView.getAdapter(); final BaseAdapter wrapped = (BaseAdapter) adapter.getWrappedAdapter(); wrapped.notifyDataSetChanged(); } } } 

并在您设置抽屉内容的地方调用此方法。

这是我如何操纵NavigationView中的子菜单项

1)创buildmenu.xml文件

 <?xml version="1.0" encoding="utf-8" ?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:title="Index:" android:id="@+id/mnugrp_Index"> <menu> <!--This line below is dump line for rendering dynamic sub-menu item--> <item android:icon="@drawable/ic_action_content_create" android:title="Sub item 1" /> </menu> </item> </group> <group android:id="@+id/mnugrp_Attachment" android:checkableBehavior="single"> <item android:title="Attachment:" android:id="@+id/mnugrp_Attachment"> <menu> <!--This line below is dump line for rendering dynamic sub-menu item--> <item android:icon="@drawable/ic_action_content_create" android:title="Sub item 1" /> </menu> </item> </group> </menu>