Android. Persistencia de datos en la rotación de pantalla. Portrait <-> Landscape.

portrait_landscape

Cuando programamos para un dispositivo móvil, es una buena práctica asegurarnos de que nuestras interfaces se visualizarán de una forma decente en cualquier orientación que adopte el teléfono, tanto en “Portrait” (vertical) como en “Landscape” (horizontal).

Por defecto, cuando ocurre un cambio en la configuración del teléfono, algunas configuraciones del dispositivo pueden cambiar en tiempo de ejecución (como la orientación de la pantalla, la disponibilidad del teclado o el idioma). Cuando se produce un cambio de este tipo, Android reinicia la actividad en ejecución, es decir, destruye (OnDestroy) y reconstruye (onCreate) la actividad. El comportamiento de reinicio está diseñado para ayudar a la aplicación a adaptarse a las nuevas configuraciones mediante la recarga automáticamente de recursos alternativos que responden a la nueva configuración del dispositivo. En el caso de la rotación, la finalidad es cargar nuevos layout para ofrecer una vista más cómoda al usuario.

Si bien podría pensarse que únicamente el cambio se da a nivel visual, no hay que olvidar que el usuario pudo haber introducido datos en una pantalla o pudo haber seleccionado algún ítem en un ListView. En estos casos, la rotación de pantalla no tiene que truncar estas acciones y por el contrario, debemos hacer todo lo posible para que el usuario visualice esos mismos datos o ese mismo ítem en la nueva vista que ha sido llamada.

Para mantener la persistencia entre ambos tipos de orientaciones y manejar adecuadamente el reinicio, es importante que la actividad restablezca su estado anterior a través del ciclo de vida normal de la actividad. Para ello utilizaremos los métodos onSaveInstanceState() y onRestoreInstanceState(). El primero es llamado antes de destruir la actividad y con él guardaremos en el objeto Bundle suministrado como parámetro la información que deseemos. Con el segundo, llamado durante el onCreate, recuperaremos dicha información del objeto Bundle. De esta manera la actividad se mostrará con la información tal y como estaba en la actividad anterior. Estos métodos se utilizan en la gran mayoría de los casos, cuando toda nuestra información comprende tipos primitivos, o es Serializable (Parcelable).

persistencia_portrait_landscape

Veamos un pequeño ejemplo en código, mediante el cuál primero utilizamos el método onSaveInstaceState() para guardar en el Bundle savedInstanceState un valor int que representará la puntuación y un valor tipo string que representará un nombre. A continuación utilizaremos el método onRestoreInstanceState() para restaurar las variables guardadas según los valores almacenados en el Bundle.

Falta comentar los pasos a seguir para que la pantalla de la aplicación trabaje en ambas orientaciones. Para lograrlo, simplemente debemos crear una nueva carpeta dentro del directorio “res”, llamada “layout-land”. Una vez creada, para la orientación horizontal, crearemos un xml layout en “layout-land” con el mismo nombre que el xml de la carpeta “layout”. Es decir, el nombre del archivo xml en la carpeta “layout” y “layout-land” debe ser el mismo.
Estos ficheros se programarán de forma independiente para que se muestre la distribución de las pantallas de la manera deseada según la orientación.

layout-land

Y esto es todo. NOTA: Si estás utilizando MAC OS X, para cambiar la orientación de la pantalla en el emulador debes utilizar la combinación de teclas fn + ctrl(izquierdo) + F11.

One Response to “Android. Persistencia de datos en la rotación de pantalla. Portrait <-> Landscape.”

  1. Cefranlly dice:

    Que pasaría si no tengo la carpeta /layout-land? reutilizaría la existente o daría un error en tiempo de ejecución? según leí no debe dar error para las Activities.
    Para el caso de que no sean datos primitivos que método se utilizaría? OnRetainNonConfigurationInstance()?

Deja un comentario