45

我有一个带有“开始”的选项Activity菜单MenuItem。选择此MenuItem选项后,我想更改菜单,使其包含MenuItem“停止”。And finally when "Stop" is selected, I would like to alter back to "Start".

这是我的部分代码不起作用。我列出了“开始”和“停止”,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;
    }
}
4

6 回答 6

100

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

@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;
}
于 2011-02-11T16:01:58.080 回答
21

Flygenring的答案是正确的,但是menu.findItem()是滞后的,并且在onPrepareOptionsMenu(Menu menu)中调用它会产生糟糕的用户体验。最好在创建菜单时获取一次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;
    }
于 2013-07-28T06:44:04.917 回答
6

完成更改后,您可能需要调用 super.onPrepareOptionsMenu。从文档

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

于 2010-11-16T23:02:46.300 回答
3

我得到了解决方案。您基本上是MenuItem在调用时删除,removeItem()因此也删除了引用。使用此代码有效。

private boolean isStarted = false;

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

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    if(isStarted) {
        menu.removeItem(1);
        menu.add(0, 0, 0, "Stop");
    } else {
        menu.removeItem(0);
        menu.add(0, 1, 0, "Start");
    }

    return super.onPrepareOptionsMenu(menu);
}

您必须MenuItem再次创建。这也是false标签的原因。实际上MenuInflater,您在创建Menuvia 代码时不需要,因此也不需要任何菜单 XML 文件。

于 2010-11-16T23:10:46.653 回答
1

感谢这篇文章中的信息,因为它解决了我菜单中错误标签的问题。我确实不得不稍微修改它并让最终的代码运行良好,希望它可以为其他人节省一些时间和挫败感。它的解决方案略有不同,但我所做的主要更改是将 .setVisible 更改为 True 或 False,除了 i.shadrins 解决方案最适合我的需求。

    @Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);

    if(loggedIn) 
    {
        logIn.setVisible(false);
        logOut.setVisible(true);
    } 
    else 
    {
        logIn.setVisible(true);
        logOut.setVisible(false);
    }
    return true;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    logIn = menu.findItem(R.id.loggedOut);
    logOut = menu.findItem(R.id.loggedIn);
    return true;
}
于 2013-09-11T04:16:49.100 回答
0

在 Android 3.0 及更高版本上,您应该调用invalidateOptionsMenu()来请求系统调用onPrepareOptionsMenu()。然后,您可以修改方法中的选项菜单。您可以在此处https://developer.android.com/guide/topics/ui/menus#options-menu查看Android 文档的运行时更改菜单项部分以获取更多详细信息。

于 2018-08-01T10:04:25.333 回答