2012-11-07 2 views
18

Ich habe einen ViewPager mit einem FragmentPagerAdapter, und meine App hat zuvor nur zwei Fragmente (verschiedene Typen) ohne Probleme verwendet.Wie kann ich meinem benutzerdefinierten FragmentPagerAdapter mitteilen, dass er meine Fragmente nicht mehr zerstören soll?

Ich habe gerade ein drittes Fragment hinzugefügt, und jetzt scheint mein Adapter/Viewpager meine Fragmente zu zerstören, wenn ich weit weg von ihnen komme. Zum Beispiel, wenn ich auf Seite 1 bin, wird Seite 3 zerstört und neu erstellt, wenn ich in die Nähe komme. Wenn ich auf Seite 3 bin, passiert das gleiche auf Seite 1.

Dies verursacht viele Probleme in meiner App. Die Fragmente sind überhaupt nicht sehr RAM-lastig, also wie kann ich das verhindern?

+0

Ist es das Fragment oder die Zerstörung der Ansicht zu zerstören? – DeeV

+0

Ich bin mir nicht sicher. Wie würde ich nachsehen? –

+1

Sie haben gerade gesagt "es verursacht eine Menge Probleme." Wenn das Fragment zerstört wird, wird sein Zustand aus dem Speicher gelöscht und beim erneuten Laden auf die Standardwerte zurückgesetzt. – DeeV

Antwort

43

Ich glaube, Sie suchen nach ViewPager.setOffscreenPageLimit().

In Ihrem Fall sollte das Folgende Ihre Fragmente im Speicher behalten und sie nicht zerstören.

ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
pager.setOffscreenPageLimit(2); 

Ich vermute jedoch, dass Sie Ihren Ansichtszustand bei der Zerstörung nicht korrekt speichern. Deine Fragmente sollten korrekt behandelt werden, wenn sie zerstört/neu erstellt werden. Ihre Fragmente würden beispielsweise auch zerstört und neu erstellt, wenn eine Orientierungsänderung stattfindet. Es kann auch passieren, wenn der Benutzer Ihre Anwendung verlässt und das System später Speicher benötigt und Ihre Aktivität zerstört. Es sollte in der Lage sein, wieder zu öffnen und in dem gleichen Zustand wie zuvor zu sein. Wenn dies in der Tat das Problem für Sie ist, sollten Sie den Zustand in onSaveInstanceState() speichern. Der gespeicherte Status wird Ihnen unter onCreate angezeigt. Dort können Sie den Zustand des Fragments so initialisieren, dass es mit dem zerstörten identisch ist.

+0

Perfekt! Dies wird meine temporäre Lösung sein, bis ich meine Fragmente netzwerkunabhängiger machen kann. –

+0

das hat mir sehr geholfen! Vielen Dank! – JozeRi

+1

onSaveInstanceState() wird meistens nicht aufgerufen. Sie befinden sich z. B. auf Seite 1, wechseln Sie zu Seite 5: Das erste Fragment durchläuft beispielsweise onDestroyView(), aber nicht onSaveInstanceState(). In meinem Fall zumindest. – natario

4

außer Kraft setzen nur diese Methode in FragmentpagerAdapter

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
     // TODO Auto-generated method stub 
     super.destroyItem(ViewGroup container, int position, Object object); 
} 

entfernen super.destroyItem(ViewGroup container, int position, Object object);

aus dem Code

+0

Das funktioniert so lange, wie du dein Fragment niemals zerstören willst (selbst wenn der FragmentPagerAdapter den Gültigkeitsbereich verlässt). Dies könnte problematisch sein, aber in manchen Situationen ist es perfekt. Für diese Problemsituationen können Sie 'destroyItem (..)' immer selbst aufrufen. –

+0

Vielen Dank für diese Lösung :) –