Navigation Drawer onNavigationDrawerItemSelected wird vor MainActivity onCreate aufgerufen?

8

Ich habe ein neues Projekt mit der Template-Implementierung des Navigations-Schubladenfragments und einer MainActivity eingerichtet.

Es liefert mir die folgenden relevanten Methoden:

%Vor%

Meine MainActivity wird durch eine Splash-Aktivität gestartet, die ein gespeichertes Zugriffstoken über EXTRA_TOKEN erhält.

Dies ist die Überschreibung des Listenelements für die Navigationsschublade in MainActivity:

%Vor%

Es startet drei verschiedene Fragmente, je nachdem welches Element im NavDrawer ausgewählt ist. Während die neuen Fragmente instanziiert werden, wird die Zeichenfolge token in ihren Konstruktor übergeben, der zur weiteren Verwendung in der Klasse des Fragments gespeichert wird.

Beim ersten Start der App scheint jedoch onNavigationDrawerItemSelected vor onCreate ! Dies führt dazu, dass ich ein Nullwert-Token in die Fragmente übergebe, was dazu führt, dass sie alle durcheinander sind.

Wie ist das möglich? Wie ich es verstehe, sollte das NavigationDrawerFragment noch nicht eingerichtet worden sein!

Ich setze Haltepunkte sowohl für onCreate als auch für onNavigationDrawerItemSelected switch position = 0 . onNavigationDrawerItemSelected wird tatsächlich vor onCreate getroffen.

Wie kann ich sicherstellen, dass das Token zuerst abgerufen wird, bevor versucht wird, das onNavigationDrawerItemSelected zu behandeln?

Jede Hilfe wäre willkommen.

    
l3utterfly 21.05.2014, 08:40
quelle

4 Antworten

10

Ich glaube, ich habe es herausgefunden, wie es mir passierte, für jeden, der das durchsucht und keine Antwort findet.

Wenn Sie Android Studio DrawerActivity verwenden, gibt es einen Standardcode, den sie für Sie erstellen. In diesem Code in der activity_main.xml oder dem XML-Code, den DrawerActivity als Inhaltsansicht festlegt, gibt es ein Tag.

Wenn setContentView () in onCreate () aufgerufen wird, wird dieses Fragment automatisch erstellt und technisch wird onCreate () immer noch zuerst aufgerufen, aber dann wird die Methode onNavigationDrawerItemSelected () vor allem anderen in create aufgerufen. Da setContentView normalerweise oben gehalten wird, verursacht dies Probleme beim Speichern des Zustands der Fragmente in Ihrer Schublade.

Bewegen Sie einfach jeden Code, der nach savedInstanceBundle sucht, über setContentView () und das Problem wird behoben.

Beispiel mit Kommentaren:

%Vor%     
Eric 07.11.2014 17:20
quelle
1

Sie können die Absicht in einen Konstruktor verschieben und dort Ihre Token speichern:

%Vor%     
AndyRoid 21.05.2014 09:18
quelle
0

Was ich tun musste, um es funktionieren zu lassen, war zu überprüfen, ob die Seite geladen wurde, bevor onNavigationDrawerItemSelected

ausgeführt wurde %Vor%     
abinop 18.06.2015 03:59
quelle
0

Ich stimme auch der Verwendung eines Boolean zu, um zu überprüfen, ob onCreate () fertig geladen ist. Mein einziger anderer Vorschlag ist, dass Sie für eine schnelle Lösung onSectionAttached (int-Nummer) verwenden können, um jedes ausgewählte Element zu verarbeiten anstatt onNavigationDrawerItemSelected.

    
codebyjames 09.09.2015 12:32
quelle