如何为一个操作栏菜单组设置可见性?

11

更新

最初我使用的是ActionBarSherlock,后来我创建了一个全新的项目,使用原生的Android action bar进行测试,但仍然遇到同样的问题。

我已经成功地显示/隐藏了项目,但无法显示/隐藏组。我很快得出结论:ActionBar中存在一个bug,因此无法通过编程方式设置组的可见性。

更新结束

给定以下菜单,访问该组时会导致空指针异常。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@+id/action_settings"
        android:title="@string/settings"
        android:orderInCategory="100"
        android:showAsAction="never"/>

        <group android:id="@+id/mnu_text_group"
           android:visible="false">
            <item android:id="@+id/mnu_text_type"
                android:enabled="true" 
                android:visible="true"
                android:icon="@drawable/ic_action_text_icon"
            android:showAsAction="always"> 
            </item>
            <item android:id="@+id/text_color"
                android:enabled="true" 
                android:visible="true" 
                android:showAsAction="always" 
                android:icon="@drawable/ic_action_color_line">
            </item>
        </group>        
    <item android:id="@+id/mnu_images"
...

在相关活动的onPrepareOptionsMenu中,我有

public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem mnuTextGroup = menu.findItem(R.id.mnu_text_group);
    mnuImage.setEnabled(mEnableImageMenu);
    mnuTextGroup.setVisible(false);
    ...

调用 mnuTextGroup.setVisible(false); 引发了空指针异常。

然而,通过更改查找方法以查找组内的项目可以正常工作,例如:MenuItem mnuTextGroup = menu.findItem(R.id.mnu_text_type); 但这显然仅适用于特定项目。 我知道组的设计目的就是为了能够以编程方式设置组内所有项目的可见性和启用/禁用,但我一直无法找到一种实现它的方法。

4个回答

41

终于找到了解决方案:我需要使用传入 onPrepareOptionsMenu() 方法的菜单对象的 setGroupVisible() 方法。

以下是对我有效的代码:

不要再使用

MenuItem mnuTextGroup = menu.findItem(R.id.mnu_text_group);
mnuImage.setEnabled(mEnableImageMenu);
mnuTextGroup.setVisible(false);

这正是我所需要的

menu.setGroupVisible(R.id.mnu_text_group, false);

4

简单且一行代码

navigationView.getMenu().setGroupVisible(R.id.groupstaff, false);

0

修改选项菜单需要在onPrepareOptionsMenu中完成,否则有时会无法正常工作(不确定原因,希望其他人能够详细说明):

@Override public boolean onPrepareOptionsMenu(Menu menu) {
  super.onPrepareOptionsMenu(menu);
  // set visibility of menu items here
  return true;
}

0

在需要隐藏的Activity中使用

@Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getSupportMenuInflater().inflate(R.menu.main_itemlist, menu);
        boolean isdown = false;

        menu.findItem(R.id.addwork).setVisible(isdown);

        MenuItem mnuTextGroup = menu.findItem(R.id.mnu_text_group);
            mnuTextGroup.setVisible(isdown);

        return true;
    }

不行,仍然出现空指针异常。真的不明白为什么你会认为使用布尔变量而不是硬编码false可以防止mnuTextGroup变量的空指针异常。 - jamesc
它在我的情况下工作。我不明白为什么你会得到空指针异常。 - Subhalaxmi
也许你可以分享一下你的应用程序代码?我完全没能做到这个,我想看一个这个工作的项目。 - jamesc
对我来说,menu.setGroupVisible() 没有起作用,但是这个方法可以。 - Avamander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接