如何以编程方式将子菜单项添加到NavigationView而不是菜单xml

时间:2015-06-03 01:37:20

标签: android android-menu android-design-library

我正在尝试以编程方式将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");

2 个答案:

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

sources

@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();
        }
    }

}

<强>结果

results

答案 1 :(得分:1)

有人想出办法通过反思和访问私人领域来做到这一点。它不漂亮,但目前它可以正常工作。 https://stackoverflow.com/a/30604299/4232051