Uso de recursos y recuperación de estado

Posted by in Android, Introducción

En muchas ocasiones el uso de recursos en android no tiene relación con el aspecto de una pantalla o configuración en general, por lo que hay que hacer un desarrollo genérico para que todos los dispositivos y todas las configuraciones funcionen de forma correcta. Para ello android utiliza el uso de cualificadores que facilitan este proceso.

Adaptación de recursos

Todos los recursos que se utilizan en una aplicación se incluyen dentro de la carpeta res, siendo la clasificación en layouts, values, drawables, etc…. Pero para poder categorizar los recursos y su adaptación se utilizan los cualificadores. Por ejemplo no se verá de la misma forma una palabra si el dispositivo está configurado en español que si lo está en inglés. No se verá una disposición de la misma forma si la pantalla está en horizontal que si lo está en vertical. Lo mismo pasa con las imágenes, ya que no se verá igual una imagen en una pantalla de 4 pulgadas que en una de 6

A continuación se explican los principales adaptadores, pero la lista completa de los existentes se puede consultar en este enlace

Recursos de idioma

Las palabras forman parte esencial de una aplicación y en la mayoría de los casos se configuran en el atributo text del componente

Sin embargo si se hace de esta forma al cambiar el dispositivo de idioma la palabra seguirá estando de la misma forma. Para poder hacerlo de forma correcta los pasos sería:

  • Crear un item string dentro del archivo values

  • Apuntar al item creado

De esta forma podemos internacionalizar el texto de forma sencilla. Para ello se crea un archivo string con los sufijos del idioma seleccionado. Por ejemplo si es inglés se crea un sufijo -en y traducir todos los textos del archivo.

De esta forma en el caso de cambiarse el idioma del dispositivo también se cambiarían los textos al idioma correspondiente. Si se cambiase a un idioma que no está declarado se cogerá el idioma por defecto (aquel archivo que no tiene cualificador)

Recursos de disposición

En muchas ocasiones es necesarios diferenciar la forma de disponer los recursos para una vista en horizontal y una vista en vertical. Para ello lo necesario es declarar un nuevo archivo .xml pero con el cualificador correspondiente (land / portraint). Lo realmente importante en este caso es que todos los elementos del layout tengan la misma id o el sistema no será capaz de encontrar los recursos. En el caso de necesitar layouts con elementos diferentes habrá que crear el seteo del layout por código

Este tipo de programación es utilizada por ejemplo en un proyecto con disposición master /detail

Recuperación del estado

En el momento que alguna configuración del teléfono cambie o simplemente cuando la activity pasa a estado pausado, al volver a entrar por le método onCreate se restablecen todos los datos. Por ejemplo al cambiar la disposición de la pantalla, al cambiar el idioma, al abrir una nueva aplicación, etc… En estos casos se necesita que al volver la pantalla a primer plano todos los datos vuelvan a estar tal y como estaban. Para ello hay que efectuar un salvado de datos previo a los cambios y una recuperación del estado después de los cambios. Esto se puede realizar gracias a dos métodos

El primer método se ejecutará solo ante un cambio de configuración o pausado de la actividad. Los datos se guardan con un par clave valor

El segundo método se ejecuta al recuperarse la actividad y se recuperan los datos con la clave utilizada en el primer método. Por lo general es buena práctica utilizar una variable para guarda la clave. También se puede recuperar el estado con el parámetro del método onCreate

Importante es saber que esto solo se puede hacer después de haber instanciado los elementos ya que si no dará error de nullpointer, de la misma forma que hay que evaluar si el contenido es diferente de vacío para no obtener nuevamente un nullpointer. Hay que tener en cuenta que las acciones de recuperación de recuperación se pueden realizar también en el método onCreate(Bundle) accediendo al parámetro bundle que otorga el método.cLa diferencia entre ambos es la posibilidad de obtener un objeto null, por lo que la comprobación es básica. Según la documentación oficial:

onSaveInstanceState (Bundle outState)

This method is called before an activity may be killed so that when it comes back some time in the future it can restore its state. For example, if activity B is launched in front of activity A, and at some point activity A is killed to reclaim resources, activity A will have a chance to save the current state of its user interface via this method so that when the user returns to activity A, the state of the user interface can be restored via onCreate(Bundle) or onRestoreInstanceState(Bundle). The default implementation of onSaveInstanceState() takes care of saving the data related with each n every view that is having an id. If called, this method will occur before onStop(). There are no guarantees about whether it will occur before or after onPause().

onRestoreInstanceState (Bundle savedInstanceState)

This method is called after onStart() when the activity is being re-initialized from a previously saved stateThis method is called after onStart() when the activity is being re-initialized from a previously saved state, given here in savedInstanceState (which is a bundle object containing data saved in onSaveInstanceState(Bundle)).Most implementations will simply use onCreate(Bundle) to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation. The default implementation of this method performs a restore of any view state that had previously been frozen by onSaveInstanceState(Bundle).