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:

Anuncios
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

android65

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

android66

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

android67
Anuncios

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

android68

Con la maquina virtual encendida nos aparecera el siguiente cuadro

android69

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

android70

Ahora vamos a mostrar la ubicacion del archivo antes explicado

android71
Anuncios

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

android72

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();
    }
}
Anuncios

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.

Anuncios

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.00