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.
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.
Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. ACEPTAR