Obtener una MenuItem
que apunta a dicho artículo, llamada setVisible
en él para ajustar su visibilidad y luego llamar invalidateOptionsMenu()
a sus actividades en lo que el menú Barra de acciones se ajusta en consecuencia.
Actualización: A MenuItem
no es una vista normal que es parte de su diseño. Es algo especial, completamente diferente. Sus declaraciones de código null
para item
y que está causando el accidente. Lo que necesitas en cambio es hacer:
MenuItem item = menu.findItem(R.id.addAction);
Aquí está la secuencia en la que debe llamar: primero llame invalidateOptionsMenu()
y luego onCreateOptionsMenu(Menu)
obtenga una referencia al MenuItem (llamando menu.findItem()
) y llame setVisible()
a él
MenuItem
puede sernull
porque está usando engetItem
lugar defindItem
. Nunca podríamos saberlo sin ver su código y el registro de fallas.onCreateOptionsMenu
, y configure la visibilidad del elemento en ese punto. O mantenga la referencia hasta que decida si debe ser visible o no.invalidateOptionsMenu()
y luegoonCreateOptionsMenu(Menu)
obtener una referencia alMenuItem
(llamandomenu.findItem()
) y llamarlosetVisible()
. Las respuestas de suhas_sm y de P1r4nh4 presentan el enfoque correcto.Encontré un apéndice a esta pregunta:
Si desea cambiar la visibilidad de sus elementos de menú sobre la marcha, solo necesita establecer una variable miembro en su actividad para recordar que desea ocultar el menú y llamar
invalidateOptionsMenu()
y ocultar los elementos en suonCreateOptionsMenu(...)
método anulado .En mi ejemplo, he escondido todos los elementos.
fuente
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
Los documentos indican: "Debe devolver verdadero para que se muestre el menú; si devuelve falso, no se mostrará".onPrepareOptionsMenu()
debe usarse para mostrar / ocultar lógica en lugar deonCreateOptionsMenu()
como solo se llama una vez, por lo que no es útil si desea cambiar los elementos del menú después de su inicialización. Por lo tanto, inflar en onCreate, pero mostrar / ocultar en onPrepare.Si.
invalidateOptionsMenu()
cuando quiera ocultar la opción. Esto llamaráonCreateOptionsMenu()
.onCreateOptionsMenu()
, verifique la bandera / condición y muéstrela u ocúltela de la siguiente manera:fuente
invalidateOptionsMenu
lugar deinvalidateOptions
?onCreateOptionsMenu
Puedes llamar a esto:
Actualizar:
Asegúrese de que su código no regresa
null
paraitem
o puede bloquear la aplicación.fuente
Estaba buscando una respuesta con un poco más de contexto. Ahora que lo he descubierto, agregaré esa respuesta.
Ocultar botón por defecto en el menú xml
Por defecto, el botón compartir estará oculto, según lo establecido por
android:visible="false"
.main_menu.xml
Mostrar botón en código
Pero el botón compartir puede mostrarse opcionalmente en función de alguna condición.
MainActivity.java
Ver también
fuente
invalidateOptionsMenu()
para actualizar el menú.No funcionó para mí. Tuve que usar explícitamente
onPrepareOptionsMenu
para establecer un elemento invisible.Así que úselo
onCreateOptionsMenu
para crear el menú yonPrepareOptionsMenu
cambiar la visibilidad, etc.fuente
onPrepareOptionsMenu
parece ser el lugar correcto para realizar este tipo de operación: "Prepare el menú de opciones estándar de la pantalla para que se muestre. Esto se llama justo antes de que se muestre el menú, cada vez que se muestra . Puede usar este método para habilitar / deshabilitar elementos de manera eficiente o modificar dinámicamente el contenido ".invalidateOptionsMenu()
para actualizar el menú.Inicialmente establezca la visibilidad del elemento del menú en falso en el archivo de diseño del menú de la siguiente manera:
Luego, simplemente puede establecer la visibilidad del elemento del menú en falso en su onCreateOptionsMenu () después de inflar el menú.
fuente
Prueba esto:
fuente
Esto funcionó para mí tanto de Actividad como de Fragmento
fuente
La respuesta P1r4nh4 funciona bien, simplemente la simplifiqué usando una bandera booleana:
fuente
0
y1
no es una "bandera booleana", es pseudobooleana. Además, no hay ninguna razón para usar un booleano real aquí.De acuerdo con el sitio oficial de Android Developer, OnCreateOptionMenu (menú de menú) no se recomienda para cambiar elementos de menú o iconos, visibilidad ... etc. en tiempo de ejecución.
Según lo recomendado Puede usar este método onOptionsItemSelected (elemento MenuItem) para rastrear las entradas del usuario.
Si necesita cambiar elementos de menú en tiempo de ejecución, puede usar onPrepareOptionsMenu (menú de menú) para cambiarlos
fuente
setVisible(false)
aparece el elemento siempre visible, no desaparece hasta que hago clic en los tres puntos (Menú en sí). Si lo usoinvalidateOptionsMenu()
enonPrepareOptionsMenu
los elementos, se reorganiza inmediatamente, pero pierden sus acciones (si hago clic en cualquier elemento, no hace nada).establecer un valor a una variable y llamar a invalidateOptionsMenu ();
por ejemplo
fuente
setVisible(false)
aparece el elemento siempre visible, no desaparece hasta que hago clic en los tres puntos (Menú en sí). Si lo usoinvalidateOptionsMenu()
enonPrepareOptionsMenu
los elementos, se reorganiza inmediatamente, pero pierden sus acciones (si hago clic en cualquier elemento, no hace nada).Puede usar
toolbar.getMenu().clear();
para ocultar todos los elementos del menú a la vezfuente
Al configurar la visibilidad de todos los elementos en el menú, el menú de la barra de aplicaciones o el menú de desbordamiento se ocultará automáticamente
Ejemplo
...
...
Antes de ir a otro fragmento, use el siguiente código:
fuente
https://stackoverflow.com/a/21215280/466363 - respondido por Look Alterno y Sufian
.
ActivityCompat.invalidateOptionsMenu () no devuelve la llamada a OnPrepareOptionsMenu (); solo actualiza el menú directamente.
Mi someMethod () recibe una llamada desde varios lugares, incluso antes de onCreateOptionsMenu (), así que debo verificar mMenu! = Null.
fuente
Si hizo todo como en las respuestas anteriores, pero un elemento del menú aún está visible, verifique que haga referencia al recurso único . Por ejemplo, en onCreateOptionsMenu o onPrepareOptionsMenu
Ctrl + Haga clic en R.id.menu_open y verifique que solo exista en un archivo de menú. En caso de que este recurso ya se use en cualquier lugar y se cargue en una actividad, intentará esconderse allí.
fuente
La mejor manera de ocultar todos los elementos en un menú con un solo comando es usar "group" en su menú xml. Simplemente agregue todos los elementos de menú que estarán en su menú de desbordamiento dentro del mismo grupo.
En este ejemplo, tenemos dos elementos de menú que siempre se mostrarán (elemento normal y búsqueda) y tres elementos de desbordamiento:
Luego, en su actividad (preferible en onCreateOptionsMenu), use el comando setGroupVisible para establecer la visibilidad de todos los elementos del menú en falso o verdadero.
Si desea utilizar este comando en cualquier otro lugar de su actividad, asegúrese de guardar la clase de menú en local y compruebe siempre si el menú es nulo, porque puede ejecutar antes de createOptionsMenu:
fuente
Para aquellos que usan la biblioteca Appcompat: si su actividad subclasifica ActionBarActivity, puede llamar a supportInvalidateOptionsMenu ()
Visto aquí: https://stackoverflow.com/a/19649877/1562524
fuente
Creo que un mejor enfoque sería usar una variable miembro para el menú, inicializarla en onCreateOptionsMenu () y simplemente usar setVisible () después, sin invalidar el menú de opciones.
fuente
este código me funcionó
fuente
Este enfoque funcionó para mí:
fuente
Está intentando acceder a un elemento del menú desde una actividad, que no tiene acceso al alcance. La llamada para encontrar el elemento del menú devolverá nulo , porque la vista no está vinculada ni con la actividad ni el diseño que está llamando.
Los elementos del menú están vinculados con elementos como " Barra de navegación " que a su vez están vinculados con la actividad correspondiente.
Inicialice esas vistas en la actividad () y luego acceda a los elementos del menú dentro de esas vistas.
fuente
utilizar
invalidateOptionsMenu()
para llamar
onPrepareOptionsMenu(menu: Menu?)
https://developer.android.com/guide/topics/ui/menus
fuente
fuente