setretaininstance - findviewbyid in fragment android
Entendiendo la propiedad setRetain(boolean) de Fragment (4)
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
vistao 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.
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 (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
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 ).
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.