如何以编程方式将子菜单项而不是菜单添加到 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();
}
}
}
结果
我正在尝试以编程方式将 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();
}
}
}
结果