我怎样才能改变Android上的选项菜单上的MenuItem?

我有一个选项菜单在我的ActivityMenuItem “开始”。 当select这个MenuItem ,我想改变菜单,使它包含一个MenuItem “Stop”。 最后当select“停止”时,我想改回“开始”。

这是我的代码不工作的一部分。 我在mymenu.xml列出了“开始”和“停止”我应该删除“停止”菜单创build时:

 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; } } 

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

 @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; } 

Flygenring的答案是正确的,但menu.findItem()是laggy,并调用它onPrepareOptionsMenu(菜单菜单)产生不良的用户体验。 最好在创build菜单时获取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; } 

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

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

我得到了解决scheme。 当调用removeItem()时,基本上删除了MenuItem ,因此也删除了引用。 使用这个代码的作品。

 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); } 

你必须再次创buildMenuItem 。 这也是false标签的原因。 其实你不需要MenuInflater因为你通过代码创buildMenu ,所以也不需要任何菜单的XML文件。

感谢在这篇文章中的信息,因为它解决了我的菜单中的错误标签的问题。 我不得不稍微修改一下,最终的代码运行良好,希望能够节省一些时间和沮丧。 这是一个稍微不同的解决scheme,但是我所做的主要变化是.setVisible为True或False,除了i.shadrins解决scheme是最适合我的需求的。

  @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; }