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.

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

/>
EditTextPreference Android

EditText Preference

 

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

 <CheckBoxPreference
	android:key="" <!-- Valor identificativo de la variable -->
	android:title="" <!-- Título mostrado -->
        android:summary="" <!-- Descripción mostrada -->

/>
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 :

<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 -->
		    />
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 
		    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 -->
		    />
MultiSelectListPreference

MultiSelectList Preference

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>
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 :

<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 :

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í :

<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/> -->

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í :
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.

 

 

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

 

public class Preferencias extends PreferenceActivity implements OnSharedPreferenceChangeListener {

	private String PREFERENCIA_USUARIO = "Username";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferencias);
	}
	
    @Override
    protected void onResume() {
        super.onResume();
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);
    }
 
    @Override
    protected void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(this);
    }
    
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPref, String key) {
        if (key.equals(PREFERENCIA_USUARIO)) {
            Preference connectionPref = findPreference(key);
            connectionPref.setSummary(sharedPref.getString(key, ""));
        }
    }

}

 

 

ejemplo_sharedejemplo_preferencias

 

 

También te podría gustar...

Ads Blocker Image Powered by Code Help Pro

Bloqueador de anuncios detectado

Por favor, desactiva tu bloqueador de anuncios para este sitio web. Sabemos que la publicidad puede resultarte molesta, pero esta es la única manera de mantener la web de forma gratuita y accesible para todo el mundo.