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

How to add submenu items to NavigationView programmatically instead of menu xml

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

有人找到了一种通过反射和访问私有字段来实现的方法。它不是很漂亮,但它会工作,目前。

调用 BaseAdapter.notifyDataSetChanged on the underlying Adapter that contains the menu items. You could use reflection to grab the ListView or just loop over the NavigationView children 直到你到达它的技巧。

这不是最多的 up-to-date 代码,据我所知 Google 没有将最新的更改推送到支​​持库,但本质上 NavigationMenuPresenter.prepareMenuItems 被调用当你打电话给 BaseAdpater.notifyDataSetChanged.

但是如果你想看最新的源码,你可以通过SDK管理器下载。为 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();
        }
    }

}

结果