Eliminar un ViewPager mediante programación, ¿cuándo son (o cómo puedo asegurarlo) que se han destruido fragmentos?
Tras haber buscado previamente este tema, puedo encontrar muchas discusiones sobre la adición dinámica y la eliminación de Fragment
seleccionados de un ViewPager
. Lo que realmente me preocupa aquí es cómo puedo eliminar de forma programática un ViewPager
entero 'limpio' de su ViewGroup
contiene, cuando ese ViewPager
se ha utilizado para mostrar Fragment
a través de un FragmentPagerAdapter
y asegurar que los Fragment
contenidos se destruyen correctamente .
Para ampliar la pregunta un poco más, tengo un paisaje de dos paneles de diseño donde se hace una selección de una lista dentro de un Fragment
en el lado izquierdo, y el contenido elegido se coloca a la derecha dentro de un FrameLayout
. La clave es que el contenido puede o no ser paginado. Por lo tanto, el contenido debe mostrarse en un formato ViewPager
o, si no está paginado, deberá estar representado por un solo Fragment
directamente.
- Android ViewPager enfoca automáticamente WebView
- Mis fragmentos en la pestaña viewpager no se actualizan
- Cómo obtener una indicación de que el usuario está intentando desplazarse más en un ViewPager
- Actualizar la actividad de la fuente antes de la transición de salida
- Barra de navegación de Android que cubre el contenido del visualizador
Para mostrar un solo Fragment
, simplemente realizo una FragmentTransaction
como lo harías normalmente para colocar el Fragment
en el contenedor FrameLayout
. Si por otro lado es paginado el contenido que se mostrará, a continuación, en su lugar, crear un ViewPager
y añadirlo como un niño de FrameLayout
.
Cuando necesito cambiar el contenido, entonces si el contenido anterior era un Fragment
autónomo entonces puedo simplemente eliminarlo a través de FragmentTransaction
.remove()
. Cuando hago esto, el Fragment
pasa por el onPause()
… onDestroy()
como se esperaba. Si el contenido anterior era un ViewPager
entonces lo quito del FrameLayout
usando .removeAllViews()
. Aquí vengo al problema: no veo ninguno de los onPause()
… onDestroy()
que se llaman en cualquiera de los Fragment
que se llevaron a cabo dentro de ese ViewPager
través del FragmentPagerAdapter
.
Desde el punto de vista del usuario, la aplicación funciona bien. Después de varias rondas de ViewPager
se quita, puedo ver el GC recuperar la memoria. Sin embargo, no me gusta el hecho de que esos Fragment
de los métodos de fin de vida no se llaman ya que no puedo hacer ninguna limpieza dentro de ellos, y simplemente no parece "correcto".
¿Existe un método en el que pueda conectarme para eliminar el Fragment
ViewPager
cuando el ViewPager
está separado de su padre, tal vez? En otras palabras, cuando sé que el ViewGroup
ya no está en uso, realizaría FragmentTransaction
s en algún lugar (quizás en el FragmentPagerAdapter
) para eliminar esos Fragment
.
Como alternativa, me doy cuenta de que podría mantener el ViewPager
a la derecha permanentemente, y dinámicamente intercambiar el Fragment
s dentro de él. Por supuesto, simplemente no importaría que en ciertos momentos solo tuviera una página. Si esto fuera una mejor manera de ir entonces refactorizar mi código para hacer esto, pero yo apreciaría opiniones.
- Viewpager muestra página incorrecta
- ¿Hay una manera de desactivar el desvanecimiento que un viewPager tiene desplazamiento a los bordes?
- No se puede convertir de android.support.v4.app.Fragment a android.app.Fragment
- Acceda a la vista de fragmentos de padres de ViewPager en el fragmento secundario de Pager
- Llame a actvity después de que el viewpager haya terminado
- Toque los Listeners para las vistas de padres y niños
- Android ViewPager al pasar la última pantalla
- ¿Cómo se crea un Android View Pager con un indicador de puntos?
Sin embargo, no me gusta el hecho de que los métodos de los Fragmentos de fin de vida no son llamados ya que no puedo hacer ninguna limpieza dentro de ellos, y simplemente no parece 'correcto'.
Se debe limpiar cuando la actividad se destruye, si eso no es demasiado tarde para usted (por ejemplo, problemas de montón).
En otras palabras, cuando sé que el ViewGroup ya no está en uso, realizaría FragmentTransactions en algún lugar (quizás en el FragmentPagerAdapter) para eliminar esos fragmentos.
Usted no ejecutó las transacciones para poner los fragmentos allí. Por lo tanto, no puede ejecutar fácilmente las transacciones para eliminar los fragmentos. Si cambia a FragmentStatePagerAdapter
y llama a setAdapter(null)
, debería hacer que todos los fragmentos existentes en el buscapersonas sean destruidos, por mi lectura del código fuente. FragmentPagerAdapter
nunca utiliza remove()
, pero FragmentStatePagerAdapter
hace, desde su método destroyItem()
, y todos los fragmentos existentes se destruyen a través de destroyItem()
cuando se proporciona un nuevo adaptador (o null
) a setAdapter()
.
- El teclado aparece automáticamente en Nexus7 versión 4.2
- LocationManager: java.lang.RuntimeException: No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()