Android DialogFragment y cambios de configuración

Tengo problemas para entender cómo hacer un DialogFragment simple para editar un objeto (complejo), digamos una Persona, con nombre y apellido, y una lista de direcciones de correo electrónico cada una consistente en un enum (Trabajo, Inicio, etc ) Y la dirección.

En primer lugar, ¿cómo pasar correctamente el objeto Person a un DialogFragment? Mi solución actual tiene un método setPerson (persona persona), que se llama después de que se crea mi DialogFragment, pero antes dialog.show (). Esto funciona bien, hasta que ocurre un cambio de configuración (el usuario gira la pantalla). El objeto DialogFragment se vuelve a crear y la referencia a mi objeto Person es null. Sé que puedo guardar la instancia usando onSaveInstanceState, pero el objeto es complejo y costoso, y persistir un objeto grande de esta manera parece un despilfarro.

También he intentado inhabilitar el cambio de la configuración en la actividad que utiliza mi diálogo, y eso arregla el problema, pero deseo que el diálogo sea reutilizable y requiera que todas las actividades que lo utilizan para deshabilitar cambios de la configuración están mal.

La tercera opción sería guardar la referencia a Person en una variable estática, pero de nuevo, quiero que el diálogo sea reutilizable y capaz de admitir varias instancias.

¿Cómo manejan los demás objetos caros y complejos en diálogos reutilizables?

Bueno, hay varias soluciones, ninguna de las cuales son fantásticas o a prueba de fallos si no puede serializar el objeto que está editando.

No recomiendo usar android:configChanges="orientation" menos que sea absolutamente, 100% inevitable. Hay otros cambios en la configuración, y su aplicación seguirá rompiendo con los demás si recurriera a usar esa solución.

Pero una solución simple que funcionará en la gran mayoría de los casos es llamar a setRetainInstance(true) en el DialogFragment. Esto evitará que su Fragmento sea destruido y vuelto a crear en un cambio de configuración. Hay un caso límite en el que esto podría no funcionar, sin embargo. Hay otras razones además de cambios de configuración donde el sistema operativo intentará poner una actividad o una aplicación 'en hielo', por ejemplo, para ahorrar memoria. En este caso, su objeto se perderá.

La manera más limpia de pasar un Objeto complicado a un fragmento es hacer que el Objeto implemente Parcelable , añadir el objeto a un Bundle y pasar el paquete al Fragment con fragment.setArguments(bundle) . Puede descomprimir el Objeto en onActivityCreated() del fragmento recuperando el paquete a través de una llamada a getArguments() .

Para persistir el argumento en los cambios de configuración, simplemente guarde el Objeto parcelable "working" en el bundle proporcionado por el onSaveInstanceState(Bundle state) del fragmento, y descomprima el argumento posteriormente en onActivityCreated() if savedInstanceState !=null .

Si hay un golpe de rendimiento notable de implementar Parcelable , o si tiene un objeto " Parcelable " de algún tipo, una opción es crear un fragmento que no sea UI para contener el objeto de datos. Sin entrar en detalles, puede establecer setRetainInstance(true) en el fragmento no UI y coordinar la conexión con el fragmento de interfaz de usuario mediante interfaces en la Activity .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.