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

Puse un par de puntos de corte en onCreate (uno al principio y otro al final del método) y también puse uno al comienzo de onCreateOptionsMenu . El método onCreate se llama primero, y antes de que termine, se llama onCreateOptionsMenu .

onCreateOptionsMenu separar el código de navegación de Fragment en mi aplicación, así que tengo un par de objetos que onCreateOptionsMenu en onCreateOptionsMenu dependiendo de si la aplicación se está ejecutando en teléfono / tableta (estoy usando el tamaño de pantalla para determinar esto, mi diseño el archivo para pantallas grandes tiene una Vista que verifico después de que el diseño esté inflado). El problema que tengo es que creo estos objetos en onCreate y recibo una excepción de puntero nulo cuando hago referencia al objeto en onCreateOptionsMenu .

El método onCreate se llama primero, y antes de que termine, se llama aCreateOptionsMenu.

Eso será cierto en dispositivos y aplicaciones con una barra de acción oficial estilo Honeycomb. Si no hay una barra de acciones, onCreateOptionsMenu() no se debe llamar hasta que el usuario llame al 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 el diseño esté inflado)

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

En mi caso en Android 2.3 y con FragmentActivity de v4-support library, el orden de los métodos de ciclo de vida invoke 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: 

Además de 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é.

Encontré si en onResume () llamo

 invalidateOptionsMenu(); 

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

Sugiero crear una función de callback en su fragmento para evitar problemas de sincronización con onResume () y onCreateOptionsMenu ().

hacer los siguientes trabajos sin defectos para mí:

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

ejemplo:

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

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

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