Comenzando con la documentación:
public void setRetainInstance (retención booleana)
Controle si una instancia de fragmento se retiene a través de la recreación de la actividad (como un cambio de configuración). Esto solo se puede usar con fragmentos que no están en la pila posterior. Si se establece, el ciclo de vida del fragmento será ligeramente diferente cuando se recrea una actividad:
- onDestroy () no se llamará (pero onDetach () aún lo será, porque el fragmento se está separando de su actividad actual).
- onCreate (Bundle) no se llamará ya que el fragmento no se está volviendo a crear.
- onAttach (Activity) y onActivityCreated (Bundle) se seguirán llamando.
Tengo algunas preguntas:
¿El fragmento también conserva su vista, o esto se volverá a crear en el cambio de configuración? ¿Qué significa exactamente "retenido"?
¿Se destruirá el fragmento cuando el usuario abandone la actividad?
¿Por qué no funciona con fragmentos en la pila posterior?
¿Cuáles son los casos de uso en los que tiene sentido usar este método?
Respuestas:
En primer lugar, mira mi publicación sobre Fragmentos retenidos. Podría ayudar.
Ahora para responder a sus preguntas:
Sí, el
Fragment
estado de 's se retendrá durante el cambio de configuración. Específicamente, "retenido" significa que el fragmento no se destruirá en los cambios de configuración. Es decir,Fragment
se conservará incluso si el cambio de configuración haceActivity
que se destruya el subyacente .Al igual que
Activity
s,Fragment
s puede ser destruido por el sistema cuando los recursos de memoria son bajos. El hecho de que sus fragmentos conserven su estado de instancia en los cambios de configuración no tendrá ningún efecto sobre si el sistema destruirá o no losFragment
s una vez que abandone elActivity
. Si abandonas elActivity
(es decir, presionando el botón de inicio), elFragment
s puede o no destruirse. Si saleActivity
presionando el botón Atrás (por lo tanto, llamandofinish()
y destruyendo efectivamenteActivity
), todos losActivity
mensajes adjuntosFragment
también se destruirán.Probablemente hay varias razones por las que no es compatible, pero la razón más obvia para mí es que
Activity
tiene una referencia a laFragmentManager
, yFragmentManager
gestiona la pila. Es decir, no importa si elige retener su correo electrónicoFragment
o no, elActivity
(y, por lo tanto, elFragmentManager
backstack) se destruirá en un cambio de configuración. Otra razón por la que podría no funcionar es porque las cosas pueden complicarse si se permite que existan fragmentos retenidos y no retenidos en la misma pila.Los fragmentos retenidos pueden ser bastante útiles para propagar información de estado, especialmente la gestión de subprocesos, a través de instancias de actividad. Por ejemplo, un fragmento puede servir como host para una instancia de
Thread
oAsyncTask
, administrando su operación. Consulte mi publicación de blog sobre este tema para obtener más información.En general, lo trataría de manera similar al uso
onConfigurationChanged
con unActivity
... no lo use como una venda solo porque es demasiado vago para implementar / manejar un cambio de orientación correctamente. Úselo solo cuando lo necesite.fuente
setRetainInstance(true)
, elFragment
objeto java, y todo su contenido no se destruye en la rotación, pero la vista se recrea. Eso seonCreatedView()
llama de nuevo. Es básicamente la forma en que debería haber funcionadoActivities
desde Android 1.0. No creo que sea "flojo" usarlo, o usarlo no es "apropiado". De hecho, no puedo ver por qué no es el valor predeterminado, o por qué querrías desactivarlo.Fragment
retenidos solo se retienen a través de los cambios de configuración, donde la actividad subyacente se destruye y se recrea de inmediato. En todos los demás casos en los que se destruye la actividad, los fragmentos retenidos también se destruirán.setRetainInstance(true)
se use, uno todavía tiene que implementar su propia persistencia (savedInstanceState
o de otro modo) para poder manejar todos los escenarios: por ejemplo, "tecla de inicio, girar, volver a la aplicación" recrea mi fragmento con el constructor llamada, perdiendo todas las variables de estado. Tengo unaAsyncTask
variable como miembro, por eso quiero retener, ahora, si quiero que funcione, me veo obligado a detener la tarea, guardar el estado y reanudar cuando el usuario regrese. Así que, en general, esta es solo una forma rápida de ayudar con la rotación, pero por lo demás es inútil en general.setRetaininstance
solo es útil cuandoactivity
se destruye y se vuelve a crear debido a un cambio de configuración porque las instancias se guardan durante una llamada aonRetainNonConfigurationInstance
. Es decir, si gira el dispositivo, los fragmentos retenidos permanecerán allí (no se destruyen ni se recrean), pero cuando el tiempo de ejecución mata la actividad para recuperar recursos, no queda nada. Cuando presionas el botón Atrás y sales de la actividad, todo se destruye.Por lo general, uso esta función para guardar el tiempo de cambio de orientación. Di que he descargado un montón de mapas de bits del servidor y cada uno es de 1 MB, cuando el usuario gira accidentalmente su dispositivo, ciertamente no quiero volver a hacer todo el trabajo de descarga. Creo que tengo
Fragment
mis mapas de bits y los agrego al administrador y llamosetRetainInstance
, todos los mapas de bits siguen ahí, incluso si cambia la orientación de la pantalla.fuente
mActivity
referencia para usted. Pero no sé si el tiempo de ejecución también eliminaría widgets en la instancia de fragmento en este caso. Pruébalo o sumérgete en el código fuente.SetRetainInstance (true) permite que el fragmento sobreviva. Sus miembros serán retenidos durante el cambio de configuración como la rotación. Pero aún puede ser eliminado cuando la actividad se elimina en segundo plano. Si el sistema elimina la actividad que contiene en segundo plano, el sistema que manejó en SaveInstanceState debe guardar su instancia de StateState correctamente. En otras palabras, siempre se llamará a onSaveInstanceState. Aunque onCreateView no se invocará si SetRetainInstance es verdadero y el fragmento / actividad aún no se elimina, aún se invocará si se eliminó y se intenta recuperarlo.
Aquí hay un análisis de la actividad / fragmento de Android espero que ayude. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html
fuente
setRetainInstance () - Desaprobado
As Fragments Version 1.3.0-alpha01
fuente
setRetainInstance (boolean) es útil cuando desea tener algún componente que no esté vinculado al ciclo de vida de la actividad. Por ejemplo, rxloader utiliza esta técnica para "manejar el ciclo de vida de la actividad de Android para el Observable de rxjava" (que he encontrado aquí ).
fuente