2011-11-10 3 views
5

Tengo problemas para entender cómo crear un DialogFragment simple para editar un objeto (complejo), por ejemplo, una persona, con nombre y apellido, y una lista de direcciones de correo electrónico que constan cada una de ellas una enumeración (Trabajo, Hogar, etc.) y la dirección.Android DialogFragmento y cambios de configuración

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

También intenté deshabilitar el cambio de configuración en la actividad que utiliza mi diálogo, y eso soluciona el problema, pero quiero que el diálogo sea reutilizable y requiera todas las actividades que lo usan para deshabilitar los cambios de configuración.

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

¿Cómo manejan otras personas sus costosos y complejos objetos en diálogos reutilizables?

Respuesta

2

Bueno, hay varias soluciones, ninguna de las cuales es fantástica o a prueba de fallas si no puede serializar por completo el objeto que está editando.

No recomiendo usar android:configChanges="orientation" a menos que sea absolutamente, 100% inevitable. Hay otros cambios de configuración, y su aplicación aún se romperá con los demás si recurre al uso de esa solución.

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

1

la manera más limpia que pasar un complicado objeto a un fragmento es para que el objeto implementar Parcelable, añadir el objeto a una Bundle, y pasar el haz a la Fragment con fragment.setArguments(bundle). Puede descomprimir el Objeto en onActivityCreated() del fragmento recuperando el paquete mediante una llamada al .

de persistir el argumento en los cambios de configuración, simplemente guardar el "trabajo" Objeto parcelable al haz proporcionado por método del fragmento, y desempaquetar el argumento más adelante en onActivityCreated() si savedInstanceState !=null.

Si se produce un impacto notable en la implementación de Parcelable, o si tiene un objeto "activo" de algún tipo, una opción es crear un fragmento que no sea de la IU para contener el objeto de datos. Sin entrar en detalles, puede setRetainInstance(true) en el fragmento no UI y coordinar la conexión con el fragmento UI a través de las interfaces en el Activity.

Cuestiones relacionadas