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.

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.

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() .

  • GetTag () devuelve siempre null cuando se llama en fragmento
  • Implementar la función como la aplicación de iOS que cierra vertical Desplazar-para-Descartar con ViewPager
  • Android: clics retardados en ListView
  • Acceso a TextView en ViewPager desde la actividad
  • Cómo hacer que mi viewpager pase de derecha a izquierda
  • ViewPager con la API de Google Maps v2: vista negra misteriosa
  • Contenido de Viewpager perdido en rotación
  • Fragmento en TabLayout sólo carga cuando el usuario desliza Android
  • Cómo utilizar los elementos de la barra de herramientas con Viewpager + Fragmentos
  • Margen de ViewPager en transformaciones de PageTransformer
  • ViewPager - onCreateView no siempre se llama
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.