我正在尝试以编程方式将submenu
项添加到NavigationView
。我可以将项目添加到menu
,但不能添加到submenu
向菜单添加项目
Menu menu = mNavigationView.getMenu();
menu.add(Menu.NONE, Menu.NONE, index, "Menu Item1");
但是将项目添加到子菜单不起作用
Menu menu = mNavigationView.getMenu();
SubMenu subMenu = menu.addSubMenu("Sub menu title");
subMenu.add(Menu.NONE, Menu.NONE, index, "SubMenu Item1");
答案 0 :(得分:12)
在包含菜单项的基础Adapter
上调用BaseAdapter.notifyDataSetChanged
的技巧。您可以使用反射来抓住ListView
或只是覆盖NavigationView
个孩子,直到您到达它。
这不是最新的代码,因为我知道Google没有将最新的更改推送到支持库,但是当你执行时基本上会调用NavigationMenuPresenter.prepareMenuItems
致电BaseAdpater.notifyDataSetChanged
。
但是如果您想查看最新的来源,可以通过SDK Manager下载。选择 Android MNC的来源。然后导航到
yourAndroidSDK/sources/android-MNC/android/support/design/internal/NavigationMenuPresenter.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
final Menu menu = mNavigationView.getMenu();
for (int i = 0; i < 4; i++) {
menu.add("Menu Item " + (i + 1));
}
final SubMenu subMenu = menu.addSubMenu("SubMenu Title");
for (int i = 0; i < 2; i++) {
subMenu.add("SubMenu Item " + (i + 1));
}
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();
}
}
}
<强>结果
答案 1 :(得分:1)
有人想出办法通过反思和访问私人领域来做到这一点。它不漂亮,但目前它可以正常工作。 https://stackoverflow.com/a/30604299/4232051