¿Cómo puedo modificar un MenuItem en el menú de opciones de Android?

Tengo un menú de las opciones en mi Activity con un MenuItem "comienzo". Cuando este MenuItem está seleccionado, quisiera alterar el Menú para que contenga un MenuItem "Stop". Y finalmente cuando se selecciona "Stop", me gustaría cambiar de nuevo a "Start".

Aquí hay partes de mi código que no funciona. Tengo ambos "comienzo" y "parada" enumerados en mymenu.xml Debo quitar probablemente "parada" cuando se crea el menú:

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

Para este tipo de operación normalmente elijo no alterar los elementos del menú, pero sólo ocultar los que no necesita:

 @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 respuesta es correcta, pero menu.findItem () es laggy y llamarlo dentro onPrepareOptionsMenu (Menú menú) produce mala experiencia de usuario. Es mejor obtener el objeto MenuItem una vez al crear el menú y, a continuación, simplemente llamar a setVisible cada vez que ocurre en la pantalla:

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

Es probable que necesite llamar a super.onPrepareOptionsMenu una vez que haya terminado de realizar los cambios. De los documentos :

Las clases de derivación siempre deben llamar a la implementación de la clase base.

Tengo la solución. Básicamente estás eliminando el MenuItem cuando llamas a removeItem() así también eliminar la referencia. El uso de este código funciona.

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

Tienes que crear el MenuItem nuevo. Ésa es también la razón de la etiqueta false . En realidad no necesita el MenuInflater como crear el Menu través de código por lo que también no hay necesidad de ningún archivo XML de menú.

Gracias por la información en este post ya que resolvió mi problema de las etiquetas falsas en mi menú. Tuve que modificarlo ligeramente y tener el código final que funciona bien como sigue con la esperanza de que salve a alguien más algún tiempo y la frustración. Es una solución ligeramente diferente, pero el cambio principal que hice fue el .setVisible a Verdadero o Falso, aparte de que i.shadrins solución era el mejor ajuste para mis necesidades.

  @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; } 
  • ActionBarsherlock cómo establecer divisores en elementos de menú con sólo iconos
  • Android: color de fondo cuando se pulsa el elemento de menú
  • Android: menuItem.expandActionView () en el nivel API <14
  • App Crash al intentar cambiar textsize en textView haciendo clic en el botón
  • Cómo cambiar el color del texto del elemento de menú en Android?
  • Desactivar el color de resaltado de fondo del elemento de menú en android
  • ¿Cómo agregar un único elemento de menú a la barra de herramientas de android?
  • Establecer un elemento de menú tal como se ha comprobado desde el código
  • Cómo mostrar el elemento de menú con el icono y el texto en AppCompatActivity
  • ¿Cómo puedo establecer la visibilidad de un elemento de ActionBar en fragmento diferente
  • Elemento de menú de opciones personalizadas de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.