En esta entrada veremos como mantener los datos de nuestra aplicación cuando rotamos la pantalla.
-
Problema
Cuando tenemos una aplicación y rotamos la pantalla, puede que perdamos toda la información que teníamos si no lo tratamos, ya que Android destruye y recrea la actividad que está en ejecución. Es por ello por lo que queremos guardar la información para que no perdamos los datos introducidos.
-
Solución
Hay diferentes enfoques sobre esto. Si toda nuestra información comprende tipos primitivos, o en Strings, o es Serializable, podemos guardar su estado mediante el método onSaveInstanceState() en el Bundle que pasamos.
Otra solución nos permite retornar un objeto singular arbitrario que implementado mediante el método onRetailNonConfigurationInstance() cerca del final del método onCreate() para ver si hay algún dato previo guardado, y entonces asignarlo.
-
Discusión
Usando onSaveInstanceState()
Tomando como ejemplo la APP que hicimos el otro día, la cual podemos encontrar aquí: APP – Stepper y la cual tenía este problema.
Vamos a usar el método onSaveInstanceState() y onRestoreInstanceState() para que cuando rotemos la pantalla, la información del contador siga en como lo dejamos.
El método onSaveInstance() podemos agregarlo una vez cerrado el método onCreate() y tomaría esta forma:
@Override protected void onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); outState.putInt("CONT", cont); }
Lo que hacemos es guardar el estado de la Activity antes de ser destruida con el super.onSaveInstanceState(outState) y luego le agregamos con el método putInt() para guardar la información que queremos, en este caso queremos guardar lo que valía la variable cont que estamos usando para el TextView. Este método pide como argumento una clave, la cual he llamado “CONT”, y el valor, que en este caso es cont.
Existen otros métodos como son putString(), putBoolean(), putChar() etc, pero en este caso guardamos un entero, por tanto hemos usado putInt().
A continuación, una vez que tenemos este método sustituido, vamos a sustituir otro llamado onRestoreInstanceState(), el cual es el que leerá el objeto Bundle que guardamos con anterioridad y pondrá de nuevo los datos en su sitio.
@Override protected void onRestoreInstanceState(Bundle savedInstanceState){ super.onRestoreInstanceState(savedInstanceState); cont = savedInstanceState.getInt("CONT"); tvCont.setText(String.valueOf(cont)); }
En este método, vemos que recibimos como parámetros un objeto Bundle, que en este caso es el que creamos en el método onSaveInstanceState(), el cual trae nuestra información guardada.
Lo primero que hacemos, es restaurar el estado mediante el método savedInstanceState(savedInstanceState), y luego le aplicamos a la variable cont el valor que tenía anteriormente, mediante la llamada al método getInt() que tiene el objeto savedInstanceState, y pasando como argumento la clave que pusimos, en este caso “CONT”.
Una vez hecho esto, volvemos a establecer al TextView el valor que tenía, y ahora si rotamos nuestra aplicación, tendremos la misma información que antes teníamos.
Ahora podemos pasar de nuevo a probar la aplicación, o implementar estos métodos en alguna existente y veremos si esto funciona, os pongo las capturas de mi emulador para que veais cual es mi resultado:
Cualquier aporte o corrección es bienvenido.
Saludos!!!