SharedPreferences aún más fácil en Android

Investigando un poco en una de mis librerías favoritas, ActionBarSherlock, encontré una forma de crear pantallas de configuración con muy poquito código. Si recordaís ya vimos algo de este tema en un artículo sobre las SharedPreferences. Vamos a tomar el ejemplo que nos da esta librería y lo veremos en detalle.

Las pantallas de configuración no tienen muchas opciones, pero con lo que nos ofrece es suficiente para la mayoría de cosas que podemos configurar. La primera diferencia con las pantallas que normalmente hacemos es que estas no se guardan en la carpeta layout, sino en la xml. Creamos la carpeta xml, dentro de res, y en xml creamos un archivo llamado preferences.xml.


<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="@string/inline_preferences">

        <CheckBoxPreference
                android:key="checkbox_preference"
                android:title="@string/title_checkbox_preference"
                android:summary="@string/summary_checkbox_preference" />

    </PreferenceCategory>

    <PreferenceCategory android:title="@string/dialog_based_preferences">

        <EditTextPreference
                android:key="edittext_preference"
                android:title="@string/title_edittext_preference"
                android:summary="@string/summary_edittext_preference"
                android:dialogTitle="@string/dialog_title_edittext_preference" />

        <ListPreference
                android:key="list_preference"
                android:title="@string/title_list_preference"
                android:summary="@string/summary_list_preference"
                android:entries="@array/entries_list_preference"
                android:entryValues="@array/entryvalues_list_preference"
                android:dialogTitle="@string/dialog_title_list_preference" />
    </PreferenceCategory>
    <PreferenceCategory android:title="@string/launch_preferences">
        <PreferenceScreen
                android:title="@string/title_intent_preference"
                android:summary="@string/summary_intent_preference">
            <intent android:action="android.intent.action.VIEW"
                    android:data="http://www.android.com" />
        </PreferenceScreen>
    </PreferenceCategory>
    <PreferenceCategory android:title="@string/preference_attributes">

        <CheckBoxPreference
                android:key="parent_checkbox_preference"
                android:title="@string/title_parent_preference"
                android:summary="@string/summary_parent_preference" />
        <!-- The visual style of a child is defined by this styled theme attribute. -->
        <CheckBoxPreference
                android:key="child_checkbox_preference"
                android:dependency="parent_checkbox_preference"
                android:layout="?android:attr/preferenceLayoutChild"
                android:title="@string/title_child_preference"
                android:summary="@string/summary_child_preference" />
    </PreferenceCategory>
</PreferenceScreen>


Los elementos básicos de esta pantalla son los PreferenceScreen, las PreferenceCategory y los items con los que guardaremos nuestras configuraciones. La PreferenceScreen es la pantalla entera que se nos mostrará, donde se mostrarán el resto de elementos, y las PreferenceCategory nos permiten crear categorías o agrupaciones dentro de nuestra pantalla.

El elemento común a los diferentes items es que debemos definir la propiedad key. Esta va a ser la clave que se guarde en las SharedPreferences para luego poder recuperar los valores almacenados. También podemos darle un título con title y una descripción con summary.

Vamos a ver los elementos que podemos utilizar:
  • CheckBoxPreference, es un checkbox. En los dos últimos podemos ver un ejemplo de como un CheckBox depende de otro, diciéndole al segundo que depende del primero, este se activará o no según el valor del primero.
  • EditTextPreference, también muy simple. Un TextBox donde podemos ingresar un texto.
  • ListPreference, damos al usuario una serie de opciones predefinidas donde se puede escoger uno de los valores. Luego volveremos a ellos para ver como configurarlos.
  • RingtonePreference. Un item un tanto curioso, nos permite seleccionar una canción cualquiera de nuestro dispositivo.
Para poder configurar un ListPreference debemos crear un array con los valores que puede elegir el usuario. Para ello en la carpeta values dentro de res creamos un archivo llamado arrays.xml, y dentro de este incluimos todos los arrays que necesitemos.


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="entries_list_preference">
        <item>Alpha Option 01</item>
        <item>Beta Option 02</item>
        <item>Charlie Option 03</item>  
    </string-array>

    <string-array name="entryvalues_list_preference">
        <item>alpha</item>
        <item>beta</item>
        <item>charlie</item>  
    </string-array>
</resources>


Para indicar los valores de nuestro ListPreference seteamos las propiedades entries, que será el texto que se muestre al usuario, y entryvalues, que serán los valores que manejará internamente la aplicación. Aunque aquí se manejan dos arrays, si queréis, podéis utilizar uno solo en ambos valores.

Otra de las opciones que hay es insertar una PreferenceScreen dentro de otra. En nuestro ejemplo se inserta un Intent dentro de este para que elijamos que aplicación vamos a utilizar para abrir un navegador.

Vamos ahora a ver como mostrar nuestra pantalla de configuración, simplemente creamos una nueva clase llamada Preference que será muy similar a una Activity salvo que  heredará de SherlockPreferenceActivity. Acordaros de definirla igual que cualquier otra Activity en el archivo AndroidManifest.xml.

public class Preference extends SherlockPreferenceActivity {    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preferences);
    }
}


Como veis es como una Activity salvo por la herencia y que en vez de hacer un setContentView llamamos a addPreferencesFromResource y le indicamos nuestro archivo de configuración. Al haber heredado de esta clase no tendremos que hacer nada más, sencillo ¿no?

Cada vez que entremos la configuración ya estará cargada correctamente, y para guardar simplemente  seleccionamos un valor en cualquiera de nuestros items de configuración y se guardará automáticamente.

Por último, vamos a ver como podemos obtener los valores configurados desde cualquier sitio de nuestra aplicación. Simplemente creamos un objeto de tipo SharedPreferences y obtenemos el valor correspondiente, en este caso el que tiene la key "edittext_preference".

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Context);
String valor = prefs.getString("edittext_preference", "valor por defecto");


Para este artículo he seguido el ejemplo que ActionBarSherlock pone a nuestra disposición en su cuenta de Github.com. No he incluido los valores @string de todos los componentes porque, además de no ser el punto importante de este artículo, los podéis encontrar en el lugar indicado o sino sustituirlos vosotros por los que se os antoje.

Espero que mi primera entrada con el nuevo diseño, os resulte  más amena y fácil de leer. Como siempre estamos encantados de leer vuestros comentarios y saber que opináis para seguir mejorando.

Escrito por 3pies, desarrollo de aplicaciones móviles Android & web

Comments are closed.