Implementación : Preference Activity / Fragment
1. Introducción
2. Creando las preferencias
- 2.1. Controles
- 2.2. Iniciar Intents
- 2.3. Sub-Preferencias
- 3.1. Preference Activity
- 3.2. Preference Fragment [API 11 – Honeycomb]
4. Leyendo las preferencias guardadas
5. OnSharedPreferenceListener()
Contenido:
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.
<PreferenceCategory android:title="Cuenta" > </PreferenceCategory>
<EditTextPreference /> : Permite introducir texto. [String]
<EditTextPreference android:title="" <!-- Titulo mostrado en la pantalla de preferencias --> android:key="" <!-- Valor identificativo de la variable --> android:sumary="" <!-- Descripción mostrada --> android:dialogTitle="" <!-- Titulo que llevará la nueva ventana --> />
<CheckBoxPreference /> : Permite alternar valores. [boolean]
<CheckBoxPreference android:key="" <!-- Valor identificativo de la variable --> android:title="" <!-- Título mostrado --> android:summary="" <!-- Descripción mostrada --> />
<ListPreference /> : Permite seleccionar un elemento de una lista. Los valores entryValues y entries van definidos en un array en el archivo res > values > strings.xml [String]
ejemplo :
<string-array name="servidores"> <item>España</item> <item>Estados Unidos</item> <item>Italia</item> <item>Reino Unido</item> </string-array> <string-array name="valores_servidor"> <item>spa</item> <item>usa</item> <item>ita</item> <item>ukk</item> </string-array>
<ListPreference android:title="" <!-- Titulo mostrado en la pantalla de preferencias --> android:summary="" <!-- Descripción mostrada --> android:dialogTitle="" <!-- Titulo que llevará la nueva ventana --> android:entryValues="@array/valores_servidores" <!-- Identificación de los valores anteriores --> android:entries="@array/servidores" <!-- Valores que verá el usuario --> />
<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 android:title="" <!-- Titulo mostrado en la pantalla de preferencias --> android:summary="" <!-- Descripción mostrada --> android:dialogTitle="" <!-- Titulo que llevará la nueva ventana --> android:entryValues="" <!-- Identificación de los valores anteriores --> android:entries="" <!-- Valores que verá el usuario --> />
Este es el archivo de preferencias que utilizaremos para este ejemplo :
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="Cuenta" > <EditTextPreference android:title="e-mail" android:icon="@drawable/ic_action_person" android:summary="Introduce el nombre de usuario que utilizastes al crear tu cuenta." android:key="Username"/> </PreferenceCategory> <PreferenceCategory android:title="Actualizar"> <CheckBoxPreference android:icon="@drawable/ic_action_download" android:key="actualizaciones" android:title="Actualizaciones automáticas" android:summary="Si esta activado los datos se actualizaran automáticamente cada vez que ejecutes la aplicación." /> <ListPreference android:title="Servidor de descarga" android:icon="@drawable/ic_action_important" android:summary="Selecciona el servidor desde el que se actualizara la aplicación." android:dialogTitle="Servidores disponibles" android:entryValues="@array/valores_servidor" android:entries="@array/servidores" /> </PreferenceCategory> <PreferenceCategory android:title="Contenido" > <MultiSelectListPreference android:key="multiListPref" android:title="Categorias" android:icon="@drawable/ic_action_event" android:summary="Selecciona las categorias que quieres sincronizar." android:dialogTitle="Tus categorias" android:entryValues="@array/valores_categorias" android:entries="@array/categorias" /> </PreferenceCategory> </PreferenceScreen>
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 :
<Preference android:title="Visita la web!" android:icon="@drawable/logomsc" android:summary="Accede a mscdroidlabs.es para ver mas ejemplos de desarrollo"> <intent android:action="android.intent.action.VIEW" android:data="https://mscdroidlabs.es/"/> </Preference>
Y el resultado :
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í :
<PreferenceScreen <!-- Antes <PreferenceCategory/> --> android:title="Actualizar" android:icon="@drawable/ic_action_download" > <CheckBoxPreference android:key="actualizaciones" android:title="Actualizaciones automáticas" android:summary="Si esta activado los datos se actualizaran automáticamente cada vez que ejecutes la aplicación." /> <ListPreference android:title="Servidor de descarga" android:summary="Selecciona el servidor desde el que se actualizara la aplicación." android:dialogTitle="Servidores disponibles" android:entryValues="@array/valores_servidor" android:entries="@array/servidores" /> </PreferenceScreen> <!-- Antes <PreferenceCategory/> -->
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í :
package com.mscdroidlabs.preferencias; import android.os.Bundle; import android.preference.PreferenceActivity; public class Preferencias extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferencias); } }
Ahora solo queda llamar a esta Activity desde la principal para mostrar las preferencias. Por ejemplo desde las opciones del menú.
@Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { startActivity(new Intent(MainActivity.this, Preferencias.class)); return true; } return super.onOptionsItemSelected(item); }
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.
public class preference_Fragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferencias); } }
Cuando queráis mostrarlo en vuestro contenedor de fragments en la Activity principal simplemente lo reemplazáis así :
getFragmentManager().beginTransaction() .replace(android.R.id.content, new preference_Fragment()) .commit();
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.
public class MainActivity extends ActionBarActivity { @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences _sPref = PreferenceManager.getDefaultSharedPreferences(this); String usuario = _sPref.getString("Username", ""); boolean act_automaticas = _sPref.getBoolean("actualizaciones", false); String servidor = _sPref.getString("listPref", "-1"); Set<String> categoria = new HashSet<String>(); categoria = _sPref.getStringSet("multiListPref", null); if(categoria != null ){ for(String e: categoria){ Log.d(TAG, e.toString()); } } }
El segundo parámetro de los métodos para recuperar los datos será el valor que devolverá por defecto.