如何以编程方式禁用我的活动中的所有菜单项

时间:2009-12-16 07:30:08

标签: android

在android中,我创建了这样的菜单项?

public boolean onCreateOptionsMenu(Menu menu) {

        menu.add(0, 0, 0, "Menu1");
        menu.add(0, 1, 0, "Menu2");
        return true;
}

如何设置所有菜单项以程序方式禁用(在我的活动中的代码的另一部分,而不是onCreateOptionsMenu()方法本身)?

谢谢。

5 个答案:

答案 0 :(得分:9)

您可以使用{I}设置的groupId一次禁用/启用所有菜单项。因此,例如,由于您将项目添加到组0,您可以执行以下操作:

menu.setGroupEnabled()

另外,如果要动态修改菜单,则应该挂钩menu.setGroupEnabled(0, false); onPrepareOptionsMenu()仅在每个Activity中调用一次,因此最适合设置初始菜单结构,但是onCreateOptionsMenu()应该用于稍后在Activity中启用/禁用菜单。

答案 1 :(得分:6)

add会返回MenuItem(您也可以从Menu对象中检索),您可以将其存储到变量中。

MenuItem menu1;

public boolean onCreateOptionsMenu(Menu menu) {
    menu1 = menu.add(0, 0, 0, "Menu1");
}

public void someOtherMethod() {
    if(menu1 != null) {
        // if it's null, options menu hasn't been created, so nevermind
        menu1.setEnabled(false);
    }
}

答案 2 :(得分:5)

如果不应该使用它们(而不是禁用它们),我宁愿完全隐藏它们。 为此我做了:

menu.clear();

并重新创建它:

invalidateOptionsMenu();

这也适用于从片段添加的菜单项。

答案 3 :(得分:2)

如果仍然相关:

public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    for(int i=0; i<menu.size(); i++){
        menu.getItem(i).setEnabled(isMenuEnabled);
    }
}

并调用invalidateOptionsMenu()然后更改isMenuEnabled

答案 4 :(得分:0)

如果您想多次使用菜单的所有项目(例如,更改“已检查”状态),可以使用Kotlin Extension Properties解决方案: (建立在answer of Valery之上)

在一处定义android.view.Menu的属性“ items”:

import android.view.Menu
import android.view.MenuItem

val Menu.items: List<MenuItem>
get() {
    val items = mutableListOf<MenuItem>()
    for (i in 0 until this.size()) {
        items.add(this.getItem(i))
    }
    return items
}

现在您可以在任何菜单上使用它:

anyMenu.items.forEach { it.isEnabled = false }