代码之家  ›  专栏  ›  技术社区  ›  Jonas

如何更改Android上“选项”菜单上的菜单项?

  •  41
  • Jonas  · 技术社区  · 14 年前

    我的菜单上有选项 Activity 有一个 MenuItem “开始”。当这个 菜单项 已选中,我想更改菜单,使其包含 菜单项 “停止”。最后,当选择“停止”时,我想改回“开始”。

    以下是我的代码中不起作用的部分。我的“开始”和“停止”都列在 mymenu.xml 创建菜单时,我可能应该删除“stop”:

    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;
        }
    }
    
    6 回复  |  直到 14 年前
        1
  •  96
  •   Emre Yazici    13 年前

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

    @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;
    }
    
        2
  •  20
  •   i.shadrin    8 年前

    弗利根林 答案是正确的,但是 menu.finditem()。 拉吉在里面 OnPrepareOptions菜单 产生糟糕的用户体验。最好得到 菜单项 创建菜单时调用一次,然后在每次屏幕上出现菜单时调用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;
        }
    
        3
  •  6
  •   Cheryl Simon    14 年前

    完成更改后,您可能需要调用super.onPrepareOptions菜单。来自 docs :

    派生类应始终调用 到基类 实施。

        4
  •  3
  •   Octavian Helm    14 年前

    我找到了解决办法。您基本上正在删除 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);
    }
    

    你必须创造 菜单项 再一次。这也是 false 标签。实际上你不需要 MenuInflater 当你创造 Menu 通过代码,所以也不需要任何菜单XML文件。

        5
  •  1
  •   timv    11 年前

    谢谢你在这篇文章中提供的信息,因为它解决了我菜单中错误标签的问题。我确实需要稍微修改一下,最后的代码可以很好地工作,希望这样可以节省别人一些时间和挫败感。这是一个稍有不同的解决方案,但我所做的主要更改是.setVisible,无论是对还是错,除此之外,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;
    }
    
        6
  •  0
  •   Dara    6 年前

    在Android 3.0及更高版本上,您应该致电 失效选项菜单() 请求系统调用 OnPrepareOptions菜单() . 然后可以修改方法中的选项菜单。你可以查一下 在运行时更改菜单项 这里是Android文档的一部分 https://developer.android.com/guide/topics/ui/menus#options-menu 了解更多详细信息。