Bienvenidos sean a este post, hoy veremos donde se guardan nuestras preferencias y como recuperarlas, si observaron en los posts anteriores, cada vez que nosotros trabajabamos sobre las preferencias tanto sea con PreferenceActivity como PreferenceFragment, cada vez que se realizaba una modificacion esta quedaba guardada y si te paso como a mi, te preguntarias porque se guardaba esa modificacion si nosotros no especificamos ningun archivo donde almacenarlo, esto es porque Android tiene un sector asignado para guardar las preferencias, el lugar esta ubicado en:
data/data/nombre_del_paquete/shared_prefs/nombre_del_paquete_preferences.xml
Para entender un poco mejor la ruta de la ubicacion del archivo veamos como seria para el caso de la app Asteroides:
data/data/com.tinchicus.asteroides/shared_prefs/com.tinchicus.asteroides_preferences.xml
Como pueden ver el nombre generado automaticamente es el nombre del paquete con el guion bajo y preferences, si abrimos el archivo tendremos el siguiente codigo:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="jugadores">5</string>
<boolean name="multi" value="true" />
<boolean name="musica" value="false" />
<string name="graficos">0</string>
<string name="fragmentos">3</string>
<string name="conexion">2</string>
</map>
Como pueden ver se almacenan los valores en base al key asignado en los archivos XML de preferencias, y con nuestra accion a la hora de seleccionarlos. Esto es en el caso basico, si bien nosotros mas adelante veremos como crear nuestros propios archivos por ahora es bueno saber que este archivo se genera automaticamente y lo tendremos a nuestra disposicion en cualquier proyecto iniciado por nosotros. Ahora veremos como habilitar la opcion para poder ver esta ubicacion, antes se utilizaba la opcion de Android Device Monitor pero hoy en dia esta descontinuada, hoy se ve con la opcion Device File Explorer pero antes veamos los pasos para acceder a ella, primero iniciemos nuestra app

Hacen click en el boton de play para iniciar la app, una vez apretado aparecera el siguiente cuadro

Aca deben seleccionar su maquina virtual favorita, si no tienen ninguna les recomiendo este post para crearla, yo utilizo siempre esta en particular porque es la mas vieja y con mejor performance en mi equipo, cuando la app este funcionando en la maquina virtual como se ve en la siguiente imagen

Ahora deberemos volver a nuestro editor para ir al menu View -> Tool Windows -> Device File Explorer

Con la maquina virtual encendida nos aparecera el siguiente cuadro

Aca podemos ver todos los archivos y directorios de nuestro dispositivo pero como dijimos esto sera para la virtual que este activa, en el caso de tener varias virtuales abiertas deberian seleccionar la siguiente opcion resaltada para cambiar a la virtual deseada para explorar sus archivos

Ahora vamos a mostrar la ubicacion del archivo antes explicado

Como pueden ver estan todos los paquetes instalados en nuestro dispositivo, como vimos antes la ubicacion de nuestro archivo generado y como vimos antes el codigo almacenado en el mismo, esto tambien aplica si verificaramos nuestra app con un dispositivo movil conectado como vimos en este post, ahora si nosotros desconectamos o cerramos nuestro equipo virtual nos quedara de la siguiente manera

Con esto vimos donde se guardan nuestras preferencias, las referencias estaran informadas por el nombre informado en la propiedad android:key de nuestro archivo XML de preferencias, ahora vamos a ver como recuperar esa informacion. Para ver nuestros valores vamos a hacer una pequeña modificacion «temporal» en nuestra app Asteroides, con nuestra app abierta vamos a acceder a nuestra clase MainActivity para agregar la siguiente funcion:
public void mostrarPreferencias(View view){
SharedPreferences pref =
PreferenceManager.getDefaultSharedPreferences(this);
String s = "música: " + pref.getBoolean("musica",true)
+ ", graficos: " + pref.getString("graficos","?");
Toast.makeText(this,s,Toast.LENGTH_SHORT).show();
}
En esta funcion llamada mostrarPreferencias() primero crearemos un objeto llamado pref de la clase SharedPreferences donde por medio de la siguiente linea:
PreferenceManager.getDefaultSharedPreferences(this);
Le diremos que cargue los datos almacenados en nuestro archivo dentro del recurso shared_prefs, luego crearemos una variable de tipo String llamada s en la cual almacenaremos dos valores de nuestro archivo de shared_prefs, en este caso musica y graficos, luego por medio de la clase Toast mostraremos de forma temporal estos valores en pantalla. Nuestro nuevo codigo de la clase MainActivity quedara de la siguiente manera:
package org.example.asteroides;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void lanzarAcercaDe(View view){
Intent i = new Intent(this, AcercaDe.class);
startActivity(i);
}
public void lanzarPreferencias(View view){
Intent i = new Intent(this, Preferencias.class);
startActivity(i);
}
public void mostrarPreferencias(View view){
SharedPreferences pref =
PreferenceManager.getDefaultSharedPreferences(this);
String s = "música: " + pref.getBoolean("musica",true)
+ ", graficos: " + pref.getString("graficos","?");
Toast.makeText(this,s,Toast.LENGTH_SHORT).show();
}
}
Como pueden ver a medida que fueron agregando la nueva funcion deberia haberse agregado automaticamente las siguientes lineas:
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
Sino fueron agregadas automaticamente deberan agregarlas manualmente de lo contrario no funcionara nuestro nuevo metodo. Ahora solo nos falta agregar el evento para utilizarlo, para ello debemos modificar nuestro archivo activity_main.xml, en este caso modificaremos el boton de Jugar para llamar al nuevo metodo, veamos la modificacion:
<Button
android:id="@+id/botJugar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonJugar"
android:onClick="mostrarPreferencias" />
Como pueden ver solo agregamos un listener para escuchar el evento click sobre el elemento, en este caso un boton, y al recibirlo llama al nuevo metodo llamado mostrarPreferencias(), el nuevo codigo queda de la siguiente forma:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="30dp"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tituloJuego"
android:gravity="center"
android:layout_marginBottom="20dp"
android:textSize="25sp"
/>
<Button
android:id="@+id/botJugar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonJugar"
android:onClick="mostrarPreferencias"
/>
<Button
android:id="@+id/botConf"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonConf"
android:onClick="lanzarPreferencias"
/>
<Button
android:id="@+id/botAcerca"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonAcerca"
android:onClick="lanzarAcercaDe"
/>
<Button
android:id="@+id/botSalir"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/botonSalir"
/>
</LinearLayout>
Ahora vamos a ver en el siguiente video como queda funcionando nuestro nuevo metodo y como es mostrado en pantalla
Como pueden ver en el video, si nosotros tocamos el boton Jugar nos mostrara los valores de música y de graficos, y si vamos al boton Configurar y variamos estas dos preferencias al volver a llamar a nuestro metodo veremos como se ha modificado, este evento deberia agregarse a la vista apaisada (land) pero como esto es de forma temporal, es decir solo para ver como recuperar estos datos, no les recomiendo modificarlo porque proximamente volveremos a trabajar sobre este elemento pero si en el activity_main.xml para poder probar como se ve en el video.
En resumen, hoy hemos aprendido donde se almacenan por defecto nuestras preferencias, hemos visto como se pueden acceder a ellas por medio de nuestro editor, tambien hemos visto como se puede recuperar esa informacion almacenada para poder ser utilizada, en este caso solamente la mostramos. Espero les haya gustado, sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50