Implementación : Preference Activity / Fragment

1. Introducción
2. Creando las preferencias

3. Mostrando las preferencias

4. Leyendo las preferencias guardadas

5. OnSharedPreferenceListener()

 

 

 

1.Introducción

Las clases Preference Activity y Preference Fragment nos permitirán crear pantallas de configuración de una manera rápida y sencilla. Estas gestionan las Shared Preferences de manera automática, permitiéndonos definir los campos y valores mediante etiquetas XML. Aunque Preference Activity esta disponible desde la API 1 de Android, para utilizar un Preference Fragment deberemos marcar la API 11 como versión mínima.

 

2.Creando las preferencias

Como hemos dicho, todos los campos que veremos en la pantalla de preferencias se definen en un archivo XML. Así pues, creamos un nuevo archivo ‘preferencias.xml’ en el directorio Res > Xml.

Hecho esto veremos que componentes podemos incluir en este archivo y sus respectivas funciones.

 

 2.1 Controles

<PreferenceScreen /> : Es el primer componente en cada archivo de preferencias XML, este componente engloba a todos los demás. Aunque a veces podemos encontrar un PreferenceScreen dentro de otro (lo veremos mas adelante).

 

<PreferenceCategory /> : Define una categoría para agrupar distintos componentes.

 

 

<EditTextPreference /> : Permite introducir texto. [String]

EditTextPreference Android
EditText Preference

 

<CheckBoxPreference /> : Permite alternar valores. [boolean]

checkboxPreference
CheckBox Preference

 

 

<ListPreference /> : Permite seleccionar un elemento de una lista. Los valores entryValuesentries van definidos en un array en el archivo res > values > strings.xml [String]

ejemplo :

 

ListPreference
List Preference

 

<MultiSelectListPreference /> : Permite seleccionar varios elementos de una lista.

  MultiSelectList Preference esta disponible a partir de la versión Android 3.0 Honeycomb [API 11]

MultiSelectListPreference
MultiSelectList Preference

Este es el archivo de preferencias que utilizaremos para este ejemplo :

 

Shared Preferences - PreferenceActivity
Pantalla de preferencias

 

2.2. Iniciar Intents

En algunas aplicaciones encontramos preferencias que nos dirigen a una web, o abren tu aplicación de correo para mandar opiniones / feedback etc… Esto se consigue añadiendo Intents, podemos incluirlos en nuestro archivo de preferencias de la siguiente manera :

 

Y el resultado :

ejemplo_prefs
Uso de Intents

Podéis consultar todas las opciones del Intent en la página de desarrollo.

 

 

 

2.3. Sub-Preferencias

Otra manera de agrupar ciertas preferencias es mediante <PreferenceScreen />, que nos permitirá mostrar preferencias en pantallas separadas.  Siguiendo el ejemplo anterior, modificaremos el archivo XML para agrupar las preferencias de actualización.  Quedando así :

ejemplos PreferenceScreen

3.Mostrando las preferencias

 

3.1 Preference Activity

  • Una vez creado y editado el archivo XML vamos a crear una nueva Activity. La editaremos para que extienda de PreferenceActivity y llamaremos al método addPreferencesFromResource(int) para mostrar nuestras preferencias. Tal que así :

 

Ahora solo queda llamar a esta Activity desde la principal para mostrar las preferencias. Por ejemplo desde las opciones  del menú.

 

3.2 Preference Fragment

El uso de PreferenceActivity estuvo limitado hasta la llegada de la API 11 que llegaron los fragments. Si en vuestra aplicación utilizáis Fragments podéis adaptar vuestras preferencias para mostrarlas en uno de ellos. Todo lo que hay que hacer es llamar al método addPreferencesFromResource(int) desde vuestro PreferenceFragment.

 

Cuando queráis mostrarlo en vuestro contenedor de fragments en la Activity principal simplemente lo reemplazáis así :

 

 

 4. Leyendo las preferencias guardadas

Estas preferencias quedan guardadas por defecto en la ruta : /data/data/<Nombre del paquete>/shared_prefs. Para acceder a ellas haremos uso de PreferenceManager.getDefaultSharedPreferences(Context). En el siguiente ejemplo veremos como recuperar todas las preferencias definidas anteriormente.


El segundo parámetro de los métodos para recuperar los datos será el valor que devolverá por defecto.

 

 

5. OnSharedPreferenceListener()

Según la finalidad de nuestra aplicación, en ciertas preferencias será necesario mostrar el valor introducido anteriormente por el usuario. Podemos conseguirlo implementando OnSharedPreferenceListener() en nuestra actividad para ejecutar cierto código cuando se produce un cambio en alguna de las preferencias. Para este ejemplo veremos como mostrar el nombre de usuario introducido en la descripción del control “Username” (android:summary).

 

 

 

ejemplo_sharedejemplo_preferencias

 

 

Mario Camí Author

Desarrollador de aplicaciones Android. Amante de todo lo Open Source, de los videojuegos y nuevas tecnologías. En mi tiempo libre comparto todo lo aprendido y lo que aprendo en el desarrollo de Android a modo de artículo en el blog. La información nos hará libres!
  • lidavq

    Enhorabuena por el blog y muchas gracias, está todo muy bien explicado. Pero me surge una duda que no se explica nunca en ningún manual, igual es porque es muy obvia, pero yo no sé como hacerlo. Y es la recuperación de CADA UNO de los valores del multiSelectListPreference.
    Has puesto esto:
    Set categoria = new HashSet();
    categoria = _sPref.getStringSet(“multiListPref”, categoria);
    Eso devuelve varios valores, como recupero cada uno de ellos individualmente??

    • Hola Lidavq! Llevas razón, se me pasó por alto el recorrer el array de Strings. En efecto la variable ‘categorias’ recoge varios valores y para recuperarlos uno por uno hay que recorrer los elementos devueltos de la siguiente manera :

      Set categoria = new HashSet();
      categoria = _sPref.getStringSet(“multiListPref”, null);

      if(categoria != null ){
      for(String e: categoria){
      Log.d(TAG, e.toString());
      }
      }

      Gracias por comentarlo, el código se ha actualizado para que no vuelva a surgir esta duda.