ViewPager com fragmentos aninhados?

Meu problema

De acordo com os documentos do Google:

Agora você pode inserir fragmentos dentro de fragmentos. Isso é útil para uma variedade de situações nas quais você deseja colocar componentes de UI dinâmicos e reutilizáveis ​​em um componente de interface do usuário que seja dinâmico e reutilizável. Por exemplo,se você usar o ViewPager para criar fragmentos que deslize para a esquerda e para a direita e consuma a maioria do espaço na tela, você agora pode inserir fragmentos em cada página de fragmento. Para aninhar um fragmento, simplesmente chame getChildFragmentManager () no fragmento no qual você deseja adicionar um fragmento. Isso retorna um FragmentManager que você pode usar como normalmente faz da atividade de nível superior para criar transações fragmentadas. Por exemplo, aqui está um código que adiciona um fragmento de uma classe Fragment existente:

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

Então eu criei meu próprioPageFragment. E meuPageFragmentAdapterconsistem em 3 páginas dePageFragment. Eu também tenho seis fragmentos:Fragment1, Fragment2, Fragment3, FragmentA, FragmentB, FragmentC. No meuMainActivity Eu inicializo meus seis fragmentos, meuViewPager e os seusPageFragmentAdapter (que inicializam trêsPageFragment por si).

Então eu uso esse método para anexar meuFragment1, Fragment2, Fragment3 para cada página (para cadaPageFragment) doPageFragmentAdapter:

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

Eu posso receber (via métodos emPageFragmentAdapter) Fragmentos e fazer "fragmento aninhado" no meuPageFragment (claro que emonCreate()) gostar:

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

Nota: eu usoPageFragment.setNestedFragment() pôrmFragment nisso.

E isso funciona muito bem! Isso vai me ajudar (mas essa história não é sobre isso) simplesmente substituir fragmentos no ViewPager como:

tPageFragmentAdapter.replaceFirstPage(tFragmentA);

Mas eu tenho um grande problema. Mais uma vez, os documentos do Google:

Implementação do PagerAdapter que representa cada página como um fragmento que é persistentemente mantido no gerenciador de fragmentos, desde que o usuário possa retornar à página. Essa versão do pager é melhor quando há um punhado de fragmentos tipicamente mais estáticos para serem paginados, como um conjunto de guias.O fragmento de cada página o usuário as visitas serão mantidas na memória, embora sua hierarquia de visão possa ser destruído quando não visível. Isso pode resultar no uso de uma quantidade significativa de memória, pois as instâncias de fragmento podem manter uma quantidade arbitrária de estado.

Como você pode verPageFragmentAdapter pode destruir cada um meuPageFragment e, claro, seu fragmento aninhado. E quando for recriado, terá NULLmFragment valor. Eu estou tentando salvá-lo viagetChildFragmentManager().putFragment() e depois obtê-lo porgetChildFragmentManager().getFragment(). Mas isso não funcionou.

Questão

Então minha pergunta é:Como salvar meu fragmento aninhado no meu fragmento pai? É possível?

Eu agradeceria muito sua ajuda. Alex. P.S. Realmente sinto muito pelo meu inglês :)

EDITAR

Thx @ AndroidBegin.com pela resposta!

Isso parece ser um bug no suporte recém-adicionado para fragmentos aninhados. Basicamente, o FragmentManager filho acaba com um estado interno quebrado quando é desanexado da atividade. Uma solução temporária de curto prazo que o corrigiu para mim é adicionar o seguinte a onDetach () de cada Fragmento ao qual você chama getChildFragmentManager ():

@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);
    }
}

questionAnswers(1)

yourAnswerToTheQuestion