¡Síguenos en Twitter y permanece atento a nuestros sorteos!

Pantallas de configuración – Capítulo 4 – Curso Android

| July 11, 2012 | 5 Comentarios

Publicidad

La práctica totalidad de las aplicaciones disponen de una o más actividades de configuración, y pese a que sería posible implementarlas como si se tratara de una actividad cualquiera, lo cierto es que es mucho más sencillo usar la API del sistema siempre que ésta exista, y en el caso de las actividades de configuración el tema está resuelto y muy bien resuelto.

Como veremos en esta parte del curso android, este sistema incorpora una API específica para tratar estas actividades de configuración que permite no sólo visualizar la propia ventana, que se muestra de idéntica manera para todas las aplicaciones, proporcionando al usuario una sensación de continuidad que mejora la experiencia de uso; sino que incorpora además funciones específicas para acceder fácilmente a los valores especificados por el usuario, así como otras que permiten ejecutar diferentes acciones cuando éste cambia alguna característica configurable.

curso android

Cómo crear una pantalla de configuración

Por comodidad, en este tutorial hablaremos de pantallas de configuración para referirnos a las actividades de configuración, y de características o preferencias de usuario para referirnos a cada uno de los valores que éste puede configurar.

Como hemos indicado antes, las pantallas de configuración son ventanas, si bien en este caso la superclase se denomina PreferenceActivity y añade ciertas funciones y procedimientos que permiten tratar correctamente las actividades de este tipo aunque, en general, podemos asumir que son simplemente ventanas.

Para crear una nueva pantalla de configuración deberemos seguir los pasos especificados en el tutorial anterior para la creación de una actividad genérica, pero teniendo en cuenta que, en este caso, la superclase se denomina android.preference.PreferenceActivity.

No debemos olvidar que es necesario publicar una referencia a la nueva actividad en el manifiesto de nuestra aplicación, ya que en caso que no lo hagamos nuestro programa fallará cuando intentemos acceder a la mencionada pantalla.

Como describir las opciones de configuración

Las diferentes opciones de configuración de nuestra aplicación se describen en un archivo XML que se sitúa en el directorio res/xml de ésta, siendo posible editarlo manualmente o mediante la interfaz de Eclipse.

curso android

La creación mediante Eclipse se realiza mediante un asistente (ver imagen más arriba para ver cómo acceder a éste) en el que seleccionaremos los siguientes valores:

  • Resource Type: Preference,
  • File: El nombre del archivo. Comúnmente preferences.xml,
  • Root Element: Seleccionar PreferenceScreen.

Una vez creado el archivo, éste se abrirá en el asistente, a través del cual podremos crear los diferentes elementos que lo formen.

En la pantalla de edición deberemos tener en cuenta que en la parte izquierda nos aparecerán los diferentes elementos, estructurados en forma de árbol, mientras que en la parte derecha nos aparecerán las características del elemento concreto seleccionado.

También podremos el botón add para añadir un nuevo elemento, y los botones remove, up y down para eliminar, mover hacia arriba o mover hacia abajo el elemento seleccionado, respectivamente.

Debe tenerse en cuenta que, tal como se muestra en el código de ejemplo, es conveniente inicializar las características de los diferentes elementos usando referencias en lugar de cadenas de texto concretas, ya que así facilitamos las modificaciones posteriores, así como la futura inclusión de traducciones.

curso android

Cómo detectar cuando la pantalla de configuración se cierra

Lo normal es que las actividades de configuración sean lanzadas desde otra actividad, bien por la pulsación de un botón en dicha actividad, bien por la selección de la opción correspondiente en el menú de la misma.

Cuando una actividad desea ser informada de que una actividad que dependa de ella ha finalizado debe iniciarla usando el procedimiento startActivityForResult, que ya os comentamos en la sesión anterior.

Cuando una actividad iniciada mediante este procedimiento acabe, el sistema se encargará de activar un evento (onActivityResult) en la actividad originadora que le permitirá saber que aquella ha acabado, así como recuperar los eventuales resultados de la ejecución.

curso android

Cómo detectar cuando una característica de configuración cambia

Los servicios, que abordaremos en los siguientes capítulos, se ejecutan sin la intervención del usuario, bien por la activación de un evento en el dispositivo, como por ejemplo la recepción de un mensaje de texto, bien porque implementan acciones que se ejecutan en segundo plano y que no requieren la intervención del usuario.

Es posible que un servicio, o cualquier otra parte de nuestra aplicación, necesite recibir una notificación (evento) cuando el usuario cambie alguna de las preferencias de ésta, para lo cual deberá ejecutar el método registerOnSharedPreferenceChangeListener en una instancia de la clase SharedPreferences.

El programador debe tener en cuenta que es obligatorio llamar al procedimiento unregisterOnSharedPreferenceChangeListener cuando la necesidad de recibir el evento acabe o, en último término, cuando el objeto que recibe el evento se destruya, ya que en caso contrario la aplicación fallará.

Cómo acceder a un valor de una característica concreta

Es posible acceder a las preferencias de usuario en cualquier momento durante la ejecución de nuestras aplicaciones, para lo cual deberemos crear una instancia de un objeto de tipo SharedPreferences, sobre la que usaremos los métodos getBoolean, getInt, getLong, getFloat o getString según corresponda.

curso android

Cómo modificar manualmente el valor de una característica concreta

Aunque no es usual, es posible que en una aplicación debáis modificar manualmente una preferencia de usuario, por ejemplo para reflejar la desactivación de una propiedad porque la aplicación no ha sido registrada.

El código que os mostramos a continuación permite realizar dicha modificación.


public void setPreference (Context context, String key, String value)
{
SharedPreferences.Editor preferences_editor =
PreferenceManager.getDefaultSharedPreferences(context).edit();
preferences_editor.putString(key, value);
preferences_editor.commit();
}

Qué es el contexto de una aplicación

En el código anterior hemos introducido una variable de nombre context, de la cual no habíamos hablado con anterioridad, y que es de tipo Context.

El tipo Context representa una interfase de información global acerca de la aplicación, y es usado siempre que se necesita acceder al sistema o a datos concretos de ésta.

Muy a bajo nivel, las ventanas son de tipo Context, por lo que heredan todas sus propiedades.

Así, cuando llamemos a la función anterior desde una actividad, podremos realizar la llamada de la forma

setPreference(this, key, value);

La próxima semana os hablaremos de los threads, que permiten ejecutar varias partes de código de forma concurrente (simultánea), y os explicaremos las restricciones que les afectan.

Mientras tanto, os recomendamos que os descarguéis la nueva versión de la aplicación de prueba que estamos desarrollando, en la que encontrareis profusamente documentados los conceptos introducidos en esta sesión.

Como siempre, os invitamos a visitar el Hilo oficial del Curso de Android de Foromóviles, donde podéis hacernos llegar vuestras dudas y comentarios.

Sobre el autor ()

Ingeniero en Informática por la Universidad Politécnica de Cataluña.Programador en perl, php, c++, Java,...Desarrollador reconocido del foro XDA-Developers.Usuario Android desde 2009, y actualmente también desarrollador de utilidades y ROMs para ese sistema.Mi primer smartphone fue un Qtek-S100, en 2005, y desde entonces ando buscando el dispositivo perfecto. Si no fuera por la crisis cambiaría de móvil varias veces al día :)
Publicidad

Comentarios (5)

  1. Antonio David Pérez Morales says:
    Buenas. Siguiendo la entrega de este tutorial me he dado cuenta que cuando se cambia el orden de ordenación (de carpetas primero a alfabéticamente o viceversa), hasta que no se hace click en alguna carpeta no se realiza la nueva ordenación. Esto es debido a que aunque la PreferencesActivity se arranque desde la principal con startActivityForResult, la PreferencesActivity nunca hace un finish para devolver el control a la actividad principal.
    En mi proyecto sobre este tutorial he añadido un botón a la actividad de preferencia (botón aceptar) para que cuando termine de editar las preferencias lo pulse y se haga el finish. En ese momento coge el control el método onActivityResult de la actividad principal que sí comprueba el valor de la propiedad folders_first y actúa en consecuencia.

    Un saludo

    • Robert P. says:
      Hola,

      Lo que comentas es muy extraño. En todas mis pruebas funciona correctamente.

      De hecho, al pulsar el botón “Atrás” se llama automáticamente el procedimiento “finish”, que provoca que la ventana se cierre, previa notificación a la ventana que la creó.

      No es normal tener un botón para validar las preferencias, que se validan automáticamente al cerrar la ventana de configuración.

      Lo normal es que en el procedimiento “onActivityResult” se compruebe que el “request_code” es el que has definido para la actividad y que el “result_code” sea “Activity.RESULT_OK”, y en caso afirmativo actuar en consecuencia.

      Además, lo habitual para las ventanas de configuración es que en el evento “onCreate” se llame al procedimiento “setResult(Activity.RESULT_OK)” para que, cuando la ventana se cierre, se envíe un código correcto a la ventana creadora.

      Puedes probar lo que te digo usando el debugger, y poniendo breakpoints en la función “MainActivity.onActivityResult”. El debugger se inicia clicando en el icono que es como un insecto en la barra de iconos.

      Cualquier cosa, seguimos por aquí o en el foro… :)

      Un saludo

      • Antonio David Pérez Morales says:
        Si tienes razón y tras leer el post y ver el código, mire la web de desarrolladores de Android y dicen que se haga como tú lo has hecho, que eso del botón no tiene sentido.

        A mí no me funcionó, pero bueno volveré a probar por si me he dejado algo.

        De todas formas por si a alguien más le pasa pues es otra alternativa, además de permitir usar un layout definido para una PreferenceScreen como si de una Activity se tratáse.

        Gracias por la explicación

        Un saludo

      • Antonio David Pérez Morales says:
        Buenas de nuevo.

        Viendo el código que hay en el repositorio, lo que falta es precisamente lo que has comentado, añadir el metodo setResult(Activity.RESULT_OK) en el onCreate de PreferencesActivity.

        Con eso ya me funciona perfectamente.

        Un saludo

        • Robert P. says:
          Efectivamente, no us el setResult al crear la pantalla de configuración, aunque no importa, porque en el evento onActivityResult tampoco lo compruebo, asumiendo siempre acaba bien.
          Un saludo y sigue haciendo pruebas :-)

Escribe un comentario

Cursos Android Gratis

Diccionario Android