ViewPager avec Imbriqué des Fragments?

Mon problème

Selon les Google docs:

Vous pouvez maintenant intégrer des fragments à l'intérieur des fragments. Cela est utile pour un
variété de situations dans laquelle vous voulez placer dynamique et ré-utilisable
Composants de l'INTERFACE utilisateur dans un composant de l'INTERFACE utilisateur qui est elle-même dynamique et
ré-utilisable. Par exemple, si vous utilisez ViewPager pour créer des fragments qui
balayez vers la gauche et la droite et de consommer la majorité de l'espace de l'écran, vous
pouvez maintenant insérer des fragments dans chaque fragment de page. Pour imbriquer un fragment,
appelez simplement getChildFragmentManager() sur le Fragment dans lequel vous
souhaitez ajouter un fragment. Cette fonction retourne une FragmentManager que vous pouvez
utiliser comme vous le faites normalement à partir du haut niveau d'activité pour créer
fragment de transactions. Pour exemple, voici un code qui ajoute un
fragment de l'intérieur d'un Fragment de la classe:

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

J'ai donc créé mon propre PageFragment. Et mon PageFragmentAdapterse composent de 3 pages de PageFragment.
J'ai aussi six fragments de: Fragment1, Fragment2, Fragment3, FragmentA, FragmentB, FragmentC.
Dans mon MainActivity j'initialise mes six fragments, mon ViewPager et ses PageFragmentAdapter (qui initialise les trois PageFragment pour lui-même).

Puis-je utiliser cette méthode pour joindre mon Fragment1, Fragment2, Fragment3 à chaque page (à chaque PageFragment) de PageFragmentAdapter:

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

Je peux recevoir (par l'intermédiaire des méthodes dans PageFragmentAdapter) des Fragments et de faire "imbriqués fragment" dans mon PageFragment (bien sûr, dans onCreate()) comme:

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

Remarque: j'utilise PageFragment.setNestedFragment() pour définir mFragment en elle.

Et il fonctionne très bien!
Il va m'aider (mais cette histoire n'est pas le sujet) de remplacer simplement les fragments dans ViewPager comme:

tPageFragmentAdapter.replaceFirstPage(tFragmentA);

Mais j'ai un énorme problème.
Nouveau Google docs:

Mise en œuvre de PagerAdapter que représente chaque page comme un Fragment
qui est constamment maintenu dans le fragment gestionnaire de l'utilisateur
pouvez retourner à la page. Cette version du pager est le meilleur pour une utilisation lors de
il ya une poignée généralement plus statique fragments paginé
à travers, comme un ensemble d'onglets. Le fragment de chaque page de l'utilisateur
visites seront gardés en mémoire, même si son point de vue de la hiérarchie peut être
détruit lorsqu'il n'est pas visible. Cela peut conduire à une importante
quantité de mémoire depuis fragment de cas peut s'accrocher à un arbitraire
montant de l'etat.

Comme vous pouvez le voir PageFragmentAdapter peut détruire chaque mon PageFragment et bien sûr, il est imbriqué fragment. Et quand il sera recréé, il aura une valeur NULL au lieu mFragment valeur.
Je suis en train de l'enregistrer via getChildFragmentManager().putFragment() et obtenir ensuite par getChildFragmentManager().getFragment(). Mais il n'a pas travaillé.

Question

Donc ma question est: Comment faire pour enregistrer mon imbriquée fragment de ma mère fragment? Est-il possible?

Je serais très reconnaissant pour votre aide. Alex. P. S. Vraiment désolé pour mon anglais:)

MODIFIER

Thx @AndroidBegin.com pour la réponse!

Ce qui semble être un bug dans le nouvellement ajouté le support pour les sous
des fragments. Fondamentalement, l'enfant FragmentManager se retrouve avec une fracture de la
interne de l'état lorsqu'il est détaché de l'activité. À court terme
solution de contournement qu'il fixe, pour moi, est d'ajouter les éléments suivants à onDetach()
de chaque Fragment que vous appelez getChildFragmentManager() sur:

@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);
    }
}
  • Aidez-moi! Partagez votre idée!
InformationsquelleAutor AlexMomotov | 2013-09-24