De todos modos, la documentación cubre todas las cosas.
Cambiar elementos del menú en tiempo de ejecución
Una vez que se crea la actividad, el
onCreateOptionsMenu()
método se llama solo una vez, como se describió anteriormente. El sistema mantiene y reutiliza lo Menu
que defina en este método hasta que se destruya su actividad. Si desea cambiar el menú de opciones en cualquier momento después de que se creó por primera vez, debe anular el onPrepareOptionsMenu()
método. Esto le pasa el objeto Menú tal como existe actualmente. Esto es útil si desea eliminar, agregar, deshabilitar o habilitar elementos de menú según el estado actual de su aplicación.
P.ej
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
if (isFinalized) {
menu.getItem(1).setEnabled(false);
// You can also use something like:
// menu.findItem(R.id.example_foobar).setEnabled(false);
}
return true;
}
En Android 3.0 y versiones posteriores, se considera que el menú de opciones siempre está abierto cuando los elementos del menú se presentan en la barra de acción. Cuando se produce un evento y desea realizar una actualización del menú, debe llamar invalidateOptionsMenu()
para solicitar que el sistema llame onPrepareOptionsMenu()
.
setEnable()
cambia lo que sucede cuando presiona este menú, pero no cambia su aspecto (¿qué pasa, desarrolladores de Android?). Por lo tanto, es más claro deshabilitar y cambiar el título, o preferiblemente simplemente hacer loMenuItem
invisible.false
para deshabilitar completamente el menú.En todas las versiones de Android, la forma más fácil: use esto para MOSTRAR un ícono de acción del menú como deshabilitado Y hacer que FUNCIÓN también esté deshabilitado:
fuente
Puede guardar el elemento como una variable al crear el menú de opciones y luego cambiar sus propiedades a voluntad.
fuente
onPrepareOptionsMenu
?simplifique la versión de @Vikas
fuente
Cómo actualizar el menú actual para habilitar o deshabilitar los elementos cuando se realiza una AsyncTask.
En mi caso de uso, necesitaba deshabilitar mi menú mientras mi AsyncTask estaba cargando datos, luego, después de cargar todos los datos, necesitaba habilitar todo el menú nuevamente para permitir que el usuario lo usara.
Esto evitó que la aplicación permitiera a los usuarios hacer clic en los elementos del menú mientras se cargaban los datos.
Primero, declaro una variable de estado; si la variable es 0, se muestra el menú; si esa variable es 1, el menú está oculto.
Luego en mi
onCreateOptionsMenu()
compruebo esta variable, si es 1, deshabilito todos mis elementos, si no, solo los muestro a todosAhora, cuando comienza mi actividad,
onCreateOptionsMenu()
se llamará solo una vez, y todos mis elementos desaparecerán porque configuré el estado para ellos al comienzo.Luego creo una AsyncTask donde establezco esa variable de estado en 0 en mi
onPostExecute()
¡Este paso es muy importante!
Cuando usted llama
invalidateOptionsMenu();
se relanzaráonCreateOptionsMenu();
Entonces, después de configurar mi estado a 0, simplemente redibujé todo el menú, pero esta vez con mi variable en 0, dicho esto, todo el menú se mostrará después de que todo el proceso asíncrono se haya realizado, y luego mi usuario puede usar el menú .
Resultados
fuente
la mejor solución cuando se realiza en el cajón de navegación
fuente
Una respuesta más moderna para una vieja pregunta:
MainActivity.kt
menu_main_activity.xml
menu_item_icon_selector.xml
attrs.xml
styles.xml or themes.xml
fuente
fuente
Lo que hice fue guardar una referencia al Menú en
onCreateOptionsMenu
. Esto es similar a la respuesta de nir, excepto que en lugar de guardar cada elemento individual, guardé todo el menú.Declarar un menú
Menu toolbarMenu;
.Luego en
onCreateOptionsMenu
guardar el menú a su variableAhora puede acceder a su menú y a todos sus elementos en cualquier momento que desee.
toolbarMenu.getItem(0).setEnabled(false);
fuente
fuente
Si menú visible
Si ocultar menú
fuente
En general, puede cambiar las propiedades de sus vistas en tiempo de ejecución:
y entonces...
pero
si desea modificar la visibilidad de las opciones desde ContextMenu, al presionar su botón, puede activar una bandera, y luego en onCreateContextMenu puede hacer algo como esto:
espero que esto ayude
fuente
onCreateContextMenu
método. Pero quiero acceder al menú contextual desde este método.onCreateContextMenu
se llamará solo una vez, pero puedo hacer clic en el botón muchas veces para habilitar / deshabilitar el elemento del menú.