FragmentStaticConfigLayout

En este ejercicio vamos a modificar el Ejemplo QuoteViewerActivity y aplicarle el código necesario para que cuando cambie de portrait mode a landscape mode, no destruya los fragments, por tanto no los cree de nuevo al reactivar la Activity contenedora.

Crear un nuevo proyecto llamado FragmentStaticConfigLayout a partir del código del proyecto QuoteViewerActivity (ver: Save Project As)

Crear un Layout para la versión landscape de cada Fragment. Para crear los distintos layout revisar
Layouts para versiones Portrait y Landscape .

Modificar en los ficheros de los fragments el tamaño de la letra, ya que en portrait mode cabe menos, pasar de 32sp a 24sp

Además en el fichero title_item.xml vamos a definir los siguientes atributos que van a colocar puntos suspensivos al final del texto si no cabe en el espacio definido, y además forzamos a que tenga una única línea:

android:ellipsize="end"
android:lines="1"

Preparar el LogCat

  • Revisar que todos los métodos “lifecycle callback” tanto de la Activity contenedora como de los Fragments tengan salida al LogCat para ver lo que está ocurriendo.
    Comprobar.
  • Ejecutar y comprobar, los cambios introducidos y comprobar en el LogCat que se destruyen los fragments al realizar un cambio de orientación y se vuelven a crear .
  • Fijarse además, que al cambiar la orientación se aplican los cambios de la carpeta correspondiente (si landscape -> letra más pequeña y ellipsized)
  • Si hemos elegido un autor, la cita desaparece en la nueva orientación, es decir, mantiene el autor seleccionado pero no la cita en la nueva orientación.

Mantener la instancia de los Fragments

Lo primero es añadir en el onCreate() de los Fragments hospedados la siguiente
llamada:

 setRetainInstance(true);

Volver a Comprobar

Lanzamos la aplicación:
05-16 22:33:49.223: I/QuoteViewerActivity(1655): QuoteViewerConfigActivity: onCreate()
05-16 22:33:49.283: I/TitlesFragment(1655): TitlesFragment: onAttach()
05-16 22:33:49.283: I/TitlesFragment(1655): TitlesFragment: onCreate()
05-16 22:33:49.287: I/TitlesFragment(1655): TitlesFragment: onCreateView()
05-16 22:33:49.291: I/QuotesFragment(1655): QuotesFragment: onAttach()
05-16 22:33:49.303: I/QuotesFragment(1655): QuotesFragment: onCreate()
05-16 22:33:49.307: I/QuotesFragment(1655): QuotesFragment: onCreateView()
05-16 22:33:49.315: I/TitlesFragment(1655): TitlesFragment: onActivityCreated()
05-16 22:33:49.327: I/QuotesFragment(1655): QuotesFragment: onActivityCreated()
05-16 22:33:49.327: I/QuoteViewerActivity(1655): QuoteViewerConfigActivity: onStart()
05-16 22:33:49.331: I/TitlesFragment(1655): TitlesFragment: onStart()
05-16 22:33:49.331: I/QuotesFragment(1655): QuotesFragment: onStart()
05-16 22:33:49.335: I/QuoteViewerActivity(1655): QuoteViewerConfigActivity: onResume()
05-16 22:33:49.339: I/TitlesFragment(1655): TitlesFragment: onResume()
05-16 22:33:49.339: I/QuotesFragment(1655): QuotesFragment: onResume()
Cambiamos la orientación:
05-16 22:36:13.495: I/TitlesFragment(1655): TitlesFragment: onPause()
05-16 22:36:13.495: I/QuotesFragment(1655): QuotesFragment: onPause()
05-16 22:36:13.495: I/QuoteViewerActivity(1655): QuoteViewerConfigActivity: onPause()
05-16 22:36:13.495: I/TitlesFragment(1655): TitlesFragment: onStop()
05-16 22:36:13.495: I/QuotesFragment(1655): QuotesFragment: onStop()
05-16 22:36:13.495: I/QuoteViewerActivity(1655): QuoteViewerConfigActivity: onStop()
05-16 22:36:13.495: I/TitlesFragment(1655): TitlesFragment: onDestroyView()
05-16 22:36:13.495: I/TitlesFragment(1655): TitlesFragment: onDestroy()
05-16 22:36:13.495: I/TitlesFragment(1655): TitlesFragment: onDetach()
05-16 22:36:13.495: I/QuotesFragment(1655): QuotesFragment: onDestroyView()
05-16 22:36:13.495: I/QuotesFragment(1655): QuotesFragment: onDestroy()
05-16 22:36:13.495: I/QuotesFragment(1655): QuotesFragment: onDetach()
05-16 22:36:13.495: I/QuoteViewerActivity(1655): QuoteViewerConfigActivity: onDestroy()
Hasta Aquí cierra y destruye, a partir de aquí reconstruye:
05-16 22:36:13.727: I/QuoteViewerActivity(1655): QuoteViewerConfigActivity: onCreate()
05-16 22:36:13.751: I/TitlesFragment(1655): TitlesFragment: onAttach()
05-16 22:36:13.751: I/TitlesFragment(1655): TitlesFragment: onCreate()
05-16 22:36:13.755: I/TitlesFragment(1655): TitlesFragment: onCreateView()
05-16 22:36:13.851: I/QuotesFragment(1655): QuotesFragment: onAttach()
05-16 22:36:13.851: I/QuotesFragment(1655): QuotesFragment: onCreate()
05-16 22:36:13.851: I/QuotesFragment(1655): QuotesFragment: onCreateView()
05-16 22:36:13.855: I/TitlesFragment(1655): TitlesFragment: onActivityCreated()
05-16 22:36:13.859: I/QuotesFragment(1655): QuotesFragment: onActivityCreated()
05-16 22:36:13.863: I/QuoteViewerActivity(1655): QuoteViewerConfigActivity: onStart()
05-16 22:36:13.863: I/TitlesFragment(1655): TitlesFragment: onStart()
05-16 22:36:13.867: I/QuotesFragment(1655): QuotesFragment: onStart()
05-16 22:36:13.875: I/QuoteViewerActivity(1655): QuoteViewerConfigActivity: onResume()
05-16 22:36:13.875: I/TitlesFragment(1655): TitlesFragment: onResume()
05-16 22:36:13.875: I/QuotesFragment(1655): QuotesFragment: onResume()

Ahora ya no deben de destruirse los fragments, ver LogCat LogCat de FragmentStaticLayout

LogCat de FragmentStaticConfigLayout

Lanzamos la aplicación:
05-16 22:40:10.215: I/QuoteViewerActivity(1707): QuoteViewerConfigActivity: onCreate()
05-16 22:40:10.319: I/TitlesFragment(1707): TitlesFragment: onAttach()
05-16 22:40:10.319: I/TitlesFragment(1707): TitlesFragment: onCreate()
05-16 22:40:10.323: I/TitlesFragment(1707): TitlesFragment: onCreateView()
05-16 22:40:10.407: I/QuotesFragment(1707): QuotesFragment: onAttach()
05-16 22:40:10.415: I/QuotesFragment(1707): QuotesFragment: onCreate()
05-16 22:40:10.415: I/QuotesFragment(1707): QuotesFragment: onCreateView()
05-16 22:40:10.419: I/TitlesFragment(1707): TitlesFragment: onActivityCreated()
05-16 22:40:10.423: I/QuotesFragment(1707): QuotesFragment: onActivityCreated()
05-16 22:40:10.427: I/QuoteViewerActivity(1707): QuoteViewerConfigActivity: onStart()
05-16 22:40:10.427: I/TitlesFragment(1707): TitlesFragment: onStart()
05-16 22:40:10.435: I/QuotesFragment(1707): QuotesFragment: onStart()
05-16 22:40:10.435: I/QuoteViewerActivity(1707): QuoteViewerConfigActivity: onResume()
05-16 22:40:10.439: I/TitlesFragment(1707): TitlesFragment: onResume()
05-16 22:40:10.443: I/QuotesFragment(1707): QuotesFragment: onResume()
Cambiamos la orientación:
05-16 22:41:18.995: I/TitlesFragment(1707): TitlesFragment: onPause()
05-16 22:41:18.995: I/QuotesFragment(1707): QuotesFragment: onPause()
05-16 22:41:19.007: I/QuoteViewerActivity(1707): QuoteViewerConfigActivity: onPause()
05-16 22:41:19.007: I/TitlesFragment(1707): TitlesFragment: onStop()
05-16 22:41:19.007: I/QuotesFragment(1707): QuotesFragment: onStop()
05-16 22:41:19.011: I/QuoteViewerActivity(1707): QuoteViewerConfigActivity: onStop()
05-16 22:41:19.011: I/TitlesFragment(1707): TitlesFragment: onDestroyView()
05-16 22:41:19.015: I/TitlesFragment(1707): TitlesFragment: onDetach()
05-16 22:41:19.015: I/QuotesFragment(1707): QuotesFragment: onDestroyView()
05-16 22:41:19.019: I/QuotesFragment(1707): QuotesFragment: onDetach()
05-16 22:41:19.019: I/QuoteViewerActivity(1707): QuoteViewerConfigActivity: onDestroy()
Hasta Aquí cierra y destruye, a partir de aquí reconstruye:
05-16 22:41:19.123: I/QuoteViewerActivity(1707): QuoteViewerConfigActivity: onCreate()
05-16 22:41:19.239: I/TitlesFragment(1707): TitlesFragment: onAttach()
05-16 22:41:19.239: I/TitlesFragment(1707): TitlesFragment: onCreateView()
05-16 22:41:19.431: I/QuotesFragment(1707): QuotesFragment: onAttach()
05-16 22:41:19.431: I/QuotesFragment(1707): QuotesFragment: onCreateView()
05-16 22:41:19.435: I/TitlesFragment(1707): TitlesFragment: onActivityCreated()
05-16 22:41:19.439: I/QuotesFragment(1707): QuotesFragment: onActivityCreated()
05-16 22:41:19.439: I/QuoteViewerActivity(1707): QuoteViewerConfigActivity: onStart()
05-16 22:41:19.439: I/TitlesFragment(1707): TitlesFragment: onStart()
05-16 22:41:19.443: I/QuotesFragment(1707): QuotesFragment: onStart()
05-16 22:41:19.447: I/QuoteViewerActivity(1707): QuoteViewerConfigActivity: onResume()
05-16 22:41:19.451: I/TitlesFragment(1707): TitlesFragment: onResume()
05-16 22:41:19.455: I/QuotesFragment(1707): QuotesFragment: onResume()

Como vemos en la versión que implementa setRetainInstance(true); no destruye ni crea los Fragments, además los vincula de nuevo al recrear la actividad tras el cambio de orientación.

Mantener la Cita seleccionada en la orientación previa

Pretendemos:

  • Que al cambiar de orientación la cita seleccionada vuelva a estar seleccionada en la nueva orientación,
  • Si se cambia de orientación y todavía no se había seleccionado ninguna cita, entonces no se seleccione tampoco ninguna en la nueva orientación.

Modificar el código para que realice lo pedido

Notas para la realización

  • El método setRetainInstance fuerza a que la instancia del objeto Fragment no se pierda, es decir todos sus miembros siguen con su valor.
  • En el Fragment TitlesFragment, si definimos una variable miembro del Fragment que mantenga el valor del item seleccionado, entonces tras el cambio de orientación, tendremos disponible el valor de lo que había seleccionado el usuario.
  • Tener en cuenta también el caso en que el cambio de orientación se produzca y todavía no se hubiera seleccionado un autor de la lista.
  • En el Fragment QuotesFragment tendremos que llamar al método que muestre la selección que tenía activa antes del cambio de orientación.