如何以程序方式从Android中的导航抽屉中删除子菜单?

时间:2016-03-08 12:11:25

标签: android android-navigation-drawer android-navigationview

我正在开发一款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;
                }
            });
        }
    }

以下是我的问题的截图

enter image description here

如您所见,可以在不删除现有子菜单的情况下附加Auth子菜单。

2 个答案:

答案 0 :(得分:4)

尝试

authSubMenu.clear();
在你第一次

之前

authSubMenu.add();

我刚刚在我使用第三方库的Android应用中使用SubMenu.clear(),我需要从操作栏中清除不需要的子菜单。 (我实际上想完全删除子菜单,这是我能找到它的唯一方法。它似乎有效。)

这与您的情况不同,authSubMenu是您刚刚通过menu.addSubMenu("Auth")添加的菜单,因此您可能会认为它是空的。但是,正如您所见,它显然不是空的:相反,addSubMenu("Auth")返回该标题的现有子菜单。 (我找不到那种效果的文档;我只是按照你报告的结果去做。)

如果确实如此,那么authSubMenu.clear()将从子菜单中删除所有现有项目。

答案 1 :(得分:0)

正如@slymm在评论中所说,您可以使用

删除所有菜单和子菜单项
navigationView.getMenu().clear();

这可用于删除子菜单(和菜单元素),然后使用新的必需项重新创建它们