Descripción de SetRetainInstance del fragmento (boolean)
Comenzando con la documentación:
Public void setRetainInstance (retención booleana)
- Evento de RxJava de incendio sólo cambia cuando Fragmento es visible en ViewPager
- Fragmento 2 panel windowSoftInputMode para teclado suave
- ¿Cómo conservar el oyente en el cuadro de diálogo personalizado abierto desde el fragmento?
- Quitar fragmento medio de FragmentStack
- Obtención del error "La actividad Java.lang.IllegalStateException se ha destruido" al utilizar pestañas con ViewPager
Controlar si una instancia de fragmento se conserva a lo largo de la recreación de actividad (por ejemplo, a partir de un cambio de configuración). Esto sólo puede usarse con fragmentos que no estén en la pila trasera. Si se establece, el ciclo de vida de los fragmentos será ligeramente diferente cuando se recrea una actividad:
- OnDestroy () no será llamado (pero onDetach () seguirá siendo, porque el fragmento se está desvinculando de su actividad actual).
- OnCreate (Bundle) no se llamará ya que el fragmento no se vuelve a crear.
- OnAttach (Activity) y onActivityCreated (Bundle) seguirán siendo llamados.
Tengo algunas preguntas:
-
¿El fragmento también conserva su punto de vista, o será recreado en el cambio de configuración? ¿Qué es exactamente "retenido"?
-
¿Se destruirá el fragmento cuando el usuario abandone la actividad?
-
¿Por qué no funciona con fragmentos en la pila trasera?
-
¿Cuáles son los casos de uso donde tiene sentido usar este método?
- Cómo borrar la pila trasera de fragmentos de Android sin reanudar fragmentos intermedios
- Animación de Flip de Tarjeta entre Actividades
- El fragmento no actualiza el contenido después de volver de la pila posterior
- Ocultar teclado al navegar de un fragmento a otro
- Fragmento en ViewPager en Fragmento no se vuelve a cargar en el cambio de orientación
- AppCompat y Fragmento no funcionan
- Fragmento Android Cambiar Título
- Android: limitar los fragmentos de carga con una viewPager
En primer lugar, echa un vistazo a mi puesto en Fragmentos retenidos. Podría ayudar.
Ahora para responder a sus preguntas:
¿El fragmento también conserva su estado de
vista, o será recreado en el cambio de configuración? ¿Qué es exactamente "retenido"?
Sí, el estado del Fragment
se mantendrá durante el cambio de configuración. Específicamente, "retenido" significa que el fragmento no se destruirá en los cambios de configuración. Es decir, el Fragment
se mantendrá incluso si el cambio de configuración hace que la Activity
subyacente sea destruida.
¿Se destruirá el fragmento cuando el usuario abandone la actividad?
Al igual que las Activity
, los Fragment
pueden ser destruidos por el sistema cuando los recursos de memoria son bajos. Si usted tiene sus fragmentos conservan su estado de la instancia a través de cambios de la configuración no tendrá ningún efecto en si o no el sistema destruirá el Fragment
s una vez que usted deja la Activity
. Si abandona la Activity
(es decir, presionando el botón de inicio), el Fragment
puede o no ser destruido. Si abandona la Activity
presionando el botón Atrás (de esta manera, llamando a finish()
y destruyendo efectivamente la Activity
), también se destruirá todo el Fragment
adjunto de la Activity
.
¿Por qué no funciona con fragmentos en la pila trasera?
Probablemente hay varias razones por las que no se admite, pero la razón más obvia para mí es que la Activity
contiene una referencia al FragmentManager
y el FragmentManager
administra el backstack. Es decir, no importa si elige retener su Fragment
o no, la Activity
(y por lo tanto el backtrack del FragmentManager
) será destruida en un cambio de configuración. Otra razón por la que podría no funcionar es porque las cosas podrían resultar complicadas si se permitiera que ambos fragmentos retenidos y fragmentos no retenidos existieran en el mismo backstack.
¿Cuáles son los casos de uso donde tiene sentido usar este método?
Los fragmentos retenidos pueden ser muy útiles para propagar información de estado – especialmente gestión de subprocesos – a través de instancias de actividad. Por ejemplo, un fragmento puede servir como un host para una instancia de Thread
o AsyncTask
, administrando su operación. Consulta la publicación de mi blog en este tema para obtener más información.
En general, yo lo trataría de manera similar a usar onConfigurationChanged
con una Activity
… no lo use como un bandaid sólo porque usted es demasiado perezoso para implementar / manejar un cambio de orientación correctamente. Úselo sólo cuando lo necesite.
setRetaininstance
sólo es útil cuando la activity
se destruye y se setRetaininstance
crear debido a un cambio de configuración porque las instancias se guardan durante una llamada a onRetainNonConfigurationInstance
. Es decir, si gira el dispositivo, los fragmentos retenidos permanecerán allí (no se destruyen y recrean.) Pero cuando el tiempo de ejecución mata la actividad para recuperar recursos, no queda nada. Al pulsar el botón Atrás y salir de la actividad, todo se destruye.
Normalmente utilizo esta función para guardar la orientación de cambio Time.Say tengo descargar un montón de mapas de bits del servidor y cada uno es de 1 MB, cuando el usuario gira accidentalmente su dispositivo, no quiero hacer todo el trabajo de descarga de nuevo. Creo un Fragment
sostiene mis mapas de bits y lo agrego al encargado y llamo a setRetainInstance
, todos los setRetainInstance
bits están todavía allí incluso si la pantalla cambia de la orientación.
SetRetainInstance (true) permite que el tipo de fragmento de sobrevivir. Sus miembros serán retenidos durante el cambio de configuración como la rotación. Pero todavía se puede matar cuando la actividad se muere en el fondo. Si la actividad que contiene en el fondo es eliminada por el sistema, su instanceState debe ser guardado por el sistema que manejó onSaveInstanceState correctamente. En otra palabra siempre se llamará onSaveInstanceState. Aunque onCreateView no se llamará si SetRetainInstance es verdadera y el fragmento / actividad no se ha matado todavía, todavía se llamará si se mata y se intenta volver a traer.
Aquí hay algunos análisis de la actividad de Android / fragmento de esperanza que ayuda. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html
SetRetainInstance (boolean) es útil cuando se desea tener algún componente que no esté vinculado al ciclo de vida de la actividad. Esta técnica es utilizada por ejemplo por rxloader para "manejar el ciclo de vida de la actividad de Android de Observable de rxjava" (que he encontrado aquí ).
- La aplicación puede estar haciendo demasiado trabajo en su hilo principal
- La instalación de Android Studio en Windows 7 falla, no se encuentra JDK