如何更改Android上"选项"菜单上的MenuItem?

Jon*_*nas 43 android menuitem alternation options-menu

我的"选项菜单"上Activity有一个MenuItem"开始".MenuItem选择此项后,我想更改菜单,使其包含MenuItem"停止".最后,当选择"停止"时,我想改回"开始".

以下是我的代码中无法正常工作的部分内容.我在列表中列出了"开始"和"停止",mymenu.xml我应该在创建菜单时删除"停止":

public class MyActivity extends Activity {
    private boolean isStarted = false;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        menu.removeItem(R.id.stop);
        inflater.inflate(R.menu.mymenu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.start:
            isStarted = true;
            return true;
        case R.id.stop:
            isStarted = false;
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        if(isStarted) {
            menu.removeItem(R.id.start);
            menu.add(R.id.stop);
        } else {
            menu.removeItem(R.id.stop);
            menu.add(R.id.start);
        }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Fly*_*ing 96

对于这种类型的操作,我通常选择不改变菜单项,而只是隐藏你不需要的菜单项:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    menu.findItem(R.id.start).setVisible(!isStarted);
    menu.findItem(R.id.stop).setVisible(isStarted);
    return true;
}
Run Code Online (Sandbox Code Playgroud)


i.s*_*rin 21

Flygenring答案是正确的,但menu.findItem()滞后的,并且在onPrepareOptionsMenu(菜单菜单)中调用它会产生糟糕的用户体验.创建菜单时最好先获取MenuItem对象,然后每次在屏幕上显示菜单时调用setVisible:

    MenuItem mDynamicMenuItem;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        // Get dynamic menu item
        mDynamicMenuItem = menu.findItem(R.id.menu_item);
        return true;
    }

    // Prepare the Screen's standard options menu to be displayed. This is called right 
    // before the menu is shown, every time it is shown. You can use this method to
    // efficiently enable/disable items or otherwise dynamically modify the contents.
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        // Here is just a good place to update item
        mDynamicMenuItem.setVisible(isVisible);
        return true;
    }
Run Code Online (Sandbox Code Playgroud)


Che*_*mon 6

完成更改后,您可能需要调用super.onPrepareOptionsMenu.来自文档:

派生类应始终调用基类实现.