El blog de Javielinux Usuario de Linux, Android developer, programador de aplicaciones web y experimentando con HTML5, CSS3 y Javascript

Creando una pantalla de preferencias en Android

Últimamente ando más que liado. Estoy estudiando AppEngine para Java, haciendo un juego para Android y terminando mi proyecto también en Android. Este último lo tengo bastante avanzado y en estos días he estado trabajando en poner una pantalla de preferencias.

Una de las cosas que más me gusta de Android es que te facilita crear muchas de las cosas comunes que necesita una aplicación y para ello suele usar archivos XML. En el caso de las preferencias no iba a ser distinto y en pocos minutos te puedes crear tus preferencias.

Esto tiene dos ventajas:

  1. En poco minutos puedes hacer algo que tardarías horas en diseñar
  2. Las preferencias tienen un aspecto común en todas las aplicaciones de Android. Así un usuario que esté acostumbrado a usar el sistema estará familiarizado con la pantalla

Ahora vamos a por el código. Para realizar una pantalla de preferencias simplemente tienes que crear una nueva Actividad que herede de PreferenceActivity. Desde el método onCreate vamos a invocar un archivo XML que se encuentra en res/xml y que contiene la estructura, claves y objetos de nuestra pantalla de preferencias. El código sería el siguiente:

public class PreferencesFromXml extends PreferenceActivity {
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);
  }
 
}

Este código es uno de los ejemplos que viene con el SDK de Google y se encuentra aquí.

Una vez hecho esto simplemente tendremos que rellenar nuestro archivo XML. Para ello lo mejor es fijarse en este ejemplo de Google donde se pueden ver como crear grupos de preferencias, listas, checkbox, etc.

Una vez hecho esto nos queda acceder a los contenidos de las preferencias. Lo mejor es que no nos tenemos que preocupar en ningún momento de almacenar la información en ningún lado, de esto se encarga Android.

Lo primero es poner bien todos los "key" en el XML. Cada objeto tiene un atributo llamado "android:key" que nos servirá para poder acceder a él cuando sea necesario.

Para poder trabajar con las preferencias necesitamos un objeto de tipo SharedPreferences que podemos obtener en nuestra actividad de la siguiente forma:

PreferenceManager.setDefaultValues(this, R.xml.prefer, false);
SharedPreferences p = 
   PreferenceManager.getDefaultSharedPreferences(this); 
p.getString("key", "value_default")

Lo primero que tenemos que poner es como "preferencias por defecto" de nuestra actividad el archivo XML que contiene las preferencias. Luego podremos acceder a las preferencias mediante el "key" y los métodos que nos ofrece el objeto SharedPreferences.

Una forma muy cómda de trabajar y fácil de usar. A continuación una imagen de como están quedando las preferencias de mi programa:

Preferencias en Android

Categorías Android Articulos

Comentarios

felipe dice:
Pues, nada hombre! admiro el orden y los topicos que planteas en tu blog! pues son de mi gran interes!

Tratare de crear mi menu de configuracion
divad dice:
Buenas,

¿Este manual sirve para la SDK 1.5? Es que al ejecutarlo me lanza errores y no aparece nada.

Gracias, un saludo.
javielinux dice:
Si funciona. Yo lo uso en AndAndo. La verdad que no tiene ninguna historia. Empieza con un archivo XML de preferencias sencillo y lo vas complicando poco a poco

Dime los errores y espero poder ayudarte

Saludos
divad dice:
Buenas, mi programa principal es config.java


import android.os.Bundle;
import android.preference.PreferenceActivity;

public class config extends PreferenceActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// Load the preferences from an XML resource
addPreferencesFromResource(R.layout.config);
}

}

Y el fichero config.xml es idéntico al siguiente:
http://developer.android.com/guide/samples/ApiDemos/res/xml/preferences.html

También he añadido los string a strings.xml

Al ejecutar el primer error que aparece en el DDMS es:
Uncaught handler: thread main exiting due to uncaught exception

Despues aparecen muchísimos más errores.

Alguna idea, gracias por la rápida respuesta.
javielinux dice:
Pues no tengo ni idea la verdad. Lo único que te puedo decir es que no he hecho ningún programa que sea sólo la ventana de preferencias. Realmente no se si funciona igual, aunque entiendo que debería

¿Has metido el config en el Manifest? Supongo que si, pero por preguntar

Yo crearía un nuevo XML con un par de preferencias. También crearía una ventana principal con un botón que abriera las preferencias.

Realmente no se, pero por hacer pruebas

Yo no tuve problemas. Siento no poder ayudarte más
divad dice:
La verdad es que lo tengo hecho así, cuando pulso un botón llamo a la clase config.java.

La clase sí está en el Manifest, lo que me parece extraño es que cuando quiero ver el config.xml en forma layout desde el Eclipse me aparece:
ClassNotFoundException: null

El Manifest es el siguiente:

package="com.davidromero.pfc" android:versionCode="1"
android:versionName="1.0">


















Si se le ocurre algo bien, sino pues muchas gracias igualmente.
javielinux dice:
No suena bien lo de clase no encontrada

Tienes que tener algún parámetro mal en el XML. Intenta cambiarlo que por ahí tienen que ir los tiros seguramente

Create uno nuevo

Suerte!!
divad dice:
No se que puede estar pasando, mi config.xml ahora es el siguiente:



xmlns:android="http://schemas.android.com/apk/res/android">


Y me sigue diciendo que no encuentra la clase.
divad dice:
Buenas noticias:

Por lo visto el fichero config.xml no puede estar dentro de la carpeta layout sino que me he creado otra llamada xml y dentro de ella sí que me aparece mi configuración.

Muchas gracias Javier.
javielinux dice:
Jejeje. Creía que quedaba claro en el artículo.

Bueno... ya está hecho. ;-)
divad dice:
Buenas, una pregunta:
¿Cómo puedo acceder a los elementos del vector de las preferencias?

config.xml

android:title="@string/title_listaRutas" android:summary="@string/summary_listaRutas"
android:entries="@array/entries_listaRutas" android:entryValues="@array/entryvalues_listaRutas"
android:dialogTitle="@string/dialog_title_listaRutas" />

Por ejemplo acceder a los valores del vector @array/entryvalues_listaRutas

Según el manual puedo obtener los valores de las preferencias, pero en el caso de un vector ¿sabes como es?

Muchas gracias, un saludo.
David dice:
Buenas, no consigo encontrar lo que comentas de checkbox y demas donde te explica como usar cada uno de ellos.
Me sale como si la web a la que apuntan los links que has puesto en el tutorial ya no existieran.
Me puedes decir donde los encuentro o actualizar los links.

Gracuias!
javielinux dice:
He actualizado los enlaces. Gracias por decírmelo
David dice:
Buenas, como hago para mostrar la "lista de preferencias?"

He copiado el ejemplo de google y lo tengo en un menu, me gustaria que cuando me presionen sobre el item del menu se mostrara el menu de opciones, como lo hago?

Gracias.

Escribir un comentario