De acuerdo con la documentación de la API de Android, Activity.onRetainNonConfigurationInstance() ha quedado en desuso en favor de Fragment.setRetainInstance().No se puede usar Fragment.setRetainInstance() como reemplazo de Activity.onRetainNonConfigurationInstance()
Sin embargo, he corrido en dos situaciones distintas, donde no parece Fragment.setRetainInstance() para ser factible utilizar.
Si el fragmento contiene una vista Web. De acuerdo con Diane Hackborne, no puede volver a utilizar un WebView en los cambios de configuración. Supongo que significa que debe permitir que el Fragmento cierre y vuelva a crear el WebView cuando la pantalla gire, y use WebView.saveState() y WebView.restoreState() para restaurar el estado de la vista web.
Si el fragmento pertenece a un diseño que ya no existe después de que el cambio de configuración, cuando el FragmentManager intenta restaurar el fragmento, arrojará:
java.lang.IllegalArgumentException: No view found for id 0x7f060091 for fragment
Esto puede ocurrir (por ejemplo) si tiene un diseño de dos fragmentos en modo horizontal, pero un diseño de un fragmento en modo vertical. Al girar de paisaje a retrato, si setRetainInstance() se establece en verdadero, ninguno de los Fragmentos se destruye, pero un fragmento ya no tiene una vista válida para volver a adjuntarse, de ahí la excepción.
lo tanto, si usted está construyendo una aplicación basada en fragmentos, y hay que conservar los datos (por ejemplo, las referencias a la ejecución de AsyncTasks) entre los cambios de configuración, y no se puede utilizar Fragment.setRetainInstance(), y no hay Fragment.onRetainNonConfigurationInstance(), ¿cuál es el mejor enfoque para tomar?
Acerca de la vista de un problema que ya no existe, está en lo cierto, pero le falta el caso en que el desarrollador podría querer tener diferentes diseños para pantallas diferentes. Por ejemplo, en algunas pantallas tanto el retrato como el paisaje tendrían 2 paneles, en algunos solo el paisaje tendría 2 paneles y en algunos de ellos tendría 1 panel. Incluso si llamo a setRetainInstance (verdadero) cuando solo hay 2 paneles, y llamo setRetainInstance (falso) cuando hay uno, obtengo la misma excepción. ¿Qué se puede hacer? –
@mkuech ese comentario solo dice que no se vuelva a utilizar la misma instancia de WebView en los cambios de configuración. No estamos confiando en eso; se llama a onCreateView() por lo que estamos haciendo uno nuevo cada vez. – antonyt
@antonyt Y disculpas. Parece que he cruzado algunos cables entre esta y otras preguntas más. Voy a eliminar mis comentarios anteriores para evitar confusiones. – mkuech