如何以编程方式从 Android 中的导航抽屉中删除子菜单?
How to programmaticallly remove submenu from navigation drawer in Android?
我正在开发 Android 应用程序。首先声明我不专业。我现在正在做的是根据条件向菜单添加子菜单。但我需要在我的应用程序中经常这样做。但我的问题是我第一次在菜单中添加了一个子菜单。
但是第二次当我根据条件更新菜单时,现有的子菜单没有被删除,新的子菜单被附加到导航抽屉。如何删除以编程方式添加到菜单的子菜单?为什么我的代码没有删除它?
这是我的代码
public void updateAuthUI()
{
isLoggedIn = tempStorage.getBoolean(getResources().getString(R.string.pref_is_logged_in),false);
Menu menu = leftDrawer.getMenu();
menu.removeItem(getResources().getInteger(R.integer.logout_item_id));
menu.removeItem(getResources().getInteger(R.integer.login_item_id));
menu.removeItem(getResources().getInteger(R.integer.register_item_id));
SubMenu authSubMenu = menu.addSubMenu("Auth");
if(isLoggedIn)
{
authSubMenu.add(1,getResources().getInteger(R.integer.logout_item_id),99,"Sign out");
}
else{
authSubMenu.add(1,getResources().getInteger(R.integer.register_item_id),97,"Register");
authSubMenu.add(1,getResources().getInteger(R.integer.login_item_id),98,"Sign in").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
openLoginActivity();
item.setChecked(true);
return true;
}
});
}
}
这是我的问题的截图
如您所见,在未删除现有子菜单的情况下附加了 Auth 子菜单。
正如@slymm 在评论中所说,您可以使用
删除所有菜单和子菜单项
navigationView.getMenu().clear();
这可用于删除子菜单(和菜单元素),然后使用新的必需项目重新创建它们
尝试
authSubMenu.clear();
在你第一次
之前
authSubMenu.add();
我刚刚在 Android 应用程序中使用了 SubMenu.clear()
,其中我使用了 third-party 库,我需要从操作栏中清除不需要的子菜单。 (我实际上想完全删除子菜单,这是我能找到的唯一方法。它似乎有效。)
这与您的情况不同,authSubMenu
是您刚刚通过 menu.addSubMenu("Auth")
添加的菜单,因此您会认为它是空的。但是,如您所见,它显然不是空的:而是 addSubMenu("Auth")
returns 该标题的现有子菜单。 (我找不到这方面的文档;我只是根据您报告的结果进行分析。)
如果确实如此,那么 authSubMenu.clear()
将从子菜单中删除所有现有项目。
我正在开发 Android 应用程序。首先声明我不专业。我现在正在做的是根据条件向菜单添加子菜单。但我需要在我的应用程序中经常这样做。但我的问题是我第一次在菜单中添加了一个子菜单。
但是第二次当我根据条件更新菜单时,现有的子菜单没有被删除,新的子菜单被附加到导航抽屉。如何删除以编程方式添加到菜单的子菜单?为什么我的代码没有删除它?
这是我的代码
public void updateAuthUI()
{
isLoggedIn = tempStorage.getBoolean(getResources().getString(R.string.pref_is_logged_in),false);
Menu menu = leftDrawer.getMenu();
menu.removeItem(getResources().getInteger(R.integer.logout_item_id));
menu.removeItem(getResources().getInteger(R.integer.login_item_id));
menu.removeItem(getResources().getInteger(R.integer.register_item_id));
SubMenu authSubMenu = menu.addSubMenu("Auth");
if(isLoggedIn)
{
authSubMenu.add(1,getResources().getInteger(R.integer.logout_item_id),99,"Sign out");
}
else{
authSubMenu.add(1,getResources().getInteger(R.integer.register_item_id),97,"Register");
authSubMenu.add(1,getResources().getInteger(R.integer.login_item_id),98,"Sign in").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
openLoginActivity();
item.setChecked(true);
return true;
}
});
}
}
这是我的问题的截图
如您所见,在未删除现有子菜单的情况下附加了 Auth 子菜单。
正如@slymm 在评论中所说,您可以使用
删除所有菜单和子菜单项navigationView.getMenu().clear();
这可用于删除子菜单(和菜单元素),然后使用新的必需项目重新创建它们
尝试
authSubMenu.clear();
在你第一次
之前authSubMenu.add();
我刚刚在 Android 应用程序中使用了 SubMenu.clear()
,其中我使用了 third-party 库,我需要从操作栏中清除不需要的子菜单。 (我实际上想完全删除子菜单,这是我能找到的唯一方法。它似乎有效。)
这与您的情况不同,authSubMenu
是您刚刚通过 menu.addSubMenu("Auth")
添加的菜单,因此您会认为它是空的。但是,如您所见,它显然不是空的:而是 addSubMenu("Auth")
returns 该标题的现有子菜单。 (我找不到这方面的文档;我只是根据您报告的结果进行分析。)
如果确实如此,那么 authSubMenu.clear()
将从子菜单中删除所有现有项目。