android - support - Es realmente una buena práctica usar setRetainInstance(true) de Fragment para manejar el cambio de rotación
para que sirven los fragment en android (2)
Me refiero a ¿Por qué usar Fragment # setRetainInstance (boolean)?
La razón por la que pregunto es para que la Activity
maneje la rotación, la Documentación oficial de la actividad nos alienta a dejar que la Activity
apague y reinicie durante la rotación.
android: configChanges Enumera los cambios de configuración que la actividad manejará por sí misma. Cuando se produce un cambio de configuración en el tiempo de ejecución, la actividad se apaga y se reinicia de forma predeterminada, pero declarar una configuración con este atributo evitará que la actividad se reinicie. En cambio, la actividad permanece en ejecución y se llama a su método onConfigurationChanged (). Nota: el uso de este atributo debe evitarse y usarse solo como último recurso. Lea Handling Runtime Changes para obtener más información sobre cómo manejar correctamente un reinicio debido a un cambio de configuración.
Cualquier intento de cambiar el comportamiento predeterminado de esta Actividad parece ser una mala práctica. Para evitar que la Actividad vuelva a cargar la estructura de datos que consume tiempo durante el reinicio, hacemos uso de onRetainNonConfigurationInstance
y getLastNonConfigurationInstance
. - Gestión de cambios en tiempo de ejecución
Sin embargo, cuando se trata de manejar la rotación en Fragmento, ¿Google nos da una recomendación diferente? ¿No quieren que cerremos y reiniciéramos Fragmento?
Objeto público onRetainNonConfigurationInstance ()
Este método quedó en desuso en el nivel 13 de la API. En su lugar, use la nueva API Fragment setRetainInstance (boolean); Esto también está disponible en plataformas más antiguas a través del paquete de compatibilidad de Android.
- ¿Por qué Google nos anima a apagar y reiniciar la Actividad durante la rotación, pero nos alienta a retener Fragmento durante la rotación?
- Si
setRetainInstance(true)
es bueno para manejar la rotación, ¿por qué Google no lo hace como el comportamiento predeterminado de Fragment?
Porque estás malinterpretando su uso. setRetainInstance(true)
solo debe usarse en fragmentos que son como elementos / módulos individuales. Los fragmentos que manejan sockets, etc. no tienen una interfaz gráfica de usuario realmente se benefician de ser retenidos. Los fragmentos con una GUI probablemente no deberían usar setRetainInstance(true)
. Además, cualquier fragmento que vaya al backstack no debe usar setRetainIstance(true)
.
Podría generalizarlo a cualquier fragmento que maneje solo datos / conexión, etc. debería usar setRetainInstance(true)
. Pero hay una multitud de formas diferentes de usar Fragmentos, que no se beneficiarían de setRetainInstance(true)
.
Cambios de configuración : cuando de repente la pantalla se vuelve mucho más ancha y mucho menos en altura (paisaje típico), es apto para que un componente visual actualice su pantalla y use la pantalla disponible de manera más inteligente. Otro ejemplo de cambio de configuración es el usuario que desliza el teclado del hardware, el cambio de idioma del dispositivo, etc. por qué reiniciar:
Los componentes de Android favorecen el diseño declarativo, se cargan un montón de diseños XML y se trabaja desde allí. Encontrar cada Vista y reorganizarla / actualizarla en tiempo real será un desastre, por no mencionar el nuevo cableado de todos los controladores de eventos y otros códigos de Vista personalizados. Es mucho más fácil recargar otro montón de archivos de diseño.
Además, en Android, las actividades se desarrollan a la merced del sistema, por lo que, naturalmente, el ciclo de vida de la actividad está diseñado (y se recomienda) de tal manera que es capaz de recrearse a pedido, en cualquier momento, tal como era antes. destruido. Este patrón se adapta a todos los reinicios, también a los cambios de configuración. Si hace que sus Actividades y Fragmentos sean capaces de mantener un estado eterno, los cambios de configuración no serán un gran problema.
Conserve los datos de estado (Modelos), no las cosas que los muestran (IU y Vistas).
setRetainInstance (true) : se recomienda usar solo con fragmentos que no contengan ninguna referencia a nada, que se recreará en la rotación. Esto significa que no debe usarlo en ningún Fragmento que contenga Contexto, Vistas, etc. Un fragmento Visual típico lo hace. Pero es muy útil con los fragmentos que contienen objetos como la ejecución de subprocesos, tareas asíncronas, recopilaciones de datos, activos cargados, resultados obtenidos, etc. Este método ayuda a usar un fragmento no visual, como portador desmontable, para objetos no dependientes del contexto de una actividad. .