2017-05-21 2 views
0

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

+0

So funktioniert ViewPager. Was ist deine Frage? – Juan

+0

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 –

Antwort

1

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.

+0

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 –

+0

Bist du sicher, dass du nicht alte verworfene Instanzen der Fragmente ansiehst? – Juan

+0

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 –

0

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.

Verwandte Themen