¿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ú:
- Cómo formatear una actividad de otra actividad mediante opciones de menú
- Android: muestra el menú de varias actividades
- Cómo cambiar dinámicamente el icono del elemento de menú ActionBar
- Alinee un elemento a la izquierda de ActionBar
- Obtención de MenuItem en onCreate
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; } }
- Compruebe si MenuItem está en desbordamiento de ActionBar
- ¿Cómo conseguir la vista de la acción del artículo del menú?
- onPrepareOptionsMenu Duplica el elemento en ActionBar
- Agregue un MenuItem al menú en la posición o el grupo específico programmatically
- Android - Cómo cambiar dinámicamente el texto del elemento de menú fuera de onOptionsItemsSelected o onCreateOptionsMenu
- Cómo agregar elementos de submenú a ActionBar acción en código?
- Botón de selección de Android MenuItem
- OnOptionsItemSelected () no se llama al hacer clic en el elemento de menú que tiene un conjunto actionLayout en él
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; }