ViewPager mit verschachtelten Fragmenten?

Mein Problem

Nach den Google-Dokumenten:

Sie können nun Fragmente in Fragmente einbetten. Dies ist in einer Reihe von Situationen hilfreich, in denen Sie dynamische und wiederverwendbare UI-Komponenten in eine UI-Komponente einfügen möchten, die selbst dynamisch und wiederverwendbar ist. Zum Beispiel,Wenn Sie ViewPager verwenden, um Fragmente zu erstellen, die Streichen Sie nach links und rechts und belegen Sie einen Großteil des Bildschirms kann nun Fragmente in jede Fragmentseite einfügen. Um ein Fragment zu verschachteln, rufen Sie einfach getChildFragmentManager () auf dem Fragment auf, zu dem Sie ein Fragment hinzufügen möchten. Dies gibt einen FragmentManager zurück, den Sie wie gewohnt aus der Aktivität auf oberster Ebene zum Erstellen von Fragmenttransaktionen verwenden können. Im Folgenden finden Sie beispielsweise Code, der ein Fragment aus einer vorhandenen Fragment-Klasse hinzufügt:

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

Also habe ich meine eigene kreiertPageFragment. Und meinPageFragmentAdapterbestehen aus 3 seiten vonPageFragment. Ich habe auch sechs Fragmente:Fragment1, Fragment2, Fragment3, FragmentA, FragmentB, FragmentC. In meinemMainActivity Ich initialisiere meine sechs FragmenteViewPager und seinPageFragmentAdapter (die drei initialisierenPageFragment für sich selbst).

Dann benutze ich diese Methode, um meineFragment1, Fragment2, Fragment3 zu jeder Seite (zu jederPageFragment) vonPageFragmentAdapter:

PageFragmentAdapter tPageFragmentAdapter = new PageFragmentAdapter(getSupportFragmentManager());
tPageFragmentAdapter.setFirstPage(tFragment1);
tPageFragmentAdapter.setSecondPage(tFragment2);
tPageFragmentAdapter.setThirdPage(tFragment3);

Ich kann empfangen (über Methoden inPageFragmentAdapter) Fragmente und mache "verschachteltes Fragment" zu meinemPageFragment (natürlich inonCreate()) mögen:

getChildFragmentManager().beginTransaction()
.add(R.id.framelayout_history, mFragment)
.addToBackStack(null)
.commit();

Anmerkung: Ich benutzePageFragment.setNestedFragment() zu setzenmFragment drin.

Und es funktioniert super! Es wird mir helfen (aber in dieser Geschichte geht es nicht darum), Fragmente in ViewPager einfach zu ersetzen, wie:

tPageFragmentAdapter.replaceFirstPage(tFragmentA);

Aber ich habe ein großes Problem. Nochmals Googles Dokumente:

Implementierung von PagerAdapter, der jede Seite als Fragment darstellt, das dauerhaft im Fragment-Manager gespeichert bleibt, solange der Benutzer zur Seite zurückkehren kann. Diese Version des Pagers eignet sich am besten, wenn eine Handvoll von normalerweise statischeren Fragmenten durchgeblättert werden muss, z. B. eine Reihe von Registerkarten.Das Fragment jeder Seite des Benutzers Besuche werden im Speicher behalten, auch wenn die Ansichtshierarchie dies zulässt zerstört, wenn nicht sichtbar. Dies kann zu einem erheblichen Speicherbedarf führen, da Fragmentinstanzen eine beliebige Menge an Status beibehalten können.

Wie du siehstPageFragmentAdapter kann jeden zerstörenPageFragment und natürlich sein verschachteltes Fragment. Und wenn es neu erstellt wird, hat es stattdessen einen NULL-WertmFragment Wert. Ich versuche es über zu speicherngetChildFragmentManager().putFragment() und dann hol es dirgetChildFragmentManager().getFragment(). Aber es hat nicht funktioniert.

Frage

Meine Frage lautet also:Wie speichere ich mein verschachteltes Fragment in meinem übergeordneten Fragment? Ist es möglich?

Ich würde mich sehr über Ihre Hilfe freuen. Alex. P.S. Entschuldigung für mein Englisch :)

BEARBEITEN

Thx @ AndroidBegin.com für die Antwort!

Dies scheint ein Fehler in der neu hinzugefügten Unterstützung für verschachtelte Fragmente zu sein. Grundsätzlich hat der untergeordnete FragmentManager einen fehlerhaften internen Status, wenn er von der Aktivität getrennt wird. Eine kurzfristige Problemumgehung, die es für mich behoben hat, besteht darin, Folgendes zu onDetach () jedes Fragments hinzuzufügen, auf dem Sie getChildFragmentManager () aufrufen:

@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage