Android: Wann wird onCreateOptionsMenu während des Aktivitätslebenszyklus aufgerufen?

149

Ich habe ein paar Haltepunkte eingefügt onCreate(einen am Anfang und einen am Ende der Methode) und einen am Anfang von onCreateOptionsMenu. Die onCreateMethode wird zuerst aufgerufen und vor dem Abschluss onCreateOptionsMenuaufgerufen.

Ich versuche, den FragmentNavigationscode in meiner App zu trennen , daher habe ich einige Objekte, an die ich delegieren kann onCreateOptionsMenu, je nachdem, ob die App auf einem Telefon / Tablet ausgeführt wird (ich verwende die Bildschirmgröße, um dies zu bestimmen, meine Layoutdatei für Bei großen Bildschirmen wird eine Ansicht angezeigt, nach der ich nach dem Aufblasen des Layouts suche. Das Problem, das ich habe, ist, dass ich diese Objekte in onCreate erstelle und eine Nullzeigerausnahme erhalte, wenn ich auf das Objekt in verweise onCreateOptionsMenu.

Christopher Perry
quelle

Antworten:

112

Die onCreate-Methode wird zuerst aufgerufen und vor Abschluss wird onCreateOptionsMenu aufgerufen.

Dies gilt für Geräte und Apps mit einer offiziellen Aktionsleiste im Honeycomb-Stil. Wenn es keine Aktionsleiste gibt, onCreateOptionsMenu()sollte diese erst aufgerufen werden, wenn der Benutzer das Menü aufruft, normalerweise durch Drücken der Taste MENU.

(Ich verwende die Bildschirmgröße, um dies zu bestimmen. Meine Layoutdatei für große Bildschirme enthält eine Ansicht, auf die ich nach dem Aufblasen des Layouts überprüfe.)

Dieser Test wird sehr bald abgebrochen, sobald Ice Cream Sandwich ausgeliefert wird. Soweit ich weiß, haben ICS-Telefone Aktionsleisten (wenn auch möglicherweise keine Systemleisten).

CommonsWare
quelle
Ich habe vergessen zu erwähnen, dass ich die ActionbarSherlock-Bibliothek verwende. Ihre Antwort erinnerte mich. Dies ist wahrscheinlich der Grund für dieses Verhalten, da es sich um einen Wrapper in der Kompatibilitätsbibliothek handelt, der die Menüelemente in die "ActionBar" einfügt.
Christopher Perry
@commonsware - Das bedeutet auf Geräten und Apps, die keine Aktionsleiste haben. Das Menü wird angezeigt, auch wenn in onCreateOptionsMenu kein Element sichtbar ist.
NinjaCoder
12
in meinem Fall onCreateMenu Anruf nach onResume
Kostya Khuta
1
Ja, ich habe das gleiche Problem ... Aber mein Code bezieht sich auf ein Fragment.
Yoann Hercouet
Ich fing an zu haben, NPEals ich überprüfte, ob das nav drawer fragmentoffen war onCreateOptionsMenu. Ich musste sowohl im onCreateOptionsMenu der Aktivität als auch im Rückruf, den das Fragment in seinem onCreateOptionsMenu verwendete, Nullprüfungen durchführen. Wirklich komisch, weil es nur auf ein paar Bildschirmen passierte, aber konsequent auf diesen.
Theblang
54

In meinem Fall unter Android 2.3 und mit FragmentActivityder v4-Support-Bibliothek ist die Reihenfolge der aufgerufenen Lebenszyklusmethoden wie folgt:

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
quelle
27

Ich habe festgestellt, ob ich in onResume () anrufe

invalidateOptionsMenu();

Anschließend wird onCreateOptionsMenu (Menü Menü) aufgerufen - gemäß dem Aktivitätslebenszyklus (ich denke, das ist hier der richtige Begriff) , wie durch @ tir38 angegeben

@Override
public void onResume() {
    super.onResume();
    invalidateOptionsMenu();
}
Gene Bo
quelle
4
Wenn Sie Actionbarsherlock verwenden, rufen Sie diese Methode aufsupportInvalidateOptionsMenu();
Shan Xeeshi
3
Seien Sie vorsichtig, wenn Sie "sofort" sagen. Es wird nicht wirklich sofort passieren. Wenn Sie invalidateOptionsMenueinen Job zum (erneuten) Erstellen des Optionsmenüs erstellen, wird er der Nachrichtenwarteschlange der Benutzeroberfläche hinzugefügt. Was sich sonst noch in der Warteschlange befindet, wird zuerst ausgeführt.
Tir38
21

Ergänzung in der obigen Antwort: Bei ICS und Honeycomb wird onCreateOptionsMenu nach onCreate und onPostCreate aufgerufen, während es in Gingerbread und früheren Versionen nach onCreate, aber vor onPostCreate aufgerufen wird. Das ist der einzige Unterschied, den ich gefunden habe.

Pawan Maheshwari
quelle
3

Nach meiner Erfahrung ActionBarActivityaus Support v7 wird die onCreateOptionsMenu()aufgerufene setContentView()Methode in der Mitte onCreate()auf 4.1.1 angezeigt.

Aber auf 4.4 onCreateOptionMenu()rief eine andere Geschichte nach onCreate(). Ich weiß auch nicht, dass es unmittelbar danach sein kann, vielleicht auch nicht. Ist aber Tatsache nach. Ich habe nicht auf anderen Versionen getestet, aber 4.1.1 war zuerst, wo ich Probleme mit der Init-Reihenfolge hatte.

Jewgen Kulik
quelle
Vielleicht müssen Sie verwenden supportInvalidateOptionsMenu()?
David d C e Freitas
2

Ich schlage vor, eine Rückruffunktion in Ihrem Fragment zu erstellen, um Zeitprobleme mit onResume () und onCreateOptionsMenu () zu vermeiden.

Folgendes zu tun funktioniert für mich einwandfrei:

  1. Erstellen Sie Ihr Fragment und fügen Sie es Ihrer Aktivität hinzu
  2. Hinterlassen Sie eine Referenz dieses Fragments in Ihrer Aktivität
  3. Erstellen Sie eine öffentliche Methode doSomethingWithTheMenu () in Ihrem Fragment
  4. Rufen Sie diese Methode innerhalb Ihrer Aktivität auf, wenn onCreateOptionsMenu (Menü menu) aufgerufen wird.

Beispiel:

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