NavigationView中的dynamic菜单

我有这个布局:

<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:致命exception:主进程:com.example.sticdev30.newdrawer,PID:15335 java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.sticdev30.newdrawer / com.example.sticdev30.newdrawer.MainActivity }:android.content.res.Resources $ NotFoundException:string资源ID#0x1

KSMenuItem是我的菜单数据的POJO。 在kmi.id我通知增量整数…

我在等

Solutions Collecting From Web of "NavigationView中的dynamic菜单"

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

但是Menu.add(int)添加了来自给定string资源的标题菜单,通常表示为R.string.something ,而不是用于通常的整数值。

Menu.add(CharSequence)确实添加了带有CharSequence标题的菜单,所以你需要做一些int到string的转换,比如menu.add(kmi.getId() + "");

您可以使用公共方法inflateMenu在运行时用两行代码重新inflateMenu 。 在这个例子中,我用new_navigation_drawer_items.xml重新充气

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

您可以通过以下步骤dynamic添加菜单:

步骤1。 从导航视图中获取菜单对象NavigationView.getMenu()

第2步。 使用Menu.add()添加任何项目到菜单