android findviewbyid - Entendiendo la propiedad setRetain(boolean)de Fragment




setretaininstance (5)

SetRetainInstance (true) permite que el fragmento sobreviva. Sus miembros serán retenidos durante el cambio de configuración como rotación. Pero todavía se puede matar cuando la actividad se mata en el fondo. Si el sistema elimina la actividad que lo contiene en segundo plano, el sistema que usted manejó en el estado de ahorro de la cuenta debe guardar instanceState. En otra palabra, siempre se llamará onSaveInstanceState. Aunque no se llamará a onCreateView si SetRetainInstance es verdadera y el fragmento / actividad aún no se ha eliminado, aún se llamará si se elimina y se intenta recuperarlo.

Aquí hay algunos análisis de la actividad / fragmento de Android, espero que ayude. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html

A partir de la documentación:

public void setRetainInstance (boolean retain)

Controle si una instancia de fragmento se conserva durante la recreación de la actividad (como por ejemplo, a partir de un cambio de configuración). Esto solo se puede usar con fragmentos que no estén en la parte posterior de la pila. 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 se llamará, porque el fragmento se está separando de su actividad actual).
  • No se llamará a onCreate (paquete) ya que el fragmento no se está recreando.
  • Se seguirán llamando onAttach (Activity) y onActivityCreated (Bundle).

Tengo algunas preguntas:

  • ¿El fragmento también conserva su 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 posterior?

  • ¿Cuáles son los casos de uso en los que tiene sentido utilizar este método?


setRetainInstance(boolean) es útil cuando 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 para el Observable de rxjava" (que he encontrado here ).


En primer lugar, echa un vistazo a mi post 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 conservará incluso si el cambio de configuración hace que se destruya la Activity subyacente.

¿Se destruirá el fragmento cuando el usuario abandone la actividad?

Al igual que la Activity s, el sistema puede destruir los Fragment cuando los recursos de memoria son bajos. Si los fragmentos conservan su estado de instancia en todos los cambios de configuración no tendrá ningún efecto sobre si el sistema destruirá los Fragment una vez que abandone la Activity . Si abandona la Activity (es decir, presionando el botón de inicio), los Fragment pueden o no ser destruidos. Si abandona la Activity presionando el botón Atrás (por lo tanto, llamando a finish() y destruyendo efectivamente la Activity ), todos los Fragment adjuntos de la Activity también serán destruidos.

¿Por qué no funciona con fragmentos en la pila posterior?

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 conservar sus Fragment o no, la Activity (y, por lo tanto, el backstack del FragmentManager ) se destruirá en un cambio de configuración. Otra razón por la que podría no funcionar es porque las cosas podrían complicarse si se permitiera que tanto los fragmentos retenidos como los fragmentos no retenidos existieran en el mismo backstack.

¿Cuáles son los casos de uso en los que tiene sentido utilizar este método?

Los fragmentos retenidos pueden ser muy útiles para propagar información de estado, especialmente la administración de subprocesos, en instancias de actividad. Por ejemplo, un fragmento puede servir como host para una instancia de Thread o AsyncTask , administrando su operación. Ver mi blog en este tema para obtener más información.

En general, lo trataría de manera similar al uso de onConfigurationChanged con una Activity ... no lo use como bandaida solo porque es demasiado vago para implementar / manejar un cambio de orientación correctamente. Úsalo solo cuando lo necesites.


setRetaininstance solo es útil cuando su 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 rota el dispositivo, los fragmentos retenidos permanecerán allí (no se destruirán y recrearán), pero cuando el tiempo de ejecución destruya la actividad para reclamar 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 la orientación cambiando el tiempo. Por ejemplo, descargué un montón de mapas de bits del servidor y cada uno tiene 1 MB, cuando el usuario gira accidentalmente su dispositivo, no quiero volver a hacer todo el trabajo de descarga. Creo un Fragment contiene mis mapas de bits y lo agrego al administrador y llamo a setRetainInstance , todos los setRetainInstance bits todavía están allí, incluso si la orientación de la pantalla cambia.


Es muy útil para mantener abiertos los recursos de larga ejecución, como los sockets. Tenga un fragmento sin UI que contenga referencias a los conectores bluetooth y no tendrá que preocuparse por volver a conectarlos cuando el usuario encienda el teléfono.

También es útil para mantener referencias a recursos que tardan mucho tiempo en cargarse como mapas de bits o datos del servidor. Cargarlo una vez, mantenerlo en un fragmento retenido, y cuando la actividad se recarga, todavía está allí y no tiene que reconstruirlo.





android android-fragments