FragmentPagerAdapter erstellt keine Fragmente bei einer Orientierungsänderung?

8

Ich habe eine ViewPager (erweitert FragmentPagerAdapter ) die zwei Fragments enthält. Was ich brauche ist nur ein ListView für jedes Fragment zu aktualisieren, wenn ich zwischen ihnen wische. Dafür habe ich ViewPager.OnPageChangeListener interface implementiert (nämlich onPageScrollStateChanged ). Um Referenzen auf Fragment s zu halten, verwende ich HashTable . Ich speichere Referenzen auf Fragments in HashTable in getItem() Methode:

%Vor%

Also, wenn ich von einem Fragment zu einem anderen wische, die onPageScrollStateChanged Trigger, wo ich die HashTable verwende um die benötigte Methode in Fragments (refresh) aufzurufen:

%Vor%

Alles geht gut, bis orientation change event passiert. Danach ist der Code in refresh() method, was ist:

%Vor%

Ergebnisse in IllegalStateException :

%Vor%

Unter der Annahme, dass die Content -Ansicht nicht wirklich erstellt wurde, setzte ich die boolean Variable in onActivityCreated() Methode auf true und verwendete if/else Bedingung auf getListView() oder nicht, was die Aktivitäts- und Inhaltsansicht zeigte erfolgreich erstellt.

Dann habe ich debuggt um zu sehen, wenn FragmentPagerAdapter getItem() aufruft und es passiert, dass die Methode nicht nach orientation change event aufgerufen wird. Sieht so aus, als ob ViewPager Referenzen auf alte Fragments enthält. Das ist nur meine Annahme.

Also, gibt es eine Möglichkeit, das ViewPager so zu erzwingen, dass getItem() erneut aufgerufen wird, damit ich die richtigen Referenzen auf das aktuelle Fragments verwenden kann? Kann eine andere Lösung sein? Vielen Dank.

    
Eugene 03.09.2012, 22:02
quelle

2 Antworten

4
  

Dann habe ich debuggt, um zu sehen, wann FragmentPagerAdapter getItem () aufruft und es passiert, dass die Methode nicht nach dem Ereignis der Orientierungsänderung aufgerufen wird. Es sieht also so aus, als ob ViewPager Verweise auf alte Fragmente enthält.

Die Fragmente sollten automatisch neu erstellt werden, genau wie jedes Fragment bei einer Konfigurationsänderung. Die Ausnahme wäre, wenn Sie setRetainInstance(true) verwendet hätten. In diesem Fall sollten sie dieselben Fragmentobjekte wie zuvor sein.

  

Gibt es also eine Möglichkeit, den ViewPager so zu erzwingen, dass er getItem () erneut aufruft, damit ich die richtigen Verweise auf aktuelle Fragmente verwenden kann?

Was stimmt nicht mit den Fragmenten, die da sind?

    
CommonsWare 03.09.2012, 22:11
quelle
0

Ich habe einige Tage damit verbracht, nach einer Lösung für dieses Problem zu suchen, und viele Punkte wurden herausgefunden:

  • Verwenden Sie FragmentPagerAdapter anstelle von FragmentStatePagerAdapter

  • Verwenden Sie FragmentStatePagerAdapter anstelle von FragmentPagerAdapter

  • gibt POSITION_NONE auf getItemPosition override von FragmentPagerAdapter

  • zurück
  • Verwenden Sie FragmentPagerAdapter nicht, wenn Sie dynamische Änderungen von Fragmenten benötigen

  • und viele, viele, viele andere ...

In meiner App, wie Eugene , habe ich mir die Instanzen der erstellten Fragmente selbst gemanagt. Ich behalte das in einem HashMap<String,Fragment> in einer speziellen Klasse, also werden die Fragmente nie freigegeben, was meine App beschleunigt (aber mehr Ressourcen verbraucht).

Das Problem war, wenn ich mein Tablet (und Telefon) rotiere. Das getItem(int) wurde für dieses Fragment nicht mehr aufgerufen, und ich konnte es nicht ändern.

Ich habe wirklich viel Zeit gebraucht, bis ich wirklich eine Lösung gefunden habe, also muss ich sie mit der StackOverflow-Community teilen, die mir so oft hilft ...

Die Lösung für dieses Problem, obwohl die harte Arbeit, es zu finden, ist ziemlich einfach:

Behalte einfach den Verweis auf FragmentManager im Konstruktor von FragmentPagerAdapter extends:

%Vor%

Das ist alles. Und es wird wie ein Zauber wirken ...

    
alijunior 08.07.2014 03:57
quelle

Tags und Links