2011-05-21 10 views
21

Tengo curiosidad por saber cómo (si hay) onPrepareOptionsMenu(Menu) (y por extensión, onPreparePanel(int, View, Menu)) se usa en Android 3.0+ cuando se dirige a API 11 o superior.Uso de `onPrepareOptionsMenu()` en Android 3.0+

Mi pensamiento es el siguiente:

Un Activity 's ActionBar recibe su contenido de onCreateOptionsMenu(Menu) donde puede inflar un recurso de menú XML, añadir elementos directamente, o alguna combinación de ambos. Cualquier fragmento de la actividad también recibirá esta llamada y tendrá la opción de hacer lo mismo.

Para actualizar los elementos en la barra de acciones, puede retener la instancia Menu o llamar al invalidateOptionsMenu(), que terminará llamando al onCreateOptionsMenu(Menu) nuevamente.

Por lo tanto, ¿está onPrepareOptionsMenu(Menu) solo en ese momento para admitir aplicaciones heredadas que no se dirigen a API 11 o posterior?

¿Llamar a getActionBar().hide() y getActionBar().show() activa una llamada al onPrepareOptionsMenu(Menu) quizás?

¿La adición o eliminación de un fragmento de alguna manera activa esto?

Respuesta

10

Según mis extensas pruebas, parece que funciona exactamente igual que en las versiones anteriores a la 3.0 de la plataforma, solo se invoca cuando se abre el menú de desbordamiento. La devolución de llamada no se activó en ninguno de los eventos enumerados en la pregunta original.

Un hecho quizás obvio pero notable: se puede acceder al menú completo en esta devolución de llamada para poder manipular los elementos visibles en la barra de acciones, en el menú de desbordamiento y/u ocultos.

+1

En realidad estoy teniendo un comportamiento diferente. Probando tanto en 3.2 como en 4.1.1, después de llamar a 'invalidateOptionsMenu()', recibo una llamada a 'onCreateOptionsMenu()' y luego a 'onPrepareOptionsMenu()'. No creo que necesariamente se llamen entre sí, pero ese es el orden en el que están llegando. Debido a esto, guardo todos mis cambios de tiempo de ejecución en 'onPrepareOptionsMenu()', y en 'onCreateOptionsMenu()' Solo inflico el menú. En pre-3.0 esto se maneja a sí mismo cuando los usuarios abren el menú, y en> 3.0 simplemente llamo a 'invalidateOptionsMenu' cuando necesito actualizar la barra de acciones. –

4

Sice Hace poco tuve preguntas similares y me topé con esta, me gustaría agregar para lectores posteriores: Sí, onPrepareOptionsMenu aún funciona. Sin embargo, solo debe invocar la implementación estándar para dispositivos Honeycomb (es decir, si (android.os.Build.VERSION.SDK_INT> = 11) devuelve super.onPrepareOptionsMenu (menú);) y usa invalidateOptionsMenu() (a través de la reflexión, si es necesario)) y onCreateOptionsMenu() en su lugar, esp. cuando se usa showAsAction. De lo contrario, el menú no se actualizará hasta que se abra. Por ejemplo, si agrega algunas entradas cuando se selecciona un elemento, los elementos aparecerán mágicamente en la barra de acciones cuando se abra el menú, no cuando se seleccione el elemento. Lo mismo ocurre con la deselección y la ocultación de los elementos del menú.

Cuestiones relacionadas