2012-09-20 13 views
6

Por alguna razón, onCreateOptionsMenu() se llama DESPUÉS onResume() en mi aplicación ... Por lo tanto, simplemente no puedo obtener el menú mientras estoy configurando mi UI (entre onCreate() y onResume()), lo que resulta en no ser capaz de configurar los elementos de acción correspondientes para mi barra de acciones ...¿Cómo retener el menú de ActionBar en el tiempo de configuración de la interfaz de usuario?

La única solución alternativa que he encontrado hasta ahora es llamar manualmente a invalidateOptionsMenu() justo antes de onCreate() devuelve; de esa manera se llama inmediatamente al onCreateOptionsMenu(), aguardo el menú y finalmente puedo agregar los elementos de acción deseados.

¿Alguien ha tenido este problema? ¿Cómo se supone que debe configurar programáticamente sus elementos de acción dado que se llama al onCreateOptionsMenu() después de onResume()?

Mi aplicación se está ejecutando en JellyBean, se utiliza el incorporado en la Barra de acciones (sin ActionBarSherlock), android:minSdkVersion="14" y android:targetSdkVersion="16"

+0

comprobación de validez rápida, estamos hablando acerca de la actividad * * onCreate y onResume, ¿verdad? a diferencia de los métodos correspondientes en el Fragmento –

+0

¿Por qué no puede configurar los elementos del menú en 'onCreateOptionsMenu()' (en lugar de usarlo simplemente para almacenar una referencia al menú para su uso posterior)? – user113215

+1

Estoy aquí con user113215, ¿por qué necesita saber sobre el menú en 'onResume()'? No parece correcto. – dmon

Respuesta

6

Primero considere que tal vez no debería estar haciendo esto. Parece que su idea podría ir en contra de los patrones de diseño típicos para Android. Si su menú está cambiando en respuesta a una selección de usuario, por ejemplo, debe usar el modo de acción contextual en su lugar.

  • Desde el Action Bar API Guide:

    Como regla general, todos los elementos en el menú de opciones (dejar que los puntos de acción por sí solos) deberían tener un impacto global en la aplicación, en lugar de afectar sólo a una pequeña parte de la interfaz. [...] Entonces, incluso antes de decidir si un elemento de menú debería aparecer como un elemento de acción, asegúrese de que el artículo tenga un alcance global para la actividad actual.

  • Desde el Menu API Guide:

    Nunca se debe cambiar los elementos en el menú de opciones basadas en el View actualmente en el foco. Cuando está en modo táctil (cuando el usuario no está usando una bola de desplazamiento o d-pad), las vistas no pueden enfocar, por lo que nunca debe usar el enfoque como base para modificar elementos en el menú de opciones. Si desea proporcionar elementos del menú que sean sensibles al contexto a View, use un Context Menu.


Aparte de eso, si desea cambiar los elementos del menú que usted ha descrito, debe realizar el cambio en onPrepareOptionsMenu(). Cuando ocurre el evento que requiere cambiar los elementos del menú, coloque la información relevante en un campo y llame al invalidateOptionsMenu(). Anule onPrepareOptionsMenu() y verifique el valor del campo para determinar qué elementos del menú agregar/eliminar.

(También funcionaría llamar al invalidateOptionsMenu() y anular onCreateOptionsMenu() para modificar qué elementos del menú se deben mostrar, aunque este enfoque no es recomendable.)

Más de la Menu API Guide:

Debe utilizar onCreateOptionsMenu() sólo para crear el estado menú inicial y no hacer cambios durante el ciclo de vida de la actividad. Si desea modificar el menú de opciones en función de los eventos que ocurren durante el ciclo de vida de la actividad, puede hacerlo en el método onPrepareOptionsMenu().

Este método le transfiere el objeto Menu tal como existe actualmente para que pueda modificarlo, como agregar, quitar o deshabilitar elementos. (Los fragmentos también proporcionan una devolución de llamada onPrepareOptionsMenu().)

  • En 2.3.x Android e inferior, el sistema llama onPrepareOptionsMenu() cada vez que el usuario abre el menú de opciones (presiona el botón de menú).

  • En Android 3.0 y superior, el menú de opciones siempre se considera abierto cuando los elementos del menú se presentan en la barra de acciones. Cuando se produce un evento y desea realizar una actualización del menú, debe llamar al invalidateOptionsMenu() para solicitar que el sistema llame al onPrepareOptionsMenu().

+0

Gran respuesta, muchas gracias por su entrada :) –

Cuestiones relacionadas