ViewPager + FragmentStatePagerAdapter + Ausrichtung ändern
Ich habe ein kleines Problem: ich habe einen ViewPager mit einigen Seiten und ich benutze die FragmentStatePagerAdapter, um die Daten zu verarbeiten. Im hoch-ich habe zum Beispiel 20 Seiten für den ViewPager und in der Landschaft ich habe gerade 10 Seiten für den ViewPager. Also auf eine Orientierung ändern, erstelle ich einen neuen Adapter mit unterschiedlichen Daten.
Hier eine kleine Erklärung, warum: ich zeige ein Bild im hochformat und zwei im Querformat, aber immer alles in Anzahl. Wenn ich 10 Bilder zu zeigen, habe ich 10 im hochformat, und 5 in der Landschaft (immer zwei).
Nun habe ich aber einen merkwürdigen Fehler:
Wenn ich im Querformat auf index 5 und schalten Sie das Gerät, den ViewPager die aktuelle Seite ist auf 10 gesetzt. Wenn ich schalten Sie es wieder ich bin auf Seite 5. Wenn ich wischen die ViewPage-jetzt bis Seite 10 die methode getItem der adapter ist nie genannt und die ViewPage-zeigt mir ein portrait-Bild und nicht die zwei für die Landschaft.
Wie kann das passieren? Gibt es einen cache, in den adapter oder ViewPager? In der onCreate der Activity-alles ist neu erstellt, die adapter und auch die Daten (nur strings mit Pfad) für den ViewPager.
So eine Idee wie man dieses Problem beheben wirklich beängstigend "feature"?
Hier sind einige code:
onCreate:
mViewPagerAdapter = new ReaderPageViewAdapter(getSupportFragmentManager(), getBaseContext(), mCurrentDocument.mPages, getResources()
.getConfiguration().orientation);
mPageReader = (ReaderViewPager) findViewById(R.id.pager);
mPageReader.setAdapter(mViewPagerAdapter);
adapter getItem:
public Fragment getItem(final int index) {
final PageInfo pageInfo = mPages.get(index);
final PageFragment pageFragment = (PageFragment) PageFragment
.instantiate(mContext, pageInfo.mClss.getName(), pageInfo.mArgs);
return pageFragment;
}
Wenn Sie etwas brauchen, mehr mir nur sagen. Dank
InformationsquelleAutor Informatic0re | 2012-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie überschreiben die FragmentActivity onSaveInstanceState() und rufen Sie die super.onSaveInstanceState() in der Methode.
Nicht verwenden
mViewPager.setSaveEnabled(false);
es endete mit einem großen memoryLeak. Nach jeder änderung der Orientierung es stellt sich die Fragmente in einem array der FragmentManager und nie gereinigt. So geht es bis zu über 100mb Speicher-Nutzung nach der änderung der Ausrichtung, viele Male. Mit der onSaveInstanceState-Methode ist der bessere Weg, denke ich.
Tut mir Leid, zu Fragen, so spät, aber hast du jemals herausfinden, was in super.onSaveInstanceState(outState) lag die Ursache für dieses unerwartete Verhalten ? Vielen Dank im Voraus ! 😉
Ja, es ist spät 🙂 in onSaveInstanceState gespeichert, die Fragmente in einem Array, das wird nie gereinigt. Ohne Aufruf von super, Sie nicht speichern Sie die Fragmente in dieses arrays.
Ich habe view pager-Staat-problem, aber nicht die gleiche Bedingung. Meine Frage ist, hier. Ich habe als ur Antwort aber es funktioniert nicht.
Es löst mein problem. Ich danke Ihnen so sehr.
InformationsquelleAutor Informatic0re
Ich auch aufgetreten ist dieses problem und ich habe den Grund gefunden.
Je Bild gedreht, Die
FragmentManager
behalten alle Ihre Aktivitäten gehostet Fragmente, wou nicht entfernen-Fragmente bei Verwendung vonFragmentStatePagerAdapter
verwenden, können SieFragmentManager.getFragments()
zu überprüfen, die Anzahl der Fragmente.Beispiel: Die Aktivität hat 4 Fragmente, Nach 4 mal die Ausrichtung ändern, Die Liste
FragmentManager.getFragments()
Größe 20!Ich einige Lösungen gefunden:
Nicht nennen, die
super.onSaveInstanceState()
von Ihnen Aktivität, Aber Es scheint keine gute Lösung, Fragmente, nicht Zustand speichern und wiederherstellen.Verwenden
FragmentPagerAdapter
stattFragmentStatePagerAdapter
.Aber nach der Ausrichtung geändert, Die Fragmente, die
ViewPager
gehostet wurde ausgeblendet(Hat jemand anderes dasselbe problem?). Aber ich kann entfernen Sie alle Bruchstücke inActivity.onCreate
um es zu beheben. wie diese:Aber die
Fragment.onCreateView()
zweimal angerufen.Ich bin noch auf der Suche nach der perfekten Lösung 😀
Edit:
Ich endlich das problem gelöst, Es ist die Ursache von mein ViewPager ist, fügen Sie nach der onStart. Wenn Sie ausführen, um onStart, Die
FragmentManager
wird versuchen, wieder Fragmente Zustand. Ich verfolgte inFragmentManager
Haben diesen code:com/android/support/support-fragment/24.2.1/support-fragment-24.2.1-sources.jar!/android/support/v4/app/FragmentManager.java
Überprüfen Sie die Zeile hervorheben, Die
f.mContainerId
eigentlich ist mein ViewPager-id. Dann wird es versuchen, fügen Sie Fragmente anzeigen zu ViewPager, In meinem Fall, Der ViewPager wird nicht fügen Sie noch, So wird es ausgeblendet werden, Aber Fragmente Zustand sindATTACHED
. Und inFragmentPagerAdapter.instantiateItem()
, Wenn das fragment Hinzugefügt wurde, war Es nur tunattach
fragment, Aber das fragment ist bereits angebracht, So dass Ihr nichts tun 🙁Füge ich ViewPager zu Aktivität layout-XML, fixed.
Glücklich Kodierung 😀
InformationsquelleAutor TJT
Nur Sie verwenden im viewPager.setonpagechangelistener und implementieren für code benötigen, wenden Sie Ihre Anwendung,
http://developer.android.com/reference/android/support/v4/view/ViewPager.html
InformationsquelleAutor Najib Puthawala