how - implement fragment in android
Cómo funciona la restauración automática de fragmentos (1)
Cuando se utiliza FragmentActivity
, restaura automáticamente el estado del fragmento y vuelve a crear todos los fragmentos.
Sé que esto se hace principalmente guardando el estado en onSaveInstanceState
y luego restaurado en onCreate
la actividad. Mirando un poco el código, he visto que todos los fragmentos se recrean (o solo se adjuntan si retenerInstancia es verdadero) y se agregan al FragmentManager
pero no me queda claro de qué manera se agregan a la vista, porque la vista no lo es. Restaurado automáticamente.
Mis problemas originales fueron que obtengo duplicados de algunos fragmentos similares a esa otra pregunta . Lo onCreate
en onCreate
con:
Fragment f = fm.findFragmentByTag(tagName);
if(f==null) {
f = createFragment();
fm.beginTransaction().add(R.id.myContainer,f,tagName).commit();
} else {
//Nothing it''s on the view
}
Ahora funciona, pero todavía no entiendo completamente cómo funciona.
Mis dudas son:
- ¿En qué momento y cómo están unidos los fragmentos a la vista? He experimentado que la restauración de fragmentos se realiza en
onCreate
ofFragmentActivity
. Pero si llamo asetContentView
después de eso, ¿cómo se adjunta el fragmento a la vista? - ¿Puedo evitar la recreación de fragmentos sin sobrescribir en
onSaveInstanceState
? Debido a que los diferentes diseños de orientación con diferente número de fragmentos, mi intención original era recrear solo un fragmento de estado marcado como retenido y no restaurar los demás fragmentos de vista que no están marcados como retenidos.
Ver jerarquía en no restaurado automáticamente. Por lo tanto, en Fragment.onCreateView()
o Activity.onCreate()
, debe restaurar todas las vistas (desde xml o programáticamente). Cada grupo de ViewGroup
que contiene un fragmento debe tener la misma ID que la primera vez que lo creó. Una vez que se crea la jerarquía de vistas, Android restaura todos los fragmentos y coloca sus vistas en el ViewGroup
correcto gracias al ID. Digamos que Android recuerda la ID del grupo de ViewGroup
en el que se encontraba un fragmento. Esto sucede en algún lugar entre onCreateView()
y onStart()
.
Creo que podría ser posible mantener la recreación del fragmento pero, en el ViewGroup que contiene el fragmento, establezca la visibilidad en GONE. De esta manera, el fragmento no aparece y puede eliminarlo programáticamente más adelante.