Android: quando viene chiamato onCreateOptionsMenu durante il ciclo di vita delle attività?


149

Ho inserito un paio di punti di interruzione onCreate(uno all'inizio e uno alla fine del metodo) e ne ho inserito uno anche all'inizio onCreateOptionsMenu. Il onCreatemetodo viene chiamato per primo e prima che finisca onCreateOptionsMenuviene chiamato.

Sto provando a separare il Fragmentcodice di navigazione nella mia app, quindi ho un paio di oggetti a cui delegare onCreateOptionsMenua seconda che l'app sia in esecuzione sul telefono / tablet (sto usando le dimensioni dello schermo per determinare questo, il mio file di layout per gli schermi di grandi dimensioni hanno una vista che controllo dopo che il layout è gonfiato). Il problema che sto riscontrando è che creo questi oggetti in onCreate e ricevo un'eccezione puntatore null quando faccio riferimento all'oggetto onCreateOptionsMenu.

Risposte:


112

Il metodo onCreate viene chiamato per primo e prima che termini onCreateOptionsMenu viene chiamato.

Ciò sarà vero su dispositivi e app con una barra delle azioni ufficiale in stile Honeycomb. Se non è presente alcuna barra delle azioni, onCreateOptionsMenu()non deve essere chiamato finché l'utente non richiama il menu, in genere premendo il pulsante MENU.

(Sto usando le dimensioni dello schermo per determinare questo, il mio file di layout per schermi di grandi dimensioni ha una vista che controllo dopo che il layout è gonfiato)

Quel test si interromperà molto presto, una volta che Ice Cream Sandwich verrà spedito. Da quello che posso dire, i telefoni ICS avranno barre di azione (anche se forse non barre di sistema).


Ho dimenticato di dire che sto usando la libreria ActionbarSherlock. La tua risposta mi ha ricordato. Questo è probabilmente il motivo di questo comportamento, poiché è un wrapper nella libreria di compatibilità, che inserisce le voci di menu in "ActionBar".
Christopher Perry,

@commonsware - Ciò significa che su dispositivi e app che non dispongono di barra delle azioni. Il menu verrà visualizzato anche se onCreateOptionsMenu non ha elementi visibili?
NinjaCoder

12
nel mio caso onCreateMenu chiama dopo onResume
Kostya Khuta

1
Sì, ho lo stesso problema ... Ma il mio codice è legato a un frammento.
Yoann Hercouet,

Ho iniziato a NPEcontrollare quando nav drawer fragmentera aperto onCreateOptionsMenu. Ho dovuto mettere controlli nulli sia nel menu onCreateOptionsMenu dell'attività, sia nel callback che il frammento stava usando nel suo onCreateOptionsMenu. Davvero strano perché stava accadendo solo su un paio di schermi, ma costantemente su quelli.
theblang,

54

Nel mio caso su Android 2.3 e con FragmentActivitydalla libreria di supporto v4, l'ordine dei metodi del ciclo di vita invocato è il seguente:

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:

27

Ho trovato se in onResume () chiamo

invalidateOptionsMenu();

quindi onCreateOptionsMenu (menu Menu) viene chiamato in seguito - come per il ciclo di vita dell'attività (penso che sia il termine corretto qui) , come indicato da @ tir38

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}

4
Se stai usando actionbarsherlock, chiama questo metodosupportInvalidateOptionsMenu();
Shan Xeeshi,

3
Fai attenzione quando dici "immediatamente". Non accadrà veramente immediatamente. Quando invalidateOptionsMenu, un lavoro per (ri) creare il menu delle opzioni verrà aggiunto alla coda dei messaggi dell'interfaccia utente. Qualunque altra cosa sia in coda verrà eseguita per prima.
tir38,

21

Aggiunta nella risposta sopra, In caso di ICS e Honeycomb onCreateOptionsMenu viene chiamato dopo onCreate e onPostCreate mentre in Gingerbread e versioni precedenti viene chiamato dopo onCreate ma prima di onPostCreate. Questa è l'unica differenza che ho trovato.


3

Nella mia esperienza ActionBarActivitydal supporto v7 onCreateOptionsMenu()chiamato nel setContentView()metodo nel mezzo onCreate()è apparso su 4.1.1.

Ma il 4.4 un'altra storia onCreateOptionMenu()chiamata dopo onCreate(). Inoltre non so che potrebbe essere subito dopo, forse no. Ma è un fatto dopo. Non ho provato su altre versioni, ma la 4.1.1 è la prima in cui ho avuto problemi con l'ordine di init.


Forse devi usare supportInvalidateOptionsMenu()?
David d C e Freitas,

2

suggerisco di creare una funzione di callback nel frammento per evitare problemi di temporizzazione con onResume () e onCreateOptionsMenu ().

fare i seguenti lavori impeccabili per me:

  1. crea e aggiungi il tuo frammento alla tua attività
  2. lascia un riferimento a questo frammento nella tua attività
  3. crea un metodo pubblico doSomethingWithTheMenu () nel tuo frammento
  4. chiama questo metodo dall'interno della tua attività quando viene chiamato onCreateOptionsMenu (menu Menu).

esempio:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (this.myFragment != null) {
        this.myFragment.doSomethingWithTheMenu(menu);
    }
    return true;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.