android:以编程方式更改选项菜单项

Far*_*an 85 java android menuitem option

是否可以通过编程方式更改选项菜单项?有人可以给我一个例子吗?

此外,我想禁用某些项目,以便他们不听取点击,是否可能?

Eng*_*uad 204

任何人都需要动态更改菜单的选项:

private Menu menu;

// ...

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    this.menu = menu;
    getMenuInflater().inflate(R.menu.options, menu);
    return true;
}

// ...

private void hideOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(false);
}

private void showOption(int id)
{
    MenuItem item = menu.findItem(id);
    item.setVisible(true);
}

private void setOptionTitle(int id, String title)
{
    MenuItem item = menu.findItem(id);
    item.setTitle(title);
}

private void setOptionIcon(int id, int iconRes)
{
    MenuItem item = menu.findItem(id);
    item.setIcon(iconRes);
}
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的是,在尝试从中获取"MenuItem"之前,必须确保已经设置了`menu`.例如,如果你有类似`actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)`的东西,则在菜单之前加载选项卡,因此在`onTabSelected`中调用`hideOption` /`showOption`会导致空指针异常. (8认同)
  • 为什么没有标记为正确的解决方案?它解释的解决方案比"正确的"答案更好. (3认同)
  • 在原始答案被接受后差不多一年发布可能是一个线索:) (3认同)

Imd*_*kar 31

menu.xml文件

  <item 
    android:id="@+id/item1"
    android:title="your Item">
  </item>
Run Code Online (Sandbox Code Playgroud)

放入你的java文件

  public void onPrepareOptionsMenu(Menu menu) {

    menu.removeItem(R.id.item1);
}
Run Code Online (Sandbox Code Playgroud)

  • 禁用不会删除 (5认同)

cor*_*ban 18

就像尼古拉所说的那样在onPrepareOptionsMenu()中做到了.

对于操作栏中的菜单项,您必须使菜单无效 activity.invalidateOptionsMenu();

这里更详细的描述.当onPrepareOptionsMenu切换菜单项时,如何刷新ActionBar?


Ash*_*thi 7

如果我必须更改选项菜单的内容,我会在onMenuOpened()期间执行它.这允许我在用户访问菜单的那一刻检查运行状态.

public boolean onMenuOpened(int featureid, Menu menu)
    {
        menu.clear();
        if (!editable)
        {
            MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign));
            MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify));
            MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete));
            itemAdd.setShortcut('0', 'a');
            itemMod.setShortcut('1', 'm');
            itemDel.setShortcut('2', 'd');
        }
        else
        {
            MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges));
            itemSave.setShortcut('0', 'S');
        }


        return true;
    }
Run Code Online (Sandbox Code Playgroud)


Mar*_* S. 7

要禁用某些项目:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);
Run Code Online (Sandbox Code Playgroud)