Materia de Aplicaciones Móviles y Servicios Telemáticos
Es el más sencillo de todos los adaptadores, y provee de datos a un control de selección a partir de un array de objetos de cualquier tipo.
Se utiliza para mapear datos sobre los diferentes controles definidos en un fichero XML de layout.
Se utiliza para mapear las columnas de un cursor abierto sobre una base de datos sobre los diferentes elementos visuales contenidos en el control de selección.
final String[] datos = new String[]{“Elem1”,”Elem2”,”Elem3”,”Elem4”,”Elem5”};
ArrayAdapter
<?xml version="1.0" encoding="utf-8"?>
ArrayAdapter
Funcionan de forma similar al de cualquier control de este tipo, el usuario selecciona la lista, se muestra una especie de lista emergente al usuario con todas las opciones disponibles y al seleccionarse una de ellas ésta queda fijada en el control.
private Spinner cmbOpciones;
cmbOpciones = (Spinner)findViewById(R.id.CmbOpciones); adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); cmbOpciones.setAdapter(adaptador);
Funcionan de forma similar al de cualquier control de este tipo, el usuario selecciona la lista, se muestra una especie de lista emergente al usuario con todas las opciones disponibles y al seleccionarse una de ellas ésta queda fijada en el control.
private Spinner cmbOpciones;
cmbOpciones = (Spinner)findViewById(R.id.CmbOpciones); adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); cmbOpciones.setAdapter(adaptador);
imagenes
## EVENTO CONTROL SPINNER
cmbOpciones.setOnItemSelectedListener( new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, android.view.View v, int position, long id) { lblMensaje.setText(“Seleccionado: “ + datos[position]); }
public void onNothingSelected(AdapterView<?> parent) {
lblMensaje.setText("");
} });
final String[] datos = new String[]{“Elem1”,”Elem2”,”Elem3”,”Elem4”,”Elem5”};
ArrayAdapter
El control GridView de Android presenta al usuario un conjunto de opciones seleccionables distribuidas de forma tabular, o dicho de otra forma, divididas en filas y columnas. Dada la naturaleza del control ya podéis imaginar sus propiedades más importantes, que paso a enumerar a continuación:
imagen
private String[] datos = new String[25];
for(int i=1; i<=25; i++)
datos[i-1] = “Dato “ + i;
ArrayAdapter
grdOpciones.setOnItemClickListener( new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, android.view.View v, int position, long id) { lblMensaje.setText(“Opción seleccionada: “ + datos[position]); } });
Android admite por supuesto crear controles personalizados, y permite hacerlo de diferentes formas:
Vamos a extender el control EditText (cuadro de texto) para que muestre en todo momento el número de caracteres que contiene a medida que se escribe en él. Intentaríamos emular algo así como el editor de mensajes SMS del propio sistema operativo, que nos avisa del número de caracteres que contiene el mensaje.
imagen
Creación de controles compuestos, es decir, controles personalizados construidos a partir de varios controles estándar, combinando la funcionalidad de todos ellos en un sólo control reutilizable en otras aplicaciones.
imagen
Vamos a construir un control que nos permita seleccionar un color entre varios disponibles.
Los colores disponibles van a ser sólo cuatro, que se mostrarán en la franja superior del control. En la parte inferior se mostrará el color seleccionado en cada momento, o permanecerá negro si aún no se ha seleccionado ningún color.
imagen
Creamos un contenedor principal de nuestro conjunto de pestañas y deberá tener obligatoriamente como id el valor “@android:id/tabhost”.
Dentro de éste vamos a incluir un LinearLayout que nos servirá para distribuir verticalmente las secciones principales del layout: la sección de pestañas en la parte superior y la sección de contenido en la parte inferior
La sección de pestañas se representará mediante un elemento TabWidget, que deberá tener como id el valor “@android:id/tabs”.
Como contenedor para el contenido de las pestañas añadiremos un FrameLayout con el id obligatorio “@android:id/tabcontent”.
Por último, dentro del FrameLayout incluiremos el contenido de cada pestaña, normalmente cada uno dentro de su propio layout principal y con un id único que nos permita posteriormente hacer referencia a ellos fácilmente.
imagen
En Android podemos encontrar 3 tipos diferentes de menús:
Menús Principales. Los más habituales, aparecen en la zona inferior de la pantalla al pulsar el botón ‘menu’ del teléfono. Submenús. Son menús secundarios que se pueden mostrar al pulsar sobre una opción de un menú principal. Menús Contextuales. Útiles en muchas ocasiones, aparecen al realizar una pulsación larga sobre algún elemento de la pantalla.
imagen
Los pasos principales para la creación de un widget Android son los siguientes:
Fórmula para ajustar las dimensiones de nuestro widget
El widget se declarará como un elemento
+ MODE_PRIVATE. Sólo nuestra aplicación tiene acceso a estas preferencias.
+ MODE_WORLD_READABLE. Todas las aplicaciones pueden leer estas preferencias, pero sólo la nuestra puede modificarlas. + MODE_WORLD_WRITABLE. Todas las aplicaciones pueden leer y modificar estas preferencias.
Estos ficheros XML se almacenan en una ruta que sigue el siguiente patrón:
/data/data/paquete.java/shared_prefs/nombre_coleccion.xml
Así, por ejemplo, en nuestro caso encontraríamos nuestro fichero de preferencias en la ruta: /data/data/com.curso.android.preferences1/shared_prefs/MisPreferencias.xml
imagen
imagen
CheckBoxPreference. Marca seleccionable. EditTextPreference. Cadena simple de texto. ListPreference. Lista de valores seleccionables (exclusiva). MultiSelectListPreference. Lista de valores seleccionables (múltiple).
Representa un tipo de opción que sólo puede tomar dos valores distintos: activada o desactivada. Es el equivalente a un control de tipo checkbox. En este caso tan sólo tendremos que especificar los atributos: nombre interno de la opción (android:key), texto a mostrar (android:title) y descripción de la opción (android:summary).
Representa un tipo de opción que puede contener como valor una cadena de texto. Al pulsar sobre una opción de este tipo se mostrará un cuadro de diálogo sencillo que solicitará al usuario el texto a almacenar. Para este tipo, además de los tres atributos comunes a todas las opciones (key, title y summary) también tendremos que indicar el texto a mostrar en el cuadro de diálogo, mediante el atributo android:dialogTitle
Representa un tipo de opción que puede tomar como valor un elemento, y sólo uno, seleccionado por el usuario entre una lista de valores predefinida. Al pulsar sobre una opción de este tipo se mostrará la lista de valores posibles y el usuario podrá seleccionar uno de ellos. Y en este caso seguimos añadiendo atributos. Además de los cuatro ya comentados (key, title, summary y dialogTitle) tendremos que añadir dos más, uno de ellos indicando la lista de valores a visualizar en la lista y el otro indicando los valores internos que utilizaremos para cada uno de los valores de la lista anterior
<?xml version=”1.0” encoding=”utf-8” ?>
Los dos modelos más extendidos son SAX (Simple API for XML) y DOM (Document Object Model).
ctListPreference
Las opciones de este tipo son muy similares a las ListPreference, con la diferencia de que el usuario puede seleccionar varias de las opciones de la lista de posibles valores. Los atributos a asignar son por tanto los mismos que para el tipo anterior.
Los dos modelos más extendidos son SAX (Simple API for XML) y DOM (Document Object Model).
En el modelo SAX, el tratamiento de un XML se basa en un analizador (parser) que a medida que lee secuencialmente el documento XML va generando diferentes eventos con la información de cada elemento leido. Así por ejemplo, a medida que lee el XML, si encuentra el comienzo de una etiqueta
Los principales eventos que se pueden producir son los siguientes (consultar aquí la lista completa):
startDocument(): comienza el documento XML. endDocument(): termina el documento XML. startElement(): comienza una etiqueta XML. endElement(): termina una etiqueta XML. characters(): fragmento de texto.
Todos estos métodos están definidos en la clase org.xml.sax.helpers.DefaultHandler, de la cual deberemos derivar una clase propia donde se sobrescriban los eventos necesarios.
Un toast es un mensaje que se muestra en pantalla durante unos segundos al usuario para luego volver a desaparecer automáticamente sin requerir ningún tipo de actuación por su parte, y sin recibir el foco en ningún momento (o dicho de otra forma, sin interferir en las acciones que esté realizando el usuario en ese momento). Aunque son personalizables, aparecen por defecto en la parte inferior de la pantalla, sobre un rectángulo gris ligeramente translúcido.
imagen
Las notificaciones de la barra de estado de Android. Estas notificaciones son las que se muestran en nuestro dispositivo por ejemplo cuando recibimos un mensaje SMS, cuando tenemos actualizaciones disponibles, cuando tenemos el reproductor de música abierto en segundo plano, … Estas notificaciones constan de un icono y un texto mostrado en la barra de estado superior, y adicionalmente un mensaje algo más descriptivo y una marca de fecha/hora que podemos consultar desplegando la bandeja del sistema.
imagen
Los diálogos de Android los podremos utilizar con distintos fines, en general:
Mostrar un mensaje. Pedir una confirmación rápida. Solicitar al usuario una elección (simple o múltiple) entre varias alternativas.
Este tipo de diálogo se limita a mostrar un mensaje sencillo al usuario, y un único botón de OK para confirmar su lectura.
imagen
Un diálogo de confirmación es muy similar al anterior, con la diferencia de que lo utilizaremos para solicitar al usuario que nos confirme una determinada acción, por lo que las posibles respuestas serán del tipo Sí/No.
imagen
Cuando las opciones a seleccionar por el usuario no son sólo dos, como en los diálogos de confirmación, sino que el conjunto es mayor podemos utilizar los diálogos de selección para mostrar una lista de opciones entre las que el usuario pueda elegir.
imagen
imagen
Por defecto, todos los componentes de la misma aplicación se ejecutan en el mismo proceso y la mayoría de las aplicaciones no deberían cambiar esto. Sin embargo, si encuentra que necesita controlar a qué proceso pertenece un determinado componente, puede hacerlo en el archivo de manifiest.
La entrada de manifiest para cada tipo de elemento componente:
IMAGEN
Estos son los tres tipos de servicios:
Primer plano Segundo plano Enlace
Un servicio es un componente de una aplicación que puede realizar operaciones de larga ejecución en segundo plano y que no proporciona una interfaz de usuario.
Otro componente de la aplicación puede iniciar un servicio y continuará ejecutándose en segundo plano aunque el usuario cambie a otra aplicación.
Por ejemplo, un servicio puede manejar transacciones de red, reproducir música, realizar I/O de archivos o interactuar con un proveedor de contenido, todo en segundo plano.
Referencias Arquitectura de la plataforma Descripción general de Proyectos Activity Cómo interpretar el ciclo de vida de una actividad