ViewPager con fragmentos anidados?

Mi problema

Según la documentación de Google:

Ahora puedes incrustar fragmentos dentro de fragmentos. Esto es útil para una variedad de situaciones en las que desea colocar componentes de UI dinámicos y reutilizables en un componente de UI que sea dinámico y reutilizable. Por ejemplo,Si usa ViewPager para crear fragmentos que desliza el dedo hacia la izquierda y hacia la derecha y consume la mayor parte del espacio de la pantalla, Ahora puede insertar fragmentos en cada página de fragmentos. Para anidar un fragmento, simplemente llame a getChildFragmentManager () en el Fragmento en el que desea agregar un fragmento. Esto devuelve un FragmentManager que puede usar como lo hace normalmente en la actividad de nivel superior para crear transacciones fragmentarias. Por ejemplo, aquí hay un código que agrega un fragmento desde dentro de una clase Fragment existente:

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

Así que creé mi propiaPageFragment. Y miPageFragmentAdapterconstan de 3 páginas dePageFragment. También tengo seis fragmentos:Fragment1, Fragment2, Fragment3, FragmentA, FragmentB, FragmentC. En miMainActivity Inicializo mis seis fragmentos, miViewPager y esPageFragmentAdapter (que inicializan tresPageFragment por sí mismo).

Luego utilizo este método para adjuntar miFragment1, Fragment2, Fragment3 a cada página (a cadaPageFragment) dePageFragmentAdapter:

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

Puedo recibir (a través de métodos enPageFragmentAdapter) Fragmentos y hacer "fragmento anidado" en miPageFragment (por supuesto enonCreate()) me gusta:

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

Nota: yo usoPageFragment.setNestedFragment() para establecermFragment en eso.

¡Y funciona genial! Me ayudará (pero esta historia no trata sobre eso) simplemente a reemplazar fragmentos en ViewPager como:

tPageFragmentAdapter.replaceFirstPage(tFragmentA);

Pero tengo un gran problema. Nuevamente los documentos de Google:

Implementación de PagerAdapter que representa cada página como un fragmento que se mantiene de forma persistente en el administrador de fragmentos siempre que el usuario pueda volver a la página. Esta versión del buscapersonas es mejor para usar cuando hay un puñado de fragmentos típicamente estáticos, como un conjunto de pestañas.El fragmento de cada página del usuario. las visitas se mantendrán en la memoria, aunque su jerarquía de vista puede ser Destruido cuando no es visible. Esto puede resultar en el uso de una cantidad significativa de memoria ya que las instancias de fragmentos pueden conservar una cantidad arbitraria de estado.

Como puedes verPageFragmentAdapter puede destruir cada miPageFragment Y por supuesto su fragmento anidado. Y cuando se recreará tendrá un NULL en su lugar.mFragment valor. Estoy tratando de salvarlo a través degetChildFragmentManager().putFragment() y luego conseguirlo porgetChildFragmentManager().getFragment(). Pero no funcionó.

Pregunta

Así que mi pregunta es:¿Cómo guardar mi fragmento anidado en mi fragmento padre? ¿Es posible?

Apreciaría mucho su ayuda. Alex PD Realmente lo siento por mi inglés :)

EDITAR

Thx @ AndroidBegin.com por la respuesta!

Esto parece ser un error en el soporte recién agregado para fragmentos anidados. Básicamente, el FragmentManager secundario termina con un estado interno interrumpido cuando se separa de la actividad. Una solución temporal a corto plazo que me lo arregló es agregar lo siguiente a onDetach () de cada Fragmento al que llamas getChildFragmentManager () en:

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta