【问题标题】:How to programmaticallly remove submenu from navigation drawer in Android?如何以编程方式从 Android 的导航抽屉中删除子菜单?
【发布时间】:2018-04-05 03:35:25
【问题描述】:

我正在开发一个 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 子菜单,但没有删除现有的子菜单。

【问题讨论】:

  • MenuItem item = navigationView.getMenu().getItem(3); item.setVisible(false);这个可以解决你在stackoverflow.com/questions/30695038/…的问题吗
  • 仅仅设置可见性对性能没有好处。它会消耗如此多的内存。
  • navigationView.getMenu().clear(); //清除旧的膨胀项目。 navigationView.inflateMenu(R.menu.new_navigation_drawer_items);或者你可以清除它而不是重新创建
  • 调用menu.removeItem(R.id.registerId)删除之前添加的SubMenu,然后添加新的SubMenu

标签: android navigation-drawer android-navigationview


【解决方案1】:

试试

authSubMenu.clear();

在你第一次之前

authSubMenu.add();

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

这与您的情况不同,其中authSubMenu 是您刚刚通过menu.addSubMenu("Auth") 添加的菜单,因此您会认为它是空的。但是,正如您所见,它显然不是空的:相反,addSubMenu("Auth") 返回该标题的现有子菜单。 (我找不到这方面的文档;我只是根据您报告的结果来判断。)

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这将删除导航视图中的主菜单。不是子菜单。
    • 是的,对不起,我想说的是菜单和子菜单。重读您的问题,我看到您只想删除子菜单项,那么清除菜单并重新创建子菜单元素呢?
    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多