Ich habe ViewPager mit Adapter, wo ich Fragment instantiieren und es in getItem() -Methode zurückgeben. Also wenn ich auf der ersten Seite bin, habe ich nur 2 Fragmente am Leben. Wenn ich das Telefon rotiere, werden sie beide zerstört und Müll gesammelt (System ruft ihre onDestroy() und onDetach() auf und ich kann sie in .hprof Speicherabbild als bereit sehen, um Müll gesammelt zu werden). Wenn jedoch eine neue Aktivität mit einem neuen Viewpager und zwei neuen Fragmenten erstellt wird, erzeugt das System aus irgendeinem Grund zwei weitere Fragmente für diejenigen, die zuvor zerstört wurden, und hängt sie an die Aktivität an, während sie dem viewPager überhaupt nicht hinzugefügt werden. Sie sitzen nur in den mactive- und mAdded-Arrays von fragmentManager. Wenn ich das Gerät einige Male rotiere, erstellt es jedes Mal diese neuen Instanzen. Nun, das mag wie ein Leck aussehen, das bewirkt, dass Fragmente nicht als Müll gesammelt werden, aber sie sind es tatsächlich. Alle diese Fragmente haben eine unterschiedliche @xxx-Nummer und werden an eine neue Aktivität in einem neuen Fragmentmanager angehängt. Ich habe alles versucht, jede Hilfe oder Vorschläge werden sehr geschätzt, danke!Fragmente reintiantiating und Hinzufügen zur Aktivität selbst
Antwort
ViewPager behandelt den Lebenszyklus der angezeigten Fragmente. Wie du es erwähnst, erzeugt es das sichtbare Fragment und die daneben liegenden (falls mit einer FragmentStatePagerAdapter
verwendet), um in der Lage zu sein, sanft in sie hineinzuwischen, wenn die Zeit gekommen ist. Wenn das Fragment außer Sichtweite ist, kann es nach seinem Willen durch die ViewPager
destoriert und neu erstellt werden.
Die Standardeinstellung für einen rotierenden Bildschirm ist, dass die Aktivität zusammen mit ViewPager
und Fragments
erneut erstellt wird. Dies kann jedoch geändert werden. Mit android:configChanges="orientation"
im Manifest können Sie verhindern, dass die Aktivität bei einer Orientierungsänderung neu erstellt wird. Die andere Möglichkeit, die Fragmentinstanz bei einer Orientierungsänderung zu erhalten, besteht darin, in dem zu behaltenden Fragment setRetainInstance(true)
aufzurufen.
Nun, das ist fast das, was in meinem Fall passiert. Ich schaue auf die erste Seite, dann drehe ich den Bildschirm. Aktivität wird zerstört, Fragmente werden zerstört. Neue Aktivität erstellt mit neuem Fragmentmanager und neuem Viewpager mit neuem Adpater. Der Fragmentmanager erstellt jetzt zwei neue Fragmente und fügt sie der Aktivität und dem Adapter von ViewPager hinzu. So weit, so gut, aber was passiert, ist zusätzlich, dass FragmentManager 2 weitere Fragmente erstellt und sie NUR an Aktivitäten anhängt, ohne sie dem Adapter von viewpager hinzuzufügen. Jetzt habe ich 4 Fragmente. Wenn ich wieder rotiere, erzeugt es 2 normale Fragmente und 4 davon. Und so weiter –
Bist du sicher, dass du nicht alte verworfene Instanzen der Fragmente ansiehst? – Juan
Ich habe breakpiont in onCreateView dieses Fragments. Zuerst gebe ich die Aktivität ein, die zweimal aufgerufen wird. nach der ersten Drehung 4 mal, dann 6 mal und so weiter. Diese Fragmente werden verworfen. aber an ihrer Stelle schafft es immer eine gleiche Menge von ihnen und 2 weitere, die hinzugefügt und dem Benutzer angezeigt werden –
Also ich war es (unerwartet: D) schlechter Code. Ich hatte in meinem Activity onRestoreInstanceState() Stück Code, der neue Adapter erstellt und gesetzt hat und so alte Fragmente in den Hintergrund stellt. Tut mir leid, dass ich mich mit einer unbeantwortbaren Frage beschäftigt habe.
- 1. Fragmente zur Aktivität hinzufügen
- 2. Widget zur Aktivität hinzufügen
- 3. Fragmente: Aktivität nicht gefunden?
- 4. Fragmente in Aktivität
- 5. TextView dynamisch zur Aktivität hinzufügen
- 6. Android onBackPressed() kommt zurück zur vorherigen Fragmente/Aktivität
- 7. Kommunikation zwischen Fragmente und Aktivität in Android
- 8. Unterschied zwischen ActionBarActivity und Fragmente Aktivität
- 9. Drei Fragmente in einer Aktivität
- 10. zwei Fragmente nebeneinander hinzufügen
- 11. Android Tab Fragmente laden zur gleichen Zeit
- 12. Hinzufügen des Navigationssymbols zur Aktivität nicht möglich
- 13. Aktivität Navigation: benutzerdefinierte Animation mit popEnter und popExit wie Fragmente
- 14. Aktivität kann nicht eine andere Aktivität stoppen und dann selbst
- 15. zu Fragmente von Aktivität A von Aktivität B
- 16. Fragmente und onConfigurationChanged
- 17. Speichern von Zuständen mehrerer Fragmente in Aktivität
- 18. Pflegen Fragmente-Backstack der vorherigen Aktivität
- 19. Anzeige Suchergebnisse in einem Fragmente, nicht Aktivität
- 20. Wie 2 Fragmente innerhalb einer Aktivität enthalten
- 21. Android Zwei Fragmente in derselben Aktivität
- 22. Aufruf AsyncTask in Fragmente aus einer Aktivität
- 23. wie zurück zu handhaben drücken Sie in Fragmente und Aktivität
- 24. Fragment Aktivität fangen onKeyDown und Verwendung in Fragmente
- 25. Zurück zur vorherigen Aktivität
- 26. Variablen zur nächsten Aktivität
- 27. Android FragmentTab Host und Fragmente innerhalb Fragmente
- 28. Zurück zur vorherigen Aktivität?
- 29. Hinzufügen halbtransparenten Overlay zu Aktivität Hintergrund zur Laufzeit
- 30. Android: Verwalten Sie Fragmente in der Kette von Aktivität
So funktioniert ViewPager. Was ist deine Frage? – Juan
Nun, ich habe andere ViewPager, die ich in ähnlicher Weise verwende, und sie tun es nicht. Es werden immer nur Fragmente angezeigt und die daneben. aber wenn ich das Telefon rotiere, werden sie alle zerstört und nicht wieder neu erstellt. Ich meine, der viewPager funktioniert wahrscheinlich wie erwartet, weil er alle Fragmente auf der Bildschirmrotation zerstören sollte. Ich verstehe einfach nicht, warum sie ohne Zweck neu erstellt werden –