Android: ¿Cuándo se llama a onCreateOptionsMenu durante el ciclo de vida de la actividad?

149

Puse un par de puntos de interrupción onCreate(uno al principio y uno al final del método), y también puse uno al principio de onCreateOptionsMenu. El onCreatemétodo se llama primero, y antes de que termine onCreateOptionsMenuse llama.

Estoy tratando de separar el Fragmentcódigo de navegación en mi aplicación, así que tengo un par de objetos en los que delego onCreateOptionsMenudependiendo de si la aplicación se ejecuta en el teléfono / tableta (estoy usando el tamaño de la pantalla para determinar esto, mi archivo de diseño para las pantallas grandes tienen una Vista que verifico después de que se infla el diseño). El problema que tengo es que creo estos objetos en onCreate y obtengo una excepción de puntero nulo cuando hago referencia al objeto onCreateOptionsMenu.

Christopher Perry
fuente

Respuestas:

112

Primero se llama al método onCreate, y antes de que termine se llama a onCreateOptionsMenu.

Eso será cierto en dispositivos y aplicaciones con una barra de acción oficial de estilo Honeycomb. Si no hay una barra de acción, onCreateOptionsMenu()no debe llamarse hasta que el usuario abra el menú, generalmente presionando el botón MENÚ.

(Estoy usando el tamaño de pantalla para determinar esto, mi archivo de diseño para pantallas grandes tiene una Vista que verifico después de que se infla el diseño)

Esa prueba se romperá muy pronto, una vez que se envíe Ice Cream Sandwich. Por lo que puedo decir, los teléfonos ICS tendrán barras de acción (aunque tal vez no barras del sistema).

CommonsWare
fuente
Olvidé mencionar que estoy usando la biblioteca ActionbarSherlock. Tu respuesta me lo recordó. Esa es probablemente la razón de este comportamiento, ya que es un contenedor en la biblioteca de compatibilidad, que coloca los elementos del menú en la "Barra de acciones".
Christopher Perry
@commonsware: eso significa en dispositivos y aplicaciones que no tienen barra de acción. El menú aparecerá incluso si onCreateOptionsMenu no tiene un elemento visible?
NinjaCoder
12
en mi caso onCreateMenu llamar después de onResume
Kostya Khuta
1
Sí, tengo el mismo problema ... Pero mi código está relacionado con un Fragmento.
Yoann Hercouet
Comencé a tener NPEcuando comprobé si nav drawer fragmentestaba abierto onCreateOptionsMenu. Tuve que poner controles nulos tanto en onCreateOptionsMenu de la actividad como en la devolución de llamada que el fragmento estaba usando en su onCreateOptionsMenu. Realmente extraño porque solo estaba sucediendo en un par de pantallas, pero constantemente en esas.
theblang
54

En mi caso en Android 2.3 y con la FragmentActivitybiblioteca v4-support, el orden de invocación de los métodos de ciclo de vida es el siguiente:

07-18 18:29:21.629  20183-20183/? I/onCreate:
07-18 18:29:21.719  20183-20183/? I/onStart: 
07-18 18:29:21.719  20183-20183/? I/onResume: 
07-18 18:29:21.739  20183-20183/? I/onCreateOptionsMenu:
Roman Nazarevych
fuente
27

Encontré si en onResume () llamo

invalidateOptionsMenu();

luego onCreateOptionsMenu (menú Menú) se llama después, según el ciclo de vida de la actividad (creo que ese es el término correcto aquí) , como lo indica @ tir38

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}
Gene Bo
fuente
44
Si está utilizando actionbarsherlock, llame a este métodosupportInvalidateOptionsMenu();
Shan Xeeshi, el
3
Tenga cuidado cuando diga "inmediatamente". Realmente no sucederá de inmediato. Cuando usted invalidateOptionsMenu, un trabajo para (re) crear el menú de opciones se agregará a la cola de mensajes de la interfaz de usuario. Cualquier otra cosa que esté en la cola se ejecutará primero.
tir38
21

Además en la respuesta anterior, en el caso de ICS y Honeycomb, onCreateOptionsMenu se llama después de onCreate y onPostCreate mientras que en Gingerbread y versiones anteriores se llama después de onCreate pero antes de onPostCreate. Esa es la única diferencia que encontré.

Pawan Maheshwari
fuente
3

En mi experiencia ActionBarActivityde soporte v7 onCreateOptionsMenu()llamado en el setContentView()método en el medio onCreate()aparece en 4.1.1.

Pero en 4.4 otra historia onCreateOptionMenu()llamada después onCreate(). Además, no sé, puede ser inmediatamente después, tal vez no. Pero es un hecho después. No probé en otras versiones, pero 4.1.1 es primero donde tuve problemas con el orden de inicio.

Yevgen Kulik
fuente
Tal vez necesitas usar supportInvalidateOptionsMenu()?
David d C e Freitas
2

sugiero crear una función de devolución de llamada en su fragmento para evitar problemas de tiempo con onResume () y onCreateOptionsMenu ().

hacer lo siguiente funciona perfectamente para mí:

  1. crea y agrega tu fragmento a tu actividad
  2. deja una referencia de este fragmento en tu actividad
  3. crear un método público doSomethingWithTheMenu () en su fragmento
  4. llame a este método desde su actividad cuando se llama a onCreateOptionsMenu (menú Menú).

ejemplo:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
datayeah
fuente