La guía o código que encontrarás en este artículo es la solución más eficiente y efectiva que hallamos a tu duda o problema.
Solución:
Como dicen los documentos, piénsalo de esta manera. Si tuviera que hacer una aplicación como un lector de libros, no querrá cargar todos los fragmentos en la memoria a la vez. Te gustaría cargar y destruir Fragments
como el usuario lee. En este caso usarás FragmentStatePagerAdapter
. Si solo está mostrando 3 “pestañas” que no contienen muchos datos pesados (como Bitmaps
), entonces FragmentPagerAdapter
te puede ir bien. Además, tenga en cuenta que ViewPager
por defecto cargará 3 fragmentos en la memoria. El primero Adapter
que mencionas podría destruir View
jerarquía y recargarlo cuando sea necesario, el segundo Adapter
solo guarda el estado del Fragment
y lo destruye por completo, si el usuario vuelve a esa página, se recupera el estado.
FragmentStatePagerAdapter:
-
con
FragmentStatePagerAdapter
su fragmento innecesario se destruye. Se confirma una transacción para eliminar completamente el fragmento de su actividad.FragmentManager
. -
el estado en
FragmentStatePagerAdapter
proviene del hecho de que salvará su fragmentoBundle
desdesavedInstanceState
cuando se destruye. Cuando el usuario navega hacia atrás, el nuevo fragmento se restaurará utilizando el estado del fragmento.
Adaptador de paginación de fragmentos:
-
por comparación
FragmentPagerAdapter
no hace nada por el estilo. Cuando el fragmento ya no es necesario.FragmentPagerAdapter
llamadas
detach(Fragment)
en la transacción en lugar deremove(Fragment)
. -
Esto destruye la vista del fragmento pero deja viva la instancia del fragmento en el
FragmentManager
.así que los fragmentos creados en el
FragmentPagerAdapter
nunca se destruyen.
Aquí hay un ciclo de vida de registro de cada fragmento en ViewPager
que tienen 4 fragmentos y offscreenPageLimit = 1 (default value)
FragmentStatePagerAdapterFragmentStatePagerAdapter
Ir a Fragment1 (actividad de lanzamiento)
Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart
Ir a Fragmento2
Fragment3: onCreateView
Fragment3: onStart
Ir a Fragmento3
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach
Fragment4: onCreateView
Fragment4: onStart
Ir a Fragmento4
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
FragmentPagerAdapterFragmentPagerAdapter
Ir a Fragment1 (actividad de lanzamiento)
Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart
Ir a Fragmento2
Fragment3: onCreateView
Fragment3: onStart
Ir a Fragmento3
Fragment1: onStop
Fragment1: onDestroyView
Fragment4: onCreateView
Fragment4: onStart
Ir a Fragmento4
Fragment2: onStop
Fragment2: onDestroyView
Conclusión: FragmentStatePagerAdapter
llamar onDestroy
cuando el Fragmento es superado offscreenPageLimit
mientras FragmentPagerAdapter
no.
Nota: Creo que deberíamos usar FragmentStatePagerAdapter
para ViewPager
que tienen mucha página porque será bueno para el rendimiento.
Ejemplo de offscreenPageLimit
:
Si vamos a Fragment3, será destruir Fragment1 (o Fragment5 si tiene) porque offscreenPageLimit = 1
. si establecemos offscreenPageLimit > 1
eso no lo haré destruir.
Si en este ejemplo establecemos offscreenPageLimit=4
no hay diferencia entre usar FragmentStatePagerAdapter
o FragmentPagerAdapter
porque Fragment nunca llama onDestroyView
y onDestroy
cuando cambiamos de pestaña
Demostración de Github aquí
Más adelante puedes encontrar las notas de otros gestores de proyectos, tú igualmente eres capaz mostrar el tuyo si lo crees conveniente.