禁用Android菜单组

7

我尝试使用以下代码禁用菜单组,但它不起作用,菜单项仍然启用。你能告诉我哪里出了问题吗?

res/menu/menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/a" android:title="A"></item>
  <item android:id="@+id/b" android:title="B">
    <menu>
      <item android:id="@+id/c" android:title="C" />
      <item android:id="@+id/d" android:title="D" />
      <group android:id="@+id/group_1">
        <item android:id="@+id/e" android:title="E" />
        <item android:id="@+id/f" android:title="F" />
      </group>
    </menu>
  </item>
</menu>

Java:

public boolean onPrepareOptionsMenu (Menu menu) {
    menu.setGroupEnabled (R.id.group_1, false); // does not work
    menu.setGroupVisible (R.id.group_1, false); // does not work either
    return super.onPrepareOptionsMenu (menu);
}

public boolean onCreateOptionsMenu (Menu menu) {
    getMenuInflater ().inflate (R.menu.menu, menu);
    return true;
}
3个回答

22

感谢user432209提供的信息,以下是答案:

menu.findItem (R.id.b).getSubMenu ().setGroupVisible (R.id.group_1, false);

5

我不确定您是否可以使用这样的组,但是可以尝试一下(值得一试):

MenuItem item = menu.findItem(R.id.group_1);
item.setVisible(true);
item.setEnabled(false);

编辑:你的问题在于菜单结构以及如何在onCreateOptionsMenu中创建菜单,因为你使用了父/子菜单。

你为父菜单创建了一个菜单,而不是子菜单,所以调用setGroupEnabledsetGroupVisible失败了。你需要在onCreateOptionsMenu中创建一个代表子菜单的对象,以便将该对象传递到onPrepareOptionsMenu中,并使你的代码正常工作。


我已经添加了它(它没有什么特别的)。 - Patrick
1
为什么这个回答被标记为问题的答案,而它根本行不通呢? - Dandre Allison
你为什么发表了一个错误的答案?这六个赞同应该被取消。 - user9599745

1
上述解决方案效果良好,但应在 onCreateOptionsMenu 中编写,以下是示例:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Inflate the menu
    inflater.inflate(R.menu.menu, menu);

    // Make the menu item visible and enable it.
    MenuItem item = menu.findItem(R.id.group_1);
    item.setVisible(true);
    item.setEnabled(false);
}

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