Android Lifecycle-management der Bruchstücke in einem ViewPager und FragmentPagerAdapter

Ich kämpfen, um herauszufinden, was das richtige management von Fragmenten innerhalb einer FragmentActivity mit einem ViewPager ist. Bevor ich in die details gehen, eine kurze Zusammenfassung des Problems, das ich bin vor ist die folgende:

Ich habe eine FragmentActivity mit einem ViewPager. Die ViewPager verwendet eine benutzerdefinierte, doch sehr einfachen FragmentPagerAdapter. Jeder Fragment innerhalb der ViewPager verfügt über eine ExpandableListView. Ich habe auch ein action-bar die Schaltfläche "Aktualisieren". Für jetzt wollen wir davon ausgehen, dass die ViewPager hat nur eine Fragment. Die Aktivität angelegt wird, und die Fragment's ExpandableListView gefüllt ist (so weit so gut). Wenn der Refresh-button geklickt wird, wird die Handhabung der Methode innerhalb der FragmentActivity iteriert über die Liste der Fragments zugewiesen sind FragmentPagerAdapter und fordert refresh() auf jeden Fragment zum Auffüllen seiner ListView. Allerdings, wenn die Ausrichtung des Geräts ändert (z.B. von hochformat auf Querformat), die Tätigkeit ist neu-und so sind die Fragmente. Klicken auf die Schaltfläche Aktualisieren nun iteriert über die nicht-initialisiert Fragments.

Ich weiß, dass ich mich ganz vage, vor allem ohne sample-code, aber bitte Geduld mit mir. Ich habe verfolgt das problem und die Methode Aufrufe wie folgt ab dem Beginn der Anwendung/Tätigkeit:

  1. FragmentActivity.onCreate()
  2. FragmentActivity.setContentView()
  3. FragmentActivity.createPagerFragments() <-- dies erzeugt ein ArrayList-Fragmente und ordnet Sie zu einem neuen FragmentPagerAdapter die wiederum zugeordnet zu den ViewPager.
  4. Fragment.onAttach()
  5. Fragment.onCreate() <-- hier nichts besonderes, nur den Aufruf der super-Methode.
  6. Fragment.onCreateView() <-- hier nichts besonderes, sondern nur aufblasen das layout
  7. Fragment.onActivityCreated() <-- hier nichts.
  8. << Alles gute, Orientierung Veränderungen im hier >>
  9. FragmentActivity.onCreate()
  10. Fragment.onAttach()
  11. Fragment.onCreate()
  12. FragmentActivity.setContentView()
  13. FragmentActivity.createPagerFragments()
  14. Fragment.onCreateView()
  15. Fragment.onActivityCreated()
  16. << Refresh-button geklickt >>
  17. FragmentActivity.refresh() <-- iteriert über die neu erstellte Fragmente aus #13 (nicht die von Android!).
  18. << Absturz: NullPointerException für mExpandableListView im Fragment. >>

Also das problem, wie ich es sehe, ist wie folgt:
Wenn Android neu erstellt, die FragmentActivity und seine Views nach einem Wechsel der Bildschirm-Orientierung (Anrufe #9-15 oben), es schafft neue Fragment Objekte mit Ihrem Zustand wiederhergestellt, was die Originale waren. Jedoch diese werden, angezeigt werden, völlig verwaltet durch die FragmentManager, und nicht durch die FragmentPagerAdapter. Im Gegensatz dazu, wenn die FragmentPagerAdapter wird neu erstellt, zusammen mit der Fragments in der Aktivität onCreate - Methode (siehe call #13) die Fragments, die zugewiesen werden, um die adapter haben nie Ihre Fragment.onCreate() oder Fragment.onCreateView() aufgerufenen Methoden überhaupt. Also wenn die refresh () - Methode aufgerufen wird (siehe #17) die Methode iteriert über diese Fragments, die noch nicht initialisiert wurden. Daher, wenn Sie versuchen, sich zum Auffüllen der ExpandableListView, die Ansicht Instanz-variable ist NULL. Dies ist zu erwarten, wie die Instanz-variable wird nur zugewiesen, in der Fragment.onCreateView() Methode, die niemals aufgerufen wird, wird auf diese Fragments.

Also meine Frage ist: wie macht man richtig machen Weiterverwendung des re-neu (von Android) Fragments nach der Bildschirm-Orientierung geändert hat, um zu vermeiden, neue zu erstellen, das nicht initialisiert? Ich muss eine gültige Referenz auf, um zu rufen, deren refresh () - Methode, füllt Sie auf-Nachfrage. Idealerweise, sollten Sie auch zugewiesen werden, um die FragmentPagerAdapter als gut.

Ich hoffe, ich war klar bei der Beschreibung des Problems und der Grund, dass ich keine Beispiel-code ist da das problem (wie man sehen kann) ist nicht aus dem code selbst, sondern von einem eher falsch (seemigly) re-creation der Fragmente eher als re-use. Aber wenn nötig, kann ich Ihnen Beispiel-code, den ich nur durch diese Art wäre übersichtlicher.

Danke!

Hi! Ich habe das gleiche Problem, wie hast du es behoben, denn die Antwort unten nicht sehr nützlich)

InformationsquelleAutor vmivanov | 2013-12-03

Schreibe einen Kommentar