Aprendiendo Android VI – Recordando valores: “Shared preferences”

Aprendiendo Android VI – Recordando valores: “Shared preferences”

Desarrollo y programación

Aprendiendo Android VI – Recordando valores: “Shared preferences”

15 agosto, 2010 09:40
Continuamos nuestro camino en el aprendizaje

de funcionalidades con una nueva y veraniega entrega de «aprendiendo android»
Hasta ahora estamos viendo partes sólidas del código de una aplicación, ajustes gráficos, listeners, acceso gps  movimiento entre actividades…
Esta vez nos introducimos en esa parte del código que no realiza una acción concreta, sino que ayuda a que otras cosas del código, como por ejemplo las vistas en las entregas anteriores, puedan tener datos comunes o compartidos. Hoy hablaremos de «shared preferences».
Podemos decir que «shared preferences» tiene la funcionalidad inicial de recordar un valor y compartirlo con otros métodos o actividades. Lo realmente interesante de esta función es que este valor continuará grabado y recordado aunque cerremos nuestra aplicación o reiniciemos el móvil.

Es importante recalcar que sabiendo como actúa «shared preferences»,  se puede convertir en un aliado casi indispensable ya que, usándolo con imaginación, puede cumplir una gran diversidad de funciones dentro ser las aplicaciones.
Dentro de esa diversidad de utilidades podemos encontrar una serie de funciones que aparte de ser  muy solicitadas, pueden ahorrarnos mucho tiempo de trabajo dependiendo de lo que estemos realizando.
Por ejemplo, gran cantidad de aplicaciones que instalamos en nuestros teléfonos tienen las particularidad de que si es la primera vez que la ejecutamos nos da una serie de opciones, si ya la hemos ejecutado con anterioridad, nos ofrecerá otras opciones diferentes. Esto puede realizarse fácilmente con «shared preferences».

Otro ejemplo de esta funcionalidad es la grabación de usuarios, quiero decir, pongamos el ejemplo de que estamos trabajando en una aplicación que va a poder ser ejecutada por algunos usuarios registrados y cada uno de ellos llevara una condición concreta. Lo más normal en estos casos es acceder a una base de datos, pero si estamos hablando de un número no muy elevado, podemos crear las características de cada usuario con “shared preference” ya que comentamos serán estas recordadas de forma permanente.
Es una opción muy cómoda si nuestra aplicación no lleva demasiados valores fijos, ya que nos puede ahorrar las conexiones con bases de datos.
Para esta ocasión he montado un sencillo interface con dos botones y un campo de texto.

El primer botón “Guardar” tiene la función de guardar dentro de nuestro “shared preferente” el valor que hayamos puesto dentro de nuestro campo de texto. El segundo “Mostrar” será el encargado de recuperar ese valor en el momento que se lo pidamos.
En este punto vamos a recordar la importante característica de esta función. Pongamos que escribimos en nuestro campo de texto “Hola androide” y pulsamos el botón guardar, acto seguido apagamos nuestro teléfono, volvemos a encenderlo y ejecutamos de nuevo nuestra aplicación, si directamente pulsamos el botón “Mostrar”, nos seguirá recuperando el valor anteriormente guardado “Hola androide”.
Para este ejemplo, como hemos hecho en otras ocasiones, vamos a ver el código de nuestra aplicación completo y después lo iremos detallando por partes.

***
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class elAndroideLibre extends Activity {

private EditText Caja;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Caja =(EditText) findViewById(R.id.edittext);
Button botonuno =(Button) findViewById(R.id.boton1);
Button botondos =(Button) findViewById(R.id.boton2);

botonuno.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){

String nombre=Caja.getText().toString();

SharedPreferences settings = getSharedPreferences(«perfil», MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putString(«nombre»,nombre );
editor.commit();

}
});

botondos.setOnClickListener(new View.OnClickListener(){ // llave 1
public void onClick(View view){ // llave 0

SharedPreferences settings = getSharedPreferences(«perfil», MODE_PRIVATE);
String nombre = settings.getString(«nombre», «valorpordefecto»);
Toast.makeText(elAndroideLibre.this, nombre, Toast.LENGTH_SHORT).show();

}
});

}

}
***

La parte del código que hace referencia al botón y su listener, asi que los Toast, ya han sido explicada en entregas anteriores por lo que entramos directamente con «shared preferences».
Para simplificar al máximo el proceso diremos que este puede dividirse en dos grandes bloques, grabación de un valor y recuperación de este.
Veamos como se graba este valor dentro del «shared preferences»
El caso más normal es que nos sea de utilidad asignarle un valor que se defina por el usuario, para esto lo único que habría que hacer es leerlo desde un EditText.

Caja =(EditText) findViewById(R.id.edittext);

Con las cuatro siguientes líneas estamos asignando al «shared preferences» llamado «settings» la propiedad de usar datos compartidos (getSharedPrefetences).

SharedPreferences settings = getSharedPreferences(«perfil», MODE_PRIVATE);

Estamos indicándole que vamos a editar su valor (SharedPreferences.Editor)

SharedPreferences.Editor editor = settings.edit();

Y le estamos pasando el valor que queremos asignarle en forma de String (editor.putString)

editor.putString(«nombre»,nombre );
editor.commit();

Ya tenemos nuestro valor «shared preferences» grabado.
Con la línea de código

Caja.setText(«»);

Lo que estamos haciendo es volver a dejar en blanco nuestro campo de texto por si queremos introducir un nuevo valor, también simplemente por motivo estético o facilidad de uso. Estos detalles son mínimos pero el usuario final siempre los agradece.

En este punto es cuando vemos el segundo bloque, las recuperación de un valor.
Veamos el código de recuperación de un «shared preferences», el que ejecuta nuestro botón “Muestra”

***
SharedPreferences settings = getSharedPreferences(«perfil», MODE_PRIVATE);

String nombre = settings.getString(«nombre», «valorpordefecto«);

Toast.makeText(elAndroideLibre.this, nombre, Toast.LENGTH_SHORT).show();

***

En primer lugar estamos, de igual forma que cuando grabamos un código, asignando la propiedad de compartir valores en nuestro “shared preferentes”

SharedPreferences settings = getSharedPreferences(«perfil», MODE_PRIVATE);

Tras esto, vamos a indicar que lo que vamos a hacer es que “settings”, que es el nombre con el que hemos designado nuestro “sharedc preferences”, llame al valor “nombre”.

String nombre = settings.getString(«nombre», «valorpordefecto«);

Y por último, por supuesto este paso no es necesario, vamos a mostrar nuestro valor guardado por pantalla con un mensaje Toast.

Toast.makeText(elAndroideLibre.this, nombre, Toast.LENGTH_SHORT).show();

Ya tenemos nuestro valor «shared preferences» mostrado.

He comenzado este artículo señalando que “shared preferente” tiene muchas posibilidades, y completamente cierto. Es una opción que deja mucho juego a la imaginación, personalmente, me ha servido de solución a situaciones que inicialmente pensaba que podían llevar una ejecución más compleja.
Hemos hablado del ejemplo de reconocer si se accede por primera vez o no a una aplicación con esta funcionalidad. No había más que al iniciar un programa hacer que revise si determinado “shared preferentes” tiene asignado un valor. Si lo tiene, es que ya se le ha asignado anteriormente desde una parte de nuestro programa, por lo que ya se ha accedido anteriormente. Si no lo tiene, se lo asignaremos para que la próxima vez que ejecutemos la aplicación si nos reconozca.
Ejemplos como este pueden darse con facilidad, como decía, esta función puede aplicarse con imaginación a una diversidad importante de funciones.
En esta ocasión os adjunto un enlace con el apk de esta pequeña app, para que comprobéis vosotros mismo el funcionamiento.
Os animo igualmente a copiar el código completo que se adjunta en este artículo para que podáis realizar variaciones a vuestro gusto.
Espero que os haya sido de utilidad y que saquéis el provecho que puede sacarse a esta opción, dejad que vuele la imaginación ;)
..Y como siempre, mi opinión de que el desarrollo requiere de más o menos conocimientos, pero sobre todo, requiere de ganas, ilusión y originalidad.

P.D: Y un archivo .apk para que os descaguéis como Bonus ;)

Saludos, Vierco.