Nach der Drehung wird onCreate() Fragment vor onCreate() FragmentActivity aufgerufen

Lesezeit: 3 Minuten

Benutzer-Avatar
AppiDevo

Ich verwende FragmentActivity und Fragments.

Wenn die Anwendung startet:

FragmentActivity onCreate() <------
FragmentActivity onStart()
FragmentActivity onResume()
Fragment onAttach()
Fragment onCreate() <------
Fragment onCreateView()
Fragment onActivityCreated()
Fragment onStart()
Fragment onResume()

Alles ist in Ordnung, FragmentActivity onCreate() wird vor Fragment onCreate() aufgerufen. Und wenn ich drehe:

Fragment onPause()
FragmentActivity onPause()
Fragment onStop()
FragmentActivity onStop()
Fragment onDestroyView()
Fragment onDestroy()
Fragment onDetach()
FragmentActivity onDestroy()
---
Fragment onAttach()
Fragment onCreate() <----------
FragmentActivity onCreate() <---------
Fragment onCreateView()
Fragment onActivityCreated()
Fragment onStart()
FragmentActivity onStart()
FragmentActivity onResume()
Fragment onResume()

Fragment onCreate() wird vor FragmentActivity onCreate() aufgerufen. Warum ist es inkonsistent?

In FragmentActivity onCreate() generiere ich einige Daten, die Fragment onCreate() bekommt. Aufgrund dieses seltsamen Verhaltens musste ich meinen Code von Fragment onCreate() nach Fragment onCreateView() verschieben, um sicherzugehen, dass meine Daten zuvor generiert wurden.

Ich verwende FragmentStatePagerAdapter, um Fragmente zu speichern, vielleicht ist das der Grund?

  • Also, was ist deine Lösung?

    – Levi

    28. August 2014 um 16:53 Uhr

  • @levi Füllen Sie Ihre Ansichten mit Daten in der Methode des onActivityCreated() Fragments. Oder überdenken Sie Ihre Architektur, in den meisten Fällen müssen Sie Ihre Daten nicht aus der Host-Aktivität beziehen. Und verwenden Sie Loader, wenn Sie ListView/RecyclerView mit dynamischen Daten haben. Das war meine endgültige Lösung, weil ich List in jedem Fragment hatte. Sie können auch die Nachrichtenbusbibliothek (EventBus, Otto, …) verwenden, um eine noch sauberere Architektur zu erhalten.

    – AppiDevo

    15. März 2017 um 9:06 Uhr


Benutzer-Avatar
Sam

Sie sollten bis zum nicht mit einer gültigen Aktivität rechnen onActivityCreated() Rufen Sie den Lebenszyklus des Fragments auf.

Wird aufgerufen, wenn die Aktivität des Fragments erstellt und die Ansichtshierarchie dieses Fragments instanziiert wurde. Es kann verwendet werden, um die endgültige Initialisierung durchzuführen, sobald diese Teile vorhanden sind, z. B. das Abrufen von Ansichten oder das Wiederherstellen des Zustands.

Die genauen Gründe, warum die Rebuild-Reihenfolge nicht linear ist, kann ich Ihnen nicht sagen. Es ist wahrscheinlich effizienter, jede Komponente in ihrem eigenen Tempo neu starten zu lassen, anstatt eine starre Reihenfolge zu erzwingen. Zum Beispiel ziehe ich es vor, dass mein LoaderManager so früh wie möglich startet und wir uns um das Layout für seinen Inhalt kümmern später.

(Ich liebe ein gutes Diagramm.)

Geben Sie hier die Bildbeschreibung ein

  • Es ist sicher, Loders in onActivityCreated() aufgrund eines Fehlers zu initialisieren, nicht früher. code.google.com/p/android/issues/detail?id=183783

    – AppiDevo

    15. März 2017 um 8:59 Uhr

  • Wow. Ich wusste nie, dass das Fragment mit der Aktivitätsinstanz als übergeben wird context durch onAttach() während Aktivität ist onCreate() kann noch aufgerufen oder beendet werden! Hat mir geholfen, einige seltsame Probleme in meiner App zu verstehen.

    – rpatabi

    24. Januar 2018 um 7:19 Uhr

Fragmente werden während der Aktivität wiederhergestellt onCreate(). Wichtig ist jedoch, dass sie in den Basis-Aktivitätsklassen wiederhergestellt werden onCreate(). Also wenn du anrufst super.onCreate() zuerst alle anderen Ihrer onCreate() -Methode wird ausgeführt, nachdem Ihre Fragmente wiederhergestellt wurden.

Eine mögliche Lösung besteht dann darin, Ihren Status wiederherzustellen oder zu berechnen, welche Daten Ihr Fragment benötigt VOR du rufst an super.onCreate()

Der Lebenszyklus sieht so aus:

ACTIVITY onCreate (pre-super)
FRAGMENT onAttach
ACTIVITY onCreate (post-super)

Also mach sowas:

@Override
public void onCreate( final Bundle savedInstanceState )
{
    Log.d( TAG, "ACTIVITY onCreate (pre-super)" );
    // Do your processing here
    super.onCreate( savedInstanceState ); // Fragments will be restored here
    Log.d( TAG, "ACTIVITY onCreate (post-super)" );
}

  • Ich kann Ihnen nicht genug für diese Antwort danken. suchte 2 ganze Tage nach einer Antwort auf ein solches Problem

    – Benutzer3213851

    28. Juli 2015 um 19:24 Uhr


  • Es ist erwähnenswert, dass Sie „Aktivitäten nicht behalten“ in den Entwicklereinstellungen aktivieren können, um dieses Verhalten ohne Konfigurationsänderungen auszulösen.

    – kaskal

    9. Januar 2017 um 19:32 Uhr

1186230cookie-checkNach der Drehung wird onCreate() Fragment vor onCreate() FragmentActivity aufgerufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy