Obtener una referencia a un niño Fragmento después de que el fragmento padre se ha recreado
A partir de Android 4.2, Android admite Fragmentos anidados . El doc no da muchas explicaciones con respecto a los ciclos de vida de Fragment
anidados, pero por experiencia, parece que su ciclo de vida es realmente similar a Fragments
"regulares".
Parece que hay una diferencia grande sin embargo: los Fragments
niño no se restauran cuando se onCreate
método del padre Fragment
onCreate
. Como consecuencia, parece imposible guardar / restaurar una referencia a un Fragment
particular:
- DialogFragment.show cuelga la aplicación
- Fragmento de error: tipos incompatibles, requiere android.app.fragment pero encontró activity.messagefragment
- Problemas de memoria - fragmentos
- Descartar DatePickerDialog al pulsar el botón Atrás
- OnViewCreated - lugar equivocado para reemplazar el fragmento?
- El uso de
getChildFragmentManager.findFragmentByTag(String)
devuelve siemprenull
en parentFragment
onCreate(Bundle)
porquemActive
esnull
. - Usar
putFragment
/getFragment
resulta en unaNullPointerException
porquegetFragment
busca el tamaño de unaArrayList
mActive
nula.
Por lo tanto, mi pregunta es muy simple. ¿Hay una manera correcta de recuperar una referencia a un Fragment
hijo en el método onCreate
Fragment
padre?
- DialogFragment llama de nuevo a la actividad, pero desea actividad para actualizar otro fragmento
- Método correcto para llamar al servicio Web (API) de la clase Fragment
- Hacer fragmentos a pantalla completa mediante programación
- Fragmento / Actividad Ciclos de vida y cambio de orientación
- Conexión / autenticación de Twitter en Android Fragment
- API de YouTube para Android: YouTubePlayerFragment loading spinner
- Cómo obtener todos los fragmentos sub / inner / anidados de un fragmento?
- Espresso prueba pegado / inactivo después de realizar (haga clic ()) en el botón en ViewAnimator
Creo que no se puede onCreate
en el onCreate
en que la vista no se construye en ese momento. Usted puede en onViewCreated()
sin embargo. La lógica que he usado es:
- Compruebe si hay estado guardado en
onViewCreated()
, si lo hay, trate de obtener el fragmento hijo - A continuación, compruebe si el fragmento secundario es nulo, si lo es, agregue utilizando el gestor de fragmentos secundarios.
Por "chequeo" me refiero a buscar el fragmento por id. Supongo que por etiqueta debería funcionar también.
AFAIK no puede obtener un fragmento secundario antes de restaurar o crear la jerarquía de vistas, pero podría hacer lo mismo en un momento posterior, por ejemplo en onActivityCreated()
¿Qué pasa con setRetainInstanceState (true) en tu fragmento? ¿Podría resolver su problema? Resolvió algunos problemas cuando tengo ChildFragments en un fragmento. Sólo tengo que mantener una referencia al fragmento de niño en el fragmento.
Pero siempre lo hice en onCreateView (). No estoy seguro si funcionará en onCreate ()
¿O quieres decir algo completamente diferente?
Usas FragmentPagerAdapter? Si no intenta FragmentPagerAdapter en lugar de FragmentStatePagerAdapter me di cuenta de que tienen algún error cuando se utiliza FragmentStatePagerAdapter cuando tengo nido de nivel 4. Lo siento mi inglés es pobre.
@Override public void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { mFragment1 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment1); mFragment2 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment2); mFragment3 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment3); } else { mFragment1 = SomeFragment.newInstance("param1"); mFragment2 = SomeFragment.newInstance("param2"); mFragment3 = SomeFragment.newInstance("param3"); } super.onCreate(savedInstanceState); mMyPagerAdapter = new MyPagerAdapter(getChildFragmentManager(), mFragment1, mFragment2, mFragment3); } @Override public void onSaveInstanceState(Bundle outState) { if (mFragment1 != null) { getFragmentManager().putFragment(outState, STATE_Fragment1, mFragment1); } if (mFragment2 != null) { getFragmentManager().putFragment(outState, STATE_Fragment2, mFragment2); } if (mFragment3 != null) { getFragmentManager().putFragment(outState, STATE_Fragment3, mFragment3); } super.onSaveInstanceState(outState); }