Tabla de contenidos
1. Android Estudio Desarrollo Fundamentos Introduccin
2. La creacin de un equipo con Windows, Linux o Mac OS X Android Ambiente Development Studio
Requisitos Del Sistema
Instalacin del Java Development Kit (JDK)
Instalacin de Windows JDK
La instalacin de Mac OS X JDK
Instalacin de Linux JDK
La descarga del paquete Android Estudio
Instalar Android Estudio
Instalacin en Windows
Instalacin en Mac OS X
Instalacin en Linux
Instalacin de los ltimos paquetes SDK de Android
Hacer el SDK Herramientas de lnea de comandos Android Accesible
Windows 7
Windows 8.1
Linux
Mac OS X
Actualizacin del Estudio de Android y el SDK
3. Creacin de una aplicacin Android en Android Ejemplo Estudio
Creacin de un nuevo proyecto de Android
Definicin de la configuracin del proyecto y SDK
La comprensin de la configuracin del modo de apoyo
Configuracin del icono Launcher
Creacin de una Actividad
Modificacin del Ejemplo de Aplicacin
Revisin de los archivos de diseo y Recursos
Vista previa del diseo
4. Un recorrido por la interfaz de usuario de Android Estudio
La pantalla de bienvenida
La ventana principal
La herramienta de Windows
Atajos de teclado Android Studio
Switcher y archivos recientes Navegacin
Cambiar el tema Android Estudio
5. Creacin de un dispositivo virtual de Android (AVD) en Android Estudio
Acerca de los dispositivos virtuales Android
Creacin de un nuevo AVD
Inicio del emulador
Ejecutar la aplicacin en el AVD
Ejecutar / Depurar Configuraciones
Detener una aplicacin en ejecucin
De lnea de comandos AVD Creacin
Archivos de configuracin de dispositivo virtual de Android
Mover y cambiar el nombre de un dispositivo virtual de Android
2
6. Prueba Android Apps Estudio en un dispositivo Android Fsica
Una visin general del Android depuracin Bridge (ADB)
Habilitacin de ADB en Android 4.4 dispositivos basados
Mac OS X configuracin ADB
Configuracin de Windows ADB
Prueba de la conexin de adb
7. Los fundamentos de la Android Estudio Editor de cdigo
El Android Studio Editor
La divisin de la ventana del editor
Cdigo de finalizacin
Finalizacin de instrucciones
Informacin de parmetros
Generacin de cdigo
Plegable Cdigo
Bsqueda de Documentacin Rpida
Cdigo reformateo
8. Una visin general de la arquitectura de Android
El Android Software Stack
El kernel de Linux
Tiempo de ejecucin de Android - Dalvik Virtual Machine
Runtime Android - Bibliotecas Core
Dalvik VM Bibliotecas especficas
Java interoperabilidad Bibliotecas
Bibliotecas Android
C / C ++ Bibliotecas
Application Framework
Aplicaciones
9. La Anatoma de una aplicacin Android Android Estudio
Actividades Android
Intentos Android
Intentos de difusin
Receptores Broadcast
Servicios para Android
Proveedores de Contenido
La aplicacin Manifiesto
De recursos de aplicaciones
Contexto de aplicacin
10.Entender Aplicacin para Android y Actividad Lifecycles
Aplicaciones para Android y Gestin de Recursos
Estados Proceso Android
Proceso de primer plano
Proceso Visible
Proceso de Servicio
Proceso de fondo
Proceso de vaco
Dependencias entre procesos
El Ciclo de Vida de Actividad
La Actividad Pila
Actividad Unidos
7
33.Intentos implcitos Android - Un Estudio Android Ejemplo
Crear el Android Estudio implcita Intencin Proyecto Ejemplo
El diseo de la interfaz de usuario
Creacin de la Intencin Implcita
Adicin de un segundo Actividad Matching
Adicin de la Web de la interfaz de usuario
La obtencin de la URL Intencin
Modificacin del archivo MyWebView Proyecto Manifiesto
Prueba de la aplicacin
34.Intentos de difusin y receptores de radiodifusin en Android Estudio
Una visin general de Difusin Intenciones
Una visin general de los receptores de radiodifusin
La obtencin de resultados a partir de un Broadcast
Sticky Broadcast Intenciones
El Ejemplo Broadcast Intencin
Crear el ejemplo de aplicacin
Creacin y envo de la Intencin Broadcast
Crear el Receptor Broadcast
Configuracin de un receptor de radiodifusin en el archivo de manifiesto
Probando el Ejemplo Broadcast
Escuchando transmisiones del sistema
35.Hilos e hilo Android Manipuladores - Un Estudio Android Tutorial
Una visin general de los Hilos
El hilo principal de la aplicacin
Manejadores de rosca
Un Roscado Ejemplo bsico
Crear un nuevo hilo
La implementacin de un manejador de Tema
Al pasar un mensaje a los Handler
36.Entender Servicios Android comenzado y Bound
Servicios empezados
Servicio de Intencin
Servicio Bound
La anatoma de un Servicio
Controlar Opciones Servicio Reinicie Destroyed
Declarar un servicio en el archivo de manifiesto
Inicio de un servicio que se ejecuta en el inicio del sistema
37.La implementacin de un servicio de Android Iniciado en Android Estudio
Crear el proyecto Ejemplo
Creacin de la clase de servicio
Aadiendo el Servicio para el archivo de manifiesto
Inicio del servicio
Probando el Ejemplo IntentService
Utilizando la clase de servicio
Cmo crear un nuevo servicio
La modificacin de la interfaz de usuario
Ejecutar la aplicacin
Crear un nuevo hilo de Tareas de Servicios
8
38.Implementar Servicios Bound Locales en Android Estudio
Comprensin Bound Servicios
Bound Servicio Opciones de interaccin
Un servicio Ejemplo Bound Android Estudio Local
Adicin de un servicio Bound con el Proyecto
La aplicacin de la Carpeta
La unin del Cliente al Servicio
Completando el Ejemplo
Prueba de la aplicacin
39.Android Servicios Bound remoto - Un Estudio Android Tutorial
Cliente Comunicacin Servicio Remoto
Crear el ejemplo de aplicacin
El diseo de la interfaz de usuario
Implementacin del Servicio Bound remoto
Configuracin de un servicio remoto en el archivo de manifiesto
Lanzamiento y unin al servicio remoto
El envo de un mensaje al Servicio Remoto
40.Una visin general de las bases de datos SQLite Android en Android Estudio
La comprensin de las Tablas de base de datos
La introduccin de esquemas de bases de datos
Las columnas y tipos de datos
Filas de base de datos
La introduccin de claves principales
Qu es SQLite?
Structured Query Language (SQL)
Tratando SQLite en un dispositivo virtual de Android (AVD)
Clases Android SQLite Java
Cursor
SQLiteDatabase
SQLiteOpenHelper
ContentValues
41.Un Android Estudio TableLayout y TableRow Tutorial
Los TableLayout y TableRow Disposicin Vistas
Crear el proyecto de base de datos
Agregar el TableLayout a la interfaz de usuario
Agregar y configurar los filastabla
Adicin de la barra de botones a la Disposicin
Ajuste de los mrgenes de diseo
42.Un Tutorial de base de datos SQLite Android Estudio
Sobre la base de datos Ejemplo Android Estudio
Creacin del modelo de datos
Implementar el manejador de datos
El mtodo Add Handler
El mtodo de control de la consulta
El mtodo Delete Handler
La implementacin de los mtodos activos de eventos
Prueba de la aplicacin
43.La comprensin de Proveedores de Contenido Android en Android Estudio
Qu es un Proveedor de Contenido?
El proveedor de contenidos
onCreate ()
consulta ()
insert ()
update ()
delete ()
getType ()
El URI contenido
El contenido del resolver
El <proveedor> Elemento Manifiesto
10
48.Grabacin de vdeo y captura de imagen usando Intenciones Cmara - Un Estudio Android Ejemplo
Comprobacin de la ayuda de la cmara
Llamar a la Intencin de captura de vdeo
Llamar a la Intencin de captura de imagen
Creacin de un proyecto Android Estudio de grabacin de vdeo
El diseo de la interfaz de usuario de diseo
Comprobacin de la cmara
Lanzamiento de la Intencin de captura de vdeo
Manejo del Retorno Intencin
Prueba de la aplicacin
49.Una grabacin y reproduccin Ejemplo Android Studio usando MediaPlayer y MediaRecorder
Reproduccin de audio
Grabacin de audio y vdeo utilizando la clase MediaRecorder
Sobre el Proyecto Ejemplo
Crear el proyecto AudioApp
El diseo de la interfaz de usuario
Comprobacin de disponibilidad Micrfono
Realizacin de la Actividad de inicializacin
La implementacin de la (Mtodo recordAudio)
La aplicacin de la stopAudio Mtodo ()
Implementar el mtodo playaudio ()
Configuracin de permisos en el archivo de manifiesto
Prueba de la aplicacin
50.Trabajar con la API de Google Maps para Android en Android Estudio
Los elementos de la API de Google Maps para Android
Preprese para utilizar la API de Google Maps para Android
Instalacin de las API de Google
Descargando el Google Play Servicios SDK
Adicin de la Google Play Servicios Biblioteca al Gradle Construir configuracin
Obtencin Su firma desarrollador
Registro del Proyecto en la consola de las API de Google
Adicin Mapa Apoyo al archivo AndroidManifest.xml
Comprobacin de Google Play Servicios de Apoyo
La comprensin de geocodificacin y geocodificacin inversa
Agregar un mapa a una aplicacin
Viendo del usuario Ubicacin actual
Cambiar el tipo de mapa
Viendo Mapa Controles al Usuario
Manipulacin Mapa Gesto Interaccin
Mapa Zooming Gestos
Mapa Desplazamiento / Toma panormica Gestos
Mapa Inclinacin Gestos
Mapa de rotacin Gestos
Creacin de marcadores de mapa
Controlar el Mapa de la cmara
11
51.Impresin con el Marco Impresin Android en Android Estudio
La impresin Arquitectura Android
El Servicios de impresin HP Plugin
Google Cloud Print
Impresin a Google Drive
Guardar como PDF
Impresin desde dispositivos Android
Opciones para Construir Imprimir Apoyo en Aplicaciones Android
Impresin de imgenes
Creacin y contenido HTML Impresin
Impresin de una pgina Web
Impresin de un documento personalizado
52.Un HTML Android Studio y contenido Web Printing Ejemplo
Creacin del HTML Impresin Ejemplo de Aplicacin
Impresin contenido HTML dinmico
Creacin de la pgina Web Impresin Ejemplo
El diseo de la interfaz de usuario de diseo
Adicin de la opcin Imprimir del men
53.Un documento Impresin Ejemplo Android Estudio personalizado
Una visin general de la Imprenta Android documento personalizado
Adaptadores encargo de impresin
Preparacin del Proyecto de encargo Impresin de documentos
Crear el adaptador de impresin personalizada
La aplicacin de la OnLayout () Mtodo de devolucin de llamada
La aplicacin de la OnWrite () Mtodo de devolucin de llamada
Comprobacin de una pgina est en rango
Dibujando el contenido de la pgina Lienzo
A partir del trabajo de impresin
Prueba de la aplicacin
54.Generacin de un archivo de lanzamiento APK Firmado en Android Estudio
El proceso de preparacin de lanzamiento
Cambio de la Variante Build
Creacin de un archivo de almacn de claves
Generacin de una clave privada
Creacin de la aplicacin APK Archivo
Regstrese para obtener una cuenta de Google Play Consola desarrollador
Cargar Versiones Nueva APK a la Consola de Google Play desarrollador
55.Un estudio Android Google Play In-App Tutorial facturacin
Instalacin de la Biblioteca Google Play facturacin
Crear el proyecto de facturacin Ejemplo En aplicacin
Adicin de Permiso de facturacin para el archivo de manifiesto
Agregar el archivo IInAppBillingService.aidl al Proyecto
Aadiendo las clases de utilidad para el Proyecto
El diseo de la interfaz de usuario
La aplicacin de la "Click Me" Botn
Google Consola Juega Developer y Cuentas de Google Wallet
La obtencin de la clave de licencia pblica para la Aplicacin
Configuracin de Google Play de facturacin en la Solicitud
Inicio de una Factura de Compra Google Play In-App
12
13
1. Android
Estudio
Introduccin
Desarrollo
Fundamentos
El objetivo de este libro es ensear las habilidades necesarias para desarrollar aplicaciones basadas en
Android utilizando el Android Estudio Entorno Integrado de Desarrollo (IDE) y el 5.0 Kit de desarrollo de
software de Android (SDK).
Empezando por lo bsico, este libro ofrece un resumen de los pasos necesarios para configurar un entorno
de desarrollo y pruebas Android. Una visin general de Android Studio est incluido cubriendo reas como
ventanas de herramientas, el editor de cdigo y la herramienta Diseador. Una introduccin a la arquitectura
de Android es seguido por una mirada en profundidad en el diseo de aplicaciones de Android e interfaces de
usuario utilizando el entorno de Android Studio. Temas ms avanzados, como la gestin de bases de datos,
proveedores de contenidos y las intenciones tambin estn cubiertos, al igual que el manejo de la pantalla
tctil, reconocimiento de gestos, el acceso de la cmara y la reproduccin y grabacin de vdeo y audio. Esta
edicin del libro tambin abarca impresin, transiciones y almacenamiento de archivos basado en la nube.
Adems de cubrir las tcnicas generales de desarrollo de Android, el libro tambin incluye Google Play temas
especficos tales como mapas de aplicacin utilizando la API de Google Maps para Android, facturacin en
app y presentacin de aplicaciones para el desarrollador Google Play Consola.
Los captulos cubren tambin caractersticas avanzadas de Android Estudio como Gradle construir
configuracin y la puesta en prctica de construccin variantes para atacar mltiples tipos de dispositivos
Android desde una nica base de cdigo del proyecto. Asumiendo que ya tiene cierta experiencia en
programacin Java, est listo para descargar Android Studio y el SDK de Android, tienen acceso a un sistema
y las ideas de Windows, Mac o Linux para algunas aplicaciones a desarrollar, ya est listo para empezar.
Fe de erratas
Aunque hacemos todo lo posible para garantizar la exactitud del contenido de este libro, es inevitable que un
libro que cubre un rea temtica de este tamao y complejidad puede incluir algunos errores y
descuidos. Cualquier problemas conocidos con el libro se describen, junto con las soluciones, en la siguiente
URL:
http://www.ebookfrenzy.com/errata/androidstudio.html
14
8.1 de Windows 7
8.3 Linux
8.4 Mac OS X
10 Resumen
15
Suponiendo que Java est instalado actualmente, una salida similar a la siguiente aparecer en la ventana de
terminal:
16
En el caso de que Java no est instalado, emitiendo el comando "java" en la ventana de terminal dar luga r a
la aparicin de un mensaje que dice lo siguiente junto con un cuadro de dilogo en el escritorio un botn Ms
informacin, que, cuando se hace clic se mostrar el Oracle La pgina web de Java:
Sin tiempo de ejecucin de Java actual, solicitando la instalacin
Abra la imagen de disco descargado (archivo .dmg) y haga doble clic en el icono para instalar el paquete de
Java (Figura 2-1):
Figura 2-1
El Java para OS X instalador ventana aparecer y te llevar a travs de los pasos necesarios para la
instalacin del JDK. Una vez finalizada la instalacin, vuelva a la ventana de terminal y ejecute el comando
siguiente, momento en el que debera aparecer la informacin de versin de Java anteriormente descrito:
java -version
Al igual que con la instalacin de JDK basado en Windows, es posible instalar el JDK en Linux descargando
el paquete adecuado desde el sitio web de Oracle, la URL para el que es el
17
siguiente:http://www.oracle.com/technetwork/java/javase /downloads/index.html paquetes son proporcionados
por Oracle en formato RPM (para la instalacin en sistemas basados en Red Hat Linux como Red Hat
Enterprise Linux, Fedora y CentOS) y como un archivo tar para otras distribuciones de Linux como Ubuntu.
En los sistemas Linux basados en Red Hat, descargue el archivo .rpm JDK desde el sitio web de Oracle y
realizar la instalacin utilizando el comando rpm en una ventana de terminal. Suponiendo, por ejemplo, que el
archivo descargado JDK fue nombrado jdk-7u45-linux-x64.rpm, los comandos para llevar a cabo la instalacin
sera el siguiente:
Do
rpm -ihv jdk-7u45-linux-x64.rpm
Para instalar utilizando el paquete tar comprimido (tar.gz) realice los siguientes pasos:
1. Cree el directorio en el que el JDK se va a instalar (para los fines de este ejemplo supondremos / home /
demo / java). 2. Descargue el paquete tar.gz apropiada desde el sitio web de Oracle en el directorio. 3.
Ejecute el comando siguiente (donde <jdk-file> se sustituye por el nombre del archivo descargado JDK):
tar xvfz <jdk-file> .tar.gz
4. Extraiga el archivo tar.gz descargado. 5. Agregue la ruta al directorio bin de la instalacin de JDK a la
variable $ PATH. Por ejemplo, suponiendo que el JDK instalado finalmente en /home/demo/java/jdk1.7.0_45
necesitara la siguiente que se aade a la variable de entorno $ RUTA:
/home/demo/java/jdk1.7.0_45/bin
Normalmente, esto se puede lograr mediante la adicin de un comando al archivo .bashrc en su directorio
principal (detalles pueden diferir en funcin de la distribucin de Linux en particular en uso).Por ejemplo, el
cambio de directorio a su directorio, edite el archivo .bashrc contenida en el mismo y aadir la siguiente lnea
al final del archivo (modificando el camino para que coincida con la ubicacin del JDK en su sistema):
export PATH = / home / demo / java / jdk1.7.0_45 / bin: $ PATH
Despus de haber guardado el cambio, las futuras sesiones de terminal incluirn el JDK en la variable de
entorno $ PATH.
18
Instalacin en Windows
Busque el archivo descargado Android Estudio ejecutable de instalacin (llamado androide-studio-Bundle<versin> .exe) en una ventana del Explorador de Windows y haga doble clic en l para iniciar el proceso de
instalacin, haga clic en el botn S en el cuadro de dilogo Control de cuentas de usuario si aparece.
Una vez que aparezca el asistente de configuracin de Android de estudio, trabajo a travs de las diferentes
pantallas para configurar la instalacin para satisfacer sus necesidades en cuanto a la ubicacin del sistema
de archivos en el que Android estudio debe ser instalado y si es o no debera ponerse a disposicin de otros
usuarios del sistema . Aunque no hay reglas estrictas sobre dnde se debe instalar Android Studio en el
sistema, el resto de este libro asume que la instalacin se realiz en una subcarpeta del directorio principal
llamado android-estudio del usuario. Una vez que las opciones se han configurado, haga clic en el botn
Instalar para comenzar el proceso de instalacin.
En las versiones de Windows con un men de inicio, el recin instalado Android Studio puede ser lanzado
desde la entrada aadido a ese men durante la instalacin. En Windows 8, el ejecutable se puede fijar a la
barra de tareas para facilitar el acceso, vaya hasta el directorio \ bin android-estudio, haciendo clic derecho
sobre el ejecutable y seleccionando la opcin de men Pin de la barra de tareas. Tenga en cuenta que el
ejecutable est disponible en 32 bits (estudio) y 64 bits (studio64) versiones ejecutables. Si est ejecutando
un sistema de 32 bits, asegrese de usar el ejecutable estudio.
Instalacin en Mac OS X
Android Studio for Mac OS X se descarga en forma de un archivo de imagen de disco (.dmg). Una vez
<versin> archivo .dmg se ha descargado el androide-studio-Lo ideal, ubicarlo en una ventana del Finder y
haga doble clic en l para abrirlo como se muestra en la Figura 2-2:
19
Figura 2-2
Para instalar el paquete, basta con arrastrar el icono de Android Studio y colquelo en la carpeta
Aplicaciones. El paquete de Android estudio se instalar en la carpeta Aplicaciones del sistema, un proceso
que normalmente se tome unos minutos para completar.
Para lanzar Android Estudio, busque el archivo ejecutable en la carpeta Aplicaciones utilizando una ventana
del Finder y haga doble clic en l. Al intentar lanzar Android de estudio, un dilogo de error puede aparecer lo
que indica que la JVM no se puede encontrar. Si se produce este error, ser necesario descargar e instalar el
paquete Mac OS X Java JRE 6 en el sistema. Esto se puede descargar desde Apple mediante el siguiente
enlace:
http://support.apple.com/kb/DL1572
Una vez que el paquete de Java para OS X se ha instalado, Android Estudio debera iniciar sin ningn
problema.
Para el futuro ms fcil acceso a la herramienta, arrastre el icono de Android Studio desde la ventana del
Finder y colquelo en el muelle.
Instalacin en Linux
Despus de haber descargado el paquete de Linux Android Studio, abra una ventana de terminal, cambie el
directorio a la ubicacin en Android estudio se va a instalar y ejecutar el siguiente comando:
20
Figura 2-3
Haga clic en el botn Siguiente, seleccione la opcin de instalacin estndar y haga clic en Siguiente una vez
21
ms. En la pantalla del acuerdo de licencia, seleccione y aceptar cada una de las licencias de la lista antes de
hacer clic en Finalizar para completar el proceso de configuracin. La pantalla de bienvenida a Android
Estudio continuacin, debera aparecer:
Figura 2-4
22
Figura 2-5
Dentro del Administrador de Android SDK, asegrese de que las casillas de verificacin junto a los siguientes
paquetes aparecen como Instalada en la columna Estado:
23
Extras -> USB Driver Google (Requerido en los sistemas Windows solamente)
En caso de que cualquiera de los paquetes anteriores se muestran como No instalado, slo tiene que
seleccionar las casillas de verificacin junto a los paquetes y haga clic en el botn Instalar paquetes para
iniciar el proceso de instalacin. En el cuadro de dilogo resultante, acepte los acuerdos de licencia antes de
hacer clic en el botn Instalar. El Gerente SDK entonces comenzar a descargar e instalar los paquetes
designados. A medida que avanza la instalacin, aparecer una barra de progreso en la parte inferior de la
ventana del administrador que indica el estado de la instalacin.
Una vez completada la instalacin, revise la lista de paquetes y asegrese de que los paquetes seleccionados
aparecen ahora como Instalada en la columna Estado. Si alguno se enumeran como No instalado, asegrese
de que estn seleccionados y haga clic en Instalar los paquetes ... botn de nuevo.
La ubicacin del SDK en su sistema puede ser identificado con el lanzamiento del SDK Manager y en
referencia a la ruta del SDK: campo ubicado en la parte superior de la ventana del administrador como se
destaca en la Figura 2-6:
24
Figura 2-6
Una vez que se ha identificado la ubicacin del SDK, los pasos para agregar esto a la variable PATH son
sistema operativo dependiente:
Windows 7
1. Haga clic derecho en el equipo en el men Inicio del escritorio y seleccione Propiedades en el men
resultante. 2. En el panel de propiedades, seleccione el enlace Configuracin avanzada del sistema y, en el
cuadro de dilogo resultante, haga clic en las variables de entorno ... botn. 3. En el cuadro de dilogo
Variables de entorno, localice la variable Path en la lista de variables del sistema, seleccinelo y haga clic en
Editar .... Busque el final de la cadena de valor variable actual y aadir la ruta de acceso a las herramientas
de la plataforma de Android hasta el final, con un punto y coma para separar el camino de los valores
anteriores. Por ejemplo, suponiendo Android Studio fue instalado en C: \ Users \ demo \ AppData \ Local \
Android \ sdk, se adjunta al final del valor Path actual lo siguiente:
;C:\Users\demo\AppData\Local\Android\sdk\platformtools;C:\Users\demo\AppData\Local\Android\sdk\tools
4. Haga clic en Aceptar en cada cuadro de dilogo y cierre el panel de propiedades del sistema de
control. Una vez que los pasos anteriores se han completado, compruebe que la ruta est ajustada
correctamente abriendo una ventana de smbolo del sistema (Inicio -> Todos los programas -> Accesorios ->
Smbolo del sistema) y en el indicador de entrar:
echo% PATH%
El valor de la variable ruta devuelta debe incluir las rutas de acceso a las herramientas de la plataforma SDK
Android carpetas. Compruebe que el valor de la plataforma-tools es correcta al intentar ejecutar la
herramienta adb de la siguiente manera:
adb
La herramienta debe emitir una lista de opciones de la lnea de comandos cuando se ejecuta.
Del mismo modo, comprobar que la ruta herramientas ajuste al intentar iniciar el Administrador de Android
SDK:
25
androide
En el caso de que aparezca un mensaje similar al siguiente mensaje para uno o ambos de los comandos, es
ms probable que una ruta incorrecta se aade a la variable de entorno Path:
"Adb" no se reconoce como un comando interno o externo,
programa o archivo por lotes.
Windows 8.1
1. En la pantalla de inicio, mueva el ratn a la esquina inferior derecha de la pantalla y seleccione Buscar en
el men resultante. En el cuadro de bsqueda, escriba Panel de control. Cuando el icono Panel de control
aparece en el rea de resultados, haga clic en l para iniciar la herramienta en el escritorio. 2. En el panel de
control, utilice el men Categora para cambiar la visualizacin de iconos grandes. En la lista de iconos de
seleccionar la etiqueta del sistema. 3. Siga los pasos descritos para Windows 7 a partir del paso 2 al paso 4.
Abra la ventana del smbolo del sistema (mover el ratn a la esquina inferior derecha de la pantalla,
seleccione la opcin Buscar y escriba cmd en el cuadro de bsqueda). Seleccione Smbolo del sistema a
partir de los resultados de bsqueda. Dentro de la ventana del smbolo del sistema, escriba:
echo% PATH%
El valor de la variable ruta devuelta debe incluir las rutas de acceso a las herramientas de la plataforma SDK
Android carpetas. Compruebe que el valor de la plataforma-tools es correcta al intentar ejecutar la
herramienta adb de la siguiente manera:
adb
La herramienta debe emitir una lista de opciones de la lnea de comandos cuando se ejecuta.
Del mismo modo, comprobar el ajuste de herramientas camino al tratar de lanzar el Manager SDK Android:
Android
En el caso de que aparezca un mensaje similar al siguiente mensaje para uno o ambos de los comandos, es
ms probable que una ruta incorrecta se aade a la variable de entorno Path:
"Adb" no se reconoce como un comando interno o externo,
programa o archivo por lotes.
Linux
En Linux esto implicar una vez ms la edicin del archivo .bashrc. Suponiendo que el paquete de paquete
Android Studio fue instalado en / home / demo / Android / sdk, la lnea de exportacin en el archivo .bashrc
ahora dira lo siguiente:
exportacin
PATH=/home/demo/java/jdk1.7.0_10/bin:/home/demo/Android/sdk/platformtools:/home/demo/Android/sdk/tools:/home/demo/android-studio/bin:$PATH
26
Tenga en cuenta tambin que el comando anterior se suma el directorio android-studio / bin a la variable
PATH. Esto permitir a la secuencia de comandos studio.sh para ser ejecutado independientemente del
directorio actual dentro de una ventana de terminal.
Mac OS X
Un nmero de tcnicas se puede emplear para modificar la variable de entorno $ PATH en Mac OS X. Podra
decirse que el mtodo ms limpio es aadir un nuevo archivo en el directorio que contiene /etc/paths.d los
caminos que se aade a $ PATH. Suponiendo una ubicacin de instalacin de / Users / demo / Library /
Android / sdk, el camino se puede configurar mediante la creacin de un nuevo archivo llamado android-sdk
en el directorio /etc/paths.d contenga las siguientes lneas:
/ Users / demo / Library / Android / sdk / herramientas
/ Users / demo / Library / Android / sdk / plataforma de herramientas
Tenga en cuenta que, dado que se trata de un directorio del sistema ser necesario utilizar el comando sudo
al crear el archivo. Por ejemplo:
sudo vi /etc/paths.d/android-sdk
Resumen
Antes de comenzar el desarrollo de aplicaciones basadas en Android, el primer paso es la creacin de un
entorno de desarrollo adecuado. Esta consiste en el Java Development Kit (JDK), SDK de Android y Android
Studio IDE. En este captulo, hemos cubierto los pasos necesarios para instalar estos paquetes en Windows,
Mac OS X y Linux.
27
7 Resumen
28
Figura 3-1
Una vez que aparece esta ventana, Android estudio est listo para un nuevo proyecto que se crear. Para
crear el nuevo proyecto, simplemente haga clic en el inicio de una nueva opcin de proyecto Android Estudio
para mostrar la primera pantalla del asistente Nuevo proyecto tal como se muestra en la Figura 3-2:
29
Figura 3-2
Si usted no tiene un nombre de dominio, tambin puede utilizar ebookfrenzy.com a los efectos de la prueba,
aunque esto tendr que ser cambiado antes de una aplicacin puede ser publicado:
30
com.ebookfrenzy.androidsample
El ajuste de la ubicacin del proyecto ser por defecto a una ubicacin en la carpeta denominada
AndroidStudioProjects situados en su directorio personal y puede ser cambiado haciendo clic en el botn
situado a la derecha del campo de texto que contiene la configuracin de la ruta actual.
Haga clic en Siguiente para continuar. En la pantalla de factores de forma, active la opcin Telfono y Tablet y
establecer la configuracin de la API de 8 SDK mnimo: Android 2.2 (Froyo). La razn para la seleccin de un
comunicado de SDK mayor es que esto asegura que la aplicacin final ser capaz de correr en la ms amplia
gama de dispositivos Android. Cuanto mayor sea la seleccin mnima SDK, ms la aplicacin se limita a los
dispositivos Android ms nuevos. Un grfico til (Figura 3 3) se puede ver haciendo clic en el enlace Ayuda
para elegir. Este describe las distintas versiones del SDK y los niveles de API disponibles para su uso y el
porcentaje de los dispositivos Android en el mercado en el que se ejecutar la aplicacin en caso de que SDK
se utiliza como el nivel mnimo. En general slo debera ser necesario seleccionar un SDK ms reciente
cuando esa versin contiene una caracterstica especfica que se requiere para su aplicacin. Para ayudar en
el proceso de decisin, la seleccin de un nivel de API en el grfico mostrar las caractersticas que se
admiten en ese nivel.
Figura 3-3
31
Dado que el proyecto no est diseado para Google TV, Google Glass o dispositivos porttiles, deje el resto
de opciones desactivadas antes de hacer clic en Siguiente.
Figura 3-4
Con la opcin de Actividad en blanco seleccionado, haga clic en Siguiente. En la ltima pantalla (Figura 3-5)
nombrar la actividad y el ttulo AndroidSampleActivity. La actividad consistir en un diseo de la pantalla de
interfaz de usuario nica, que, a los efectos de este ejemplo, debe ser nombrado activity_android_sample
como se muestra en la Figura 3-5 y con un recurso de men con nombre menu_android_sample:
32
Figura 3-5
Por ltimo, haga clic en Finalizar para iniciar el proceso de creacin del proyecto.
33
Figura 3-6
El proyecto de ejemplo creado para nosotros cuando seleccionamos la opcin de crear una actividad consiste
en una interfaz de usuario que contiene una etiqueta que diga "Hola Mundo" cuando se ejecuta la aplicacin.
El siguiente paso en este tutorial es para modificar la interfaz de usuario de nuestra aplicacin para que
muestre una vista de texto objeto ms grande con un mensaje diferente al previsto para nosotros por Android
Studio.
El diseo de la interfaz de usuario para nuestra actividad se almacena en un archivo llamado
activity_android_sample.xml que, a su vez, se encuentra debajo de aplicacin -> res -> diseo de la jerarqua
archivo de proyecto. Uso del panel Proyecto, localizar este archivo como se ilustra en la Figura 3-7:
Figura 3-7
Una vez localizado, haga doble clic en el archivo para cargarlo en la herramienta Diseador de interfaz de
usuario que aparecer en el panel central de la ventana principal de Android Productora:
34
Figura 3-8
En la barra de herramientas en la parte superior del panel de editor de diseo es un men que se configura
actualmente para Nexus 4 que se refleja en la representacin visual del dispositivo en el panel de
Designer. Una amplia gama de otras opciones del dispositivo estn disponibles para la seleccin haciendo
clic en este men.
Para cambiar la orientacin de la representacin dispositivo entre el paisaje y el retrato simplemente utilice el
men desplegable inmediatamente a la derecha del men de seleccin de dispositivo muestra el
icono.
Como puede verse en la pantalla del dispositivo, el diseo ya incluye una etiqueta que muestra un Hello
World! mensaje. Corriendo por el lado izquierdo del panel es una paleta que contiene diferentes categoras de
componentes de interfaz de usuario que pueden utilizarse para construir una interfaz de usuario, tales como
botones, etiquetas y campos de texto. Cabe sealar, sin embargo, que no todos los componentes de interfaz
de usuario son obviamente visibles para el usuario. Una de estas categoras se compone de diseos. Android
35
es compatible con una variedad de diseos diferentes que proporcionan diferentes niveles de control sobre la
forma visual de usuario componentes de interfaz se posicionan y gestionado en la pantalla. Aunque es difcil
decir de mirar a la representacin visual de la interfaz de usuario, el diseo actual se ha creado utilizando un
RelativeLayout. Esto se puede confirmar mediante la revisin de la informacin en el panel rbol de
componentes que, por defecto, se encuentra en la esquina superior derecha del panel Designer y se muestra
en la Figura 3-9:
Figura 3-9
Como podemos ver en la jerarqua de rbol de componentes, la interfaz de usuario se compone de un padre
RelativeLayout con un solo nio en la forma de un objeto TextView.
El primer paso en la modificacin de la aplicacin es para eliminar el componente TextView desde el
diseo. Comience haciendo clic sobre el objeto TextView dentro de la vista de la interfaz de usuario para que
aparezca con un borde azul alrededor. Una vez seleccionado, pulse la tecla Supr en el teclado para eliminar
el objeto de la disposicin.
En el panel Paleta, busque la categora Widgets. Haga clic y arrastre el objeto de texto grande y colquelo en
el centro del diseo de la interfaz de usuario cuando las lneas de marcadores verdes parecen indicar el
centro de la pantalla:
36
Figura 3-10
La herramienta Android Studio Designer tambin proporciona una alternativa a arrastrar y soltar los
componentes de la paleta a la disposicin de diseo. Los componentes tambin pueden aadirse al
seleccionar el objeto deseado de la paleta y luego simplemente hacer clic en el diseo en el lugar en el que el
componente se va a colocar.
El siguiente paso es cambiar el texto que se muestra actualmente por el componente TextView. Haga doble
clic en el objeto en la disposicin de diseo para mostrar el panel de edicin de texto y la identificacin como
se ilustra en la Figura 3-11. Dentro del panel, cambie la propiedad de texto de "Texto grande" a "Bienvenido a
Android Studio".
37
Figura 3-11
En este punto es importante para explicar la bombilla al lado del objeto TextView en el diseo. Esto indica un
posible problema y ofrece algunas soluciones recomendadas. Al hacer clic en el icono en este caso nos
informa de que el problema es el siguiente:
[I18N] cadena codificada "Bienvenido a Android Studio", debe utilizar los recursosstring
Este mensaje I18N nos est informando que existe un problema potencial con respecto a la futura
internacionalizacin del proyecto ("I18N" viene del hecho de que la palabra "internacionalizacin" comienza
con un "yo", termina con una "N" y tiene 18 cartas en el medio). La advertencia nos recuerda que en el
desarrollo de aplicaciones para Android, atributos y valores como cadenas de texto deben ser almacenados
en forma de recursos siempre que sea posible. Si lo hace, permite cambios en la apariencia de la aplicacin
que se harn mediante la modificacin de los archivos de recursos en lugar de cambiar el cdigo fuente de la
aplicacin. Esto puede ser especialmente valioso cuando la traduccin de una interfaz de usuario para una
lengua hablada diferente. Si todo el texto en una interfaz de usuario est contenida en un archivo de recursos
individuales, por ejemplo, ese archivo se puede dar a un traductor que luego realizar el trabajo de traduccin y
devolver el archivo traducido para su inclusin en la aplicacin. Esto permite a varios idiomas para ser
dirigidos y sin la necesidad de ningn cambio de cdigo fuente que se hagan. En este ejemplo, vamos a crear
un nuevo recurso llamado welcomestring y asignarle la cadena "Bienvenido a Android Studio".
Haga clic en la flecha a la derecha del mensaje de advertencia para mostrar el men de posibles soluciones
(Figura 3-12).
38
Figura 3-12
En el men, seleccione la opcin de recurso de cadena Extracto para mostrar el dilogo de Recursos
Extraer. En este cuadro de dilogo, introduzca welcomestring en el Nombre de recurso: campo antes de
hacer clic en Aceptar. La cadena se almacena ahora como un recurso en la aplicacin -> res -> Valores ->
archivo strings.xml.
39
Figura 3-13
Como puede verse a partir de la estructura del archivo XML, la interfaz de usuario consiste en el componente
RelativeLayout, que a su vez, es el padre del objeto TextView. Tambin podemos ver que la propiedad text de
la TextView se establece en nuestro recurso welcomestring. Aunque varan en complejidad y contenido, todos
los diseos de interfaz de usuario se estructuran de esta manera jerrquica, basado en XML.
Una de las caractersticas ms potentes de Android estudio se puede encontrar a la derecha del panel de
edicin de XML. Este es el panel de vista previa y muestra el estado visual actual de la disposicin. A medida
que se realizan cambios en el diseo de XML, estos se vern reflejados en el panel de vista previa. Para ver
esto en accin, modificar el diseo XML para cambiar el color de fondo de la RelativeLayout a un tono de rojo
como sigue:
40
<TextView
android:
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
textAppearance = "android:? attr / textAppearanceLarge"
text = "@ string / welcomestring"
id = "@ + / Identificacin del TextView"
layout_centerVertical = "true"
layout_centerHorizontal = "true" />
</ RelativeLayout>
Tenga en cuenta que el color de los cambios de vista previa en tiempo real, para que coincida con la nueva
configuracin en el archivo XML. Tenga en cuenta tambin que un pequeo cuadrado rojo aparece en el
margen izquierdo (tambin conocida como la cuneta) del editor de XML al lado de la lnea que contiene la
configuracin de color. Esta es una seal visual al hecho de que el color rojo se ha fijado en una
propiedad. Cambie el valor de color a # a0ff28 y tenga en cuenta que tanto la pequea plaza en el margen y
el cambio de vista previa para verde.
Por ltimo, utilice la vista de proyecto para localizar la aplicacin -> res -> Valores -> archivo strings.xml y
haga doble clic en l para cargarlo en el editor. Actualmente el XML debe decir lo siguiente:
<? Xml version = "1.0" encoding = "UTF-8"?>
<recursos>
<String
<String
<String
<String
name
name
name
name
=
=
=
=
</ Recursos>
Como una demostracin de los recursos en la accin, cambia el valor de la cadena actualmente asignado al
recurso welcomestring y luego volver al Diseador seleccionando la pestaa del archivo de diseo en el panel
del editor. Tenga en cuenta que el diseo se ha recuperado el valor nuevo recurso para la cadena de
bienvenida.
Tambin hay una forma rpida de acceder al valor de un recurso que se hace referencia en un archivo
XML. Con la herramienta de diseo en modo de texto, haga clic en el "@ string / welcomestring" valor de la
propiedad para que se destaca a continuacin, pulse Ctrl + B en el teclado. Android Studio posteriormente
abrir el archivo strings.xml y le llevar a la lnea de ese archivo en el que se declar este recurso. Aproveche
esta oportunidad para revertir el recurso de cadena de nuevo a la "Bienvenido a Android Estudio" original del
texto.
41
hacer selecciones en el men del dispositivo en la barra de herramientas en el borde superior del panel
Designer. Otra opcin til que ofrece este men es Vista previa de todos los tamaos de pantalla que, cuando
se selecciona, muestra el diseo en todas las configuraciones de los dispositivos configurados actualmente
como se demuestra en la Figura 3-14:
Figura 3-14
Para volver a un solo diseo vista previa, seleccione el men del dispositivo, una vez ms, esta vez de elegir
la opcin Eliminar Previews.
Resumen
Aunque no es excesivamente complejo, una serie de pasos estn involucrados en la creacin de un entorno
de desarrollo de Android. Despus de haber realizado estos pasos, vale la pena trabajar a travs de un
42
ejemplo sencillo para asegurarse de que el medio ambiente se ha instalado y configurado correctamente. En
este captulo, hemos creado una aplicacin sencilla y luego se usa Diseador Android Estudio interfaz de
usuario para modificar el diseo de la interfaz de usuario. Al hacerlo, hemos explorado la importancia de
utilizar los recursos siempre que sea posible, sobre todo en el caso de los valores de cadena, y brevemente
toc en el tema de los diseos. Por ltimo, nos fijamos en el cdigo XML subyacente que se utiliza para
almacenar los diseos de interfaz de usuario de las aplicaciones de Android.
Si bien es til para poder previsualizar el diseo desde dentro de la herramienta Android Studio Designer, no
hay sustituto para probar una aplicacin mediante la compilacin y ejecutarlo. En un captulo posterior
titulado Creacin de un dispositivo virtual de Android (AVD) en Android estudio , los pasos necesarios para
configurar un emulador para propsitos de prueba se tratarn en detalle.Antes de ejecutar la aplicacin, sin
embargo, el siguiente captulo se llevar un pequeo desvo para ofrecer una visita guiada de la interfaz de
usuario de Android Studio.
43
1 La pantalla de bienvenida
2 La ventana principal
3 La herramienta de Windows
7 Resumen
La pantalla de bienvenida
La pantalla de bienvenida (Figura 4-1) se muestra cada vez que se ejecuta Android Estudio con ningn
proyecto actualmente abiertos (proyectos abiertos pueden ser cerradas en cualquier momento seleccionando
Archivo -> opcin de men Cerrar proyecto). Si Android estudio se sali con anterioridad, mientras que un
proyecto an estaba abierta, la herramienta se pasa por la pantalla de bienvenida prxima vez que se puso
en marcha, abriendo automticamente el proyecto previamente activo.
44
Figura 4-1
Adems de una lista de proyectos recientes, el men de inicio rpido proporciona una gama de opciones para
realizar tareas como abrir, crear e importar proyectos junto con el acceso a los proyectos actualmente bajo
control de versiones. Adems, la opcin Configurar permite acceder al Administrador de SDK junto con una
amplia gama de configuraciones y opciones de configuracin. Una revisin de estas opciones revelar
rpidamente que casi no hay aspecto de Android Studio que no puede ser configurado y adaptado a sus
necesidades especficas.
Por ltimo, la barra de estado a lo largo del borde inferior de la ventana proporciona informacin acerca de la
versin de Android Estudio actualmente en ejecucin, junto con un enlace para comprobar si hay
actualizaciones disponibles para su descarga.
La ventana principal
Cuando se crea un nuevo proyecto, o una ya existente abri, aparecer la ventana principal de Android
Studio. Cuando varios proyectos estn abiertos a la vez, cada uno se le asignar su propia ventana
principal. La configuracin precisa de la ventana puede variar dependiendo de la que se muestran las
45
herramientas y los paneles de la ltima vez que el proyecto estaba abierta, pero ser tpicamente parecerse a
la de la Figura 4-2.
Figura 4-2
A - Barra de Men - contiene una serie de mens para realizar tareas en el entorno Android Studio.
B - Barra de herramientas - Una seleccin de los accesos directos a cabo con frecuencia acciones. Los
botones de la barra de herramientas proporcionan un acceso ms rpido a un grupo selecto de las
acciones de la barra de mens. La barra de herramientas se puede personalizar haciendo clic derecho
sobre la barra y seleccionar Personalizar mens y barras de herramientas ... del men.
C - Barra de navegacin - La barra de navegacin ofrece una forma cmoda de moverse por los archivos
y carpetas que componen el proyecto. Al hacer clic en un elemento en la barra de navegacin se
desplegar un men con las subcarpetas y archivos en esa ubicacin lista para la seleccin. Esto
proporciona una alternativa a la ventana de herramientas del proyecto.
46
D - Ventana Editor - La ventana del editor muestra el contenido del archivo en el que el desarrollador est
trabajando actualmente. Lo que se muestra en esta ubicacin, sin embargo, est sujeta a
contexto. Durante la edicin de cdigo, por ejemplo, aparecer el editor de cdigo. Cuando se trabaja en
un archivo de diseo de interfaz de usuario, por el contrario, aparecer la herramienta de interfaz de
usuario de Designer. Cuando hay varios archivos abiertos, cada archivo est representado por una
pestaa situada a lo largo del borde superior del editor, como se muestra en la Figura 4-3.
Figura 4-3
E - Barra de estado - La barra de estado muestra mensajes informativos sobre el proyecto y las
actividades de Android estudio junto con el botn de men de herramientas situada en la esquina
izquierda. Al pasar por encima los elementos de la barra de estado proporcionar una descripcin de ese
campo. Muchos campos son interactivos, lo que permite al usuario hacer clic para realizar tareas u
obtener informacin de estado ms detallada.
F - Proyecto Ventana Herramienta - La ventana de herramientas del proyecto proporciona una visin
jerrquica de la estructura de archivos de proyecto que permite la navegacin a los archivos y carpetas
especficas a realizar. El men desplegable en la barra de herramientas se puede utilizar para mostrar el
proyecto en un nmero de maneras diferentes. La configuracin predeterminada es la opinin de Android,
que es el modo utilizado principalmente en el resto de este libro.
La ventana de herramientas del proyecto es slo uno de una serie de ventanas de herramientas disponibles
en el entorno Android Studio.
La herramienta de Windows
Adems de la ventana de herramientas vista del proyecto, Android Studio tambin incluye una serie de otras
ventanas que, cuando est activada, se muestran en la parte inferior y los lados de la ventana principal. El
men de acceso rpido ventana de herramientas se puede acceder con solo pasar el puntero del ratn sobre
el botn situado en la esquina izquierda de la barra de estado (Figura 4-4) sin hacer clic en el botn del ratn.
47
Figura 4-4
48
Figura 4-5
Al hacer clic en un botn se mostrar la ventana de la herramienta correspondiente, mientras que un segundo
clic, se oculta la ventana. Botones prefijados con un nmero (por ejemplo 1: Proyecto) indican que la ventana
de la herramienta tambin se puede visualizar pulsando la tecla Alt en el teclado (o la tecla Comando para
Mac OS X), junto con el nmero correspondiente.
La ubicacin de un botn en una barra de la ventana de herramientas indica el lado de la ventana contra la
que aparecer la ventana cuando se muestra. Estas posiciones se pueden cambiar haciendo clic y
arrastrando los botones para diferentes ubicaciones en otras barras de herramientas de la ventana.
Cada ventana de herramientas tiene su propia barra de herramientas a lo largo del borde superior. Los
botones dentro de estas barras de herramientas varan de una herramienta a otra, aunque todas las ventanas
de herramientas contienen una opcin de configuracin, representada por el icono de la rueda dentada, que
permite a los diversos aspectos de la ventana para ser cambiados.Figura 4-6 muestra el men de
configuracin de la ventana de herramientas vista del proyecto. Las opciones estn disponibles, por ejemplo,
para desacoplar una ventana y les permiten flotar fuera de los lmites de la ventana principal de Android
Studio.
49
Figura 4-6
Todas las ventanas tambin incluyen un botn de la derecha en la barra de herramientas que proporciona
una forma adicional para ocultar la ventana de herramientas de la vista. Android Studio ofrece una amplia
gama de ventanas de herramientas de la ventana, el ms utilizado de los cuales son los siguientes:
Proyecto - La vista del proyecto proporciona una visin general de la estructura de archivos que
componen el proyecto que permite una navegacin rpida entre los archivos. En general, hacer doble clic
en un archivo en la vista del proyecto har que ese archivo a ser cargado en la herramienta de edicin
correspondiente.
Estructura - La estructura herramienta proporciona una visin de alto nivel de la estructura del archivo de
cdigo fuente que se muestra actualmente en el editor. Esta informacin incluye una lista de elementos,
tales como clases, mtodos y variables en el archivo. Al seleccionar un elemento de la lista estructura le
llevar a ese lugar en el archivo de origen en la ventana del editor.
Favoritos - Una variedad de artculos del proyecto se pueden agregar a la lista de favoritos. Hacer clic
derecho sobre un archivo en la ventana de proyecto, por ejemplo, ofrece acceso a una opcin de men
Agregar a Favoritos. Del mismo modo, un mtodo en un archivo de cdigo fuente se puede agregar como
favorito haciendo clic derecho sobre ella en la ventana Estructura herramienta. Cualquier cosa se aade a
una lista de Favoritos se puede acceder a travs de esta ventana Favoritos herramienta.
Construir Las variantes - La acumulacin variantes ventana de la herramienta proporciona una forma
rpida de configurar diferentes objetivos de construccin para el proyecto actual de la aplicacin (por
ejemplo, diferentes construcciones para la depuracin y liberar versiones de la aplicacin, o mltiples
compilaciones para dirigirse a diferentes categoras de dispositivos).
TODO - Como su nombre indica, esta herramienta proporciona un lugar para revisar los artculos que an
no se han completado en el proyecto. Android Studio compila esta lista mediante el escaneo de los
archivos de origen que componen el proyecto para buscar comentarios que coinciden con los patrones
50
especificados TODO. Estos patrones se pueden revisar y cambiar seleccionando Archivo -> Configuracin
... opcin de men y navegar a la pgina TODO enumerado en Configuracin IDE.
Terminal - Proporciona acceso a una ventana de terminal en el sistema en el que se est ejecutando
Android Estudio. En los sistemas Windows es la interfaz de lnea de comandos, mientras que en los
sistemas Linux y Mac OS X esto toma la forma de un smbolo del Terminal.
Ejecutar - La ventana de herramientas de ejecucin est disponible cuando una aplicacin se est
ejecutando actualmente y proporciona una vista de los resultados de la ejecucin, junto con opciones para
detener o reiniciar un proceso en ejecucin. Si una aplicacin est fallando para instalar y ejecutar en un
dispositivo o emulador, esta ventana se suelen proporcionar informacin de diagnstico en relacin con el
problema.
Registro de eventos - La ventana de registro de eventos muestra los mensajes relativos a los eventos y
actividades que se realizan dentro de Android Studio. La construccin exitosa de un proyecto, por
ejemplo, o el hecho de que una aplicacin se est ejecutando ahora se informar dentro de esta
herramienta de ventana.
Gradle Console - La consola Gradle se utiliza para mostrar toda la salida del sistema Gradle como
proyectos se construyen desde dentro Android Studio. Esto incluir informacin sobre el xito o el fracaso
del proceso de construccin junto con los detalles de los errores o advertencias.
Maven Proyectos - Maven es una gestin de proyectos y construccin de sistema diseado para facilitar
el desarrollo de proyectos basados en Java complejas y se superpone en muchas zonas con la
funcionalidad proporcionada por Gradle. Google ha elegido Gradle como el sistema de construccin
subyacente para el desarrollo de Android, por lo menos que ya estn familiarizados con Maven o tienen
proyectos Maven existentes para importar, el tiempo ser mejor gastado el aprendizaje y la adopcin
Gradle para sus proyectos. La ventana de herramientas proyectos Maven se puede utilizar para agregar,
administrar y Maven importacin proyectos basados en Android Studio.
Gradle - La ventana de herramientas Gradle proporciona una visin sobre las tareas Gradle que
componen la configuracin de generacin de proyectos. La ventana muestra las tareas que estn
involucrados en la compilacin de los diversos elementos del proyecto en una aplicacin ejecutable. Haga
51
clic derecho en una tarea de primer nivel Gradle y seleccione la opcin de men Abrir Gradle Config para
cargar el Gradle construir archivo para el proyecto actual en el editor. Gradle se cubrir con mayor detalle
ms adelante en este libro.
Comandante - La herramienta de ventana Comandante puede ser mejor descrito como una combinacin
de las ventanas del proyecto y estructura de herramientas, lo que permite la jerarqua de archivos del
proyecto para ser atravesada y para los diversos elementos que componen las clases para ser
inspeccionado y se carga en el editor o diseador ventanas.
Diseador - Disponible cuando el Diseador de interfaz de usuario est activa, esta ventana de
herramientas proporciona acceso a los paneles del rbol de componentes y propiedades del diseador.
Figura 4-7
52
Una vez que aparece, el conmutador permanecer visible durante el tiempo que la tecla Ctrl sigue
deprimida. Golpeando repetidamente la tecla Tab mientras mantiene pulsada la tecla Ctrl ciclo voluntad a
travs de las distintas opciones de seleccin, mientras que soltar la tecla Ctrl hace que el elemento
actualmente resaltado para ser seleccionados y se muestran dentro de la ventana principal.
Adems de la conmutacin, la navegacin a los archivos abiertos recientemente es proporcionada por el
panel Archivos reciente (Figura 4-8). Esto se puede acceder utilizando el atajo de teclado Ctrl-E (Cmd-E en
Mac OS X). Una vez que aparece, ya sea el puntero del ratn se puede usar para seleccionar una opcin o,
en su defecto, las teclas de flecha del teclado se pueden utilizar para desplazarse por las opciones de nombre
de archivo y de la ventana de herramientas. Al pulsar la tecla Intro se seleccione el elemento resaltado
actualmente.
Figura 4-8
53
Figura 4-9
Resumen
Los elementos principales del entorno de Android estudio consisten en la pantalla de bienvenida y ventana
principal. Cada proyecto abierto se le asigna su propia ventana principal, que, a su vez, consiste en una barra
de mens, barra de herramientas, la edicin y el rea de diseo, barra de estado y una coleccin de ventanas
de herramientas. Ventanas de herramientas aparecen en los lados y bordes inferiores de la ventana principal
y se puede acceder ya sea usando el men de acceso rpido situada en la barra de estado, o por medio de
los barrotes de la ventana de herramientas opcionales.
Hay muy pocas acciones dentro Android estudio que no se pueden activar a travs de un atajo de teclado. Un
mapa de teclas de atajos de teclado por defecto se puede acceder en cualquier momento desde la ventana
principal de Android Studio
54
3 Iniciar el emulador
10 Resumen
se
instalan
permitiendo
AVDs
ser
configurados
para
una
gama
de
diferentes
dispositivos. Plantillas adicionales pueden ser cargados o configuraciones personalizadas creadas para
adaptarse a cualquier dispositivo Android fsica especificando propiedades tales como el tipo de procesador,
capacidad de memoria y el tamao y la densidad de pxeles de la pantalla. Consulte la documentacin de
desarrolladores en lnea para su dispositivo para saber si las definiciones de emulador estn disponibles para
su descarga e instalacin en el medio ambiente AVD.
55
Cuando se inicia, una AVD aparecer como una ventana que contiene un entorno emulado dispositivo
Android. Figura 5-1, por ejemplo, muestra una sesin de AVD configurado para emular el dispositivo Google
Nexus 7. Nuevos AVDs se crean y administran mediante el Administrador de dispositivos virtual Android, que
se puede utilizar ya sea en el modo de lnea de comandos o con una interfaz grfica de usuario fcil de usar
Figura 5-1
Una vez puesto en marcha, aparecer la herramienta como se indica en la Figura 5-2. Asumiendo una nueva
instalacin SDK de Android, actualmente se listarn no AVDs:
56
Figura 5-2
Comience el proceso de creacin AVD haciendo clic en el botn Crear un dispositivo virtual para invocar el
cuadro de dilogo Configuracin del dispositivo virtual:
57
Figura 5-3
En el cuadro de dilogo, realice los siguientes pasos para crear un emulador compatible Nexus primera
generacin 7:
1. En el panel Categora, seleccione la opcin de la tableta para mostrar la lista de plantillas disponibles AVD
tablet Android. 2. Seleccione el 7 (2012) opcin de dispositivo Nexus y haga clic en Siguiente. 3. En la
pantalla de imagen del sistema, seleccione la ltima versin de Android (al momento de escribir esto es
Android 5.0.1, el nivel de API Lollipop 21) para el armeabi-v7a ABI. Haga clic en Siguiente para continuar. 4.
Introduzca un nombre descriptivo (por ejemplo, Nexus 7) en el campo nombre. 5. Haga clic en Finalizar para
crear la AVD.
Con la AVD creado, el Administrador de AVD ahora se puede cerrar. Si las futuras modificaciones de la AVD
son necesarios, simplemente vuelva a abrir el Administrador de AVD, seleccione la AVD de la lista y haga clic
en el icono de lpiz en la columna Acciones de la fila dispositivo en el Administrador de AVD.
58
esto normalmente se reducir a unos pocos minutos. En el caso de que el tiempo de arranque del sistema es
considerable, no dude en dejar el emulador corriendo. El sistema detectar que ya se est ejecutando y
adjuntar a ella cuando se ponen en marcha las aplicaciones, lo que ahorra una cantidad considerable de
tiempo de inicio.
Otra opcin cuando se utiliza el emulador es habilitar la opcin de instantneas en la pantalla de
configuracin de AVD. Esta opcin, que slo se puede utilizar cuando la opcin Host GPU uso est
desactivado, permite que el estado de una instancia AVD se salven y vuelve a cargar la prxima vez que se
puso en marcha. Esto puede resultar en un tiempo de arranque emulador de unos pocos segundos.
Para habilitar instantneas, editar la configuracin para la configuracin AVD y haga clic en el botn Mostrar
configuracin avanzada. En la seccin Rendimiento emulada del panel de configuracin avanzada, desactive
la opcin GPU Uso Host y active la tienda una instantnea para el inicio rpido como se indica en la figura 5
4:
Figura 5-4
Para ahorrar tiempo en la siguiente seccin de este captulo, deje correr el emulador antes de continuar.
Figura 5-5
Por defecto, Android Estudio responder a la solicitud de ejecucin, mostrando el cuadro de dilogo
Seleccionar dispositivo. Esto proporciona la opcin para ejecutar la aplicacin en una instancia AVD que ya
est en marcha, o para poner en marcha una nueva sesin AVD especficamente para esta aplicacin. Figura
5-6 muestra el creado previamente Nexus7 AVD como un dispositivo que ejecuta como resultado de las
59
etapas realizadas en la seccin anterior. Con este dispositivo seleccionado en el cuadro de dilogo, haga clic
en Aceptar para instalar y ejecutar la aplicacin en el emulador.
Figura 5-6
Una vez instalada la aplicacin en funcionamiento, la interfaz de usuario para la clase AndroidSampleActivity
aparecer en el emulador:
60
Figura 5-7
En el caso de que la actividad no se inicia automticamente, puedes ver si el icono de inicio ha aparecido
entre las aplicaciones en el emulador. Si es as, simplemente haga clic en l para iniciar la aplicacin. Una
vez que comienza el proceso de ejecucin, de gestin y Android ventanas de herramientas estarn
disponibles. La ventana de la herramienta Ejecutar mostrar la informacin de diagnstico como el paquete
de aplicacin se instala y se lanz. Figura 5-8 muestra la salida de la ventana de herramientas Ejecutar desde
un inicio de la aplicacin con xito:
61
Figura 5-8
Figura 5-9
En el cuadro de dilogo Ejecutar / Depurar configuraciones, la aplicacin puede configurarse para utilizar
siempre un emulador preferido activando la opcin emulador enumerados en la seccin Dispositivo de destino
y seleccionar el emulador desde el men desplegable. Figura 5-10, por ejemplo, muestra la aplicacin
AndroidSample configurado para funcionar de forma predeterminada en el emulador Nexus7 creado
anteriormente:
62
Figura 5-10
63
Figura 5-11
Una vez que aparezca la ventana de herramientas Android, asegrese de que los dispositivos | ADB
Registros pestaa se selecciona, y que se ha seleccionado la entrada Nexus7 emulador en el panel de
dispositivos. En la lista de procesos situados debajo del nombre del dispositivo, busque y seleccione el
proceso androidsample como se indica en la Figura 5-12:
Figura 5-12
64
Con el proceso seleccionado, detenerlo haciendo clic en el botn rojo Finalizar aplicacin en la barra de
herramientas vertical a la izquierda de la lista de procesos:
Figura 5-13
Una alternativa al uso de la ventana de herramientas Android es abrir el Android Debug Monitor. Esto puede
ser lanzado a travs de las Herramientas -> Android -> opcin de men Monitor del dispositivo Android. Una
vez puesto en marcha, el proceso se puede seleccionar de la lista (Figura 5-14) y se termina haciendo clic en
el botn rojo de parada ubicada en la barra de herramientas superior de la lista.
65
Figura 5-14
La salida resultante del comando anterior contendr una lista de las versiones del SDK de Android que estn
disponibles en el sistema. Por ejemplo:
Disponible objetivos Android:
---------id: 1 o "android-21"
Nombre: Android 5.0.1
66
Tipo: Plataforma
Nivel de la API: 21
Revisin: 2
Skins: HVGA, QVGA, WQVGA400,
WXGA720, WXGA800, WXGA800-7in
Tag / ABIs: default / armeabi-v7a
WQVGA432,
WSVGA,
WVGA800
(por
defecto),
WVGA854,
Por ejemplo, para crear un nuevo AVD llamado Nexus7 utilizando el ID de destino para el dispositivo Android
5.0 API nivel 21 (en este caso Identificacin del 1), el siguiente comando se puede utilizar:
androide crear avd -n Nexus7 -t 1
La herramienta androide crear la nueva AVD a las especificaciones requeridas para un dispositivo bsico de
Android 5.0, que tambin proporciona la opcin de crear una configuracin personalizada para que coincida
con la especificacin de un dispositivo especfico si es necesario. Una vez que una nueva AVD se ha creado
a partir de la lnea de comandos, no puede aparecer en la herramienta Administrador de dispositivos Android
hasta que se hace clic en el botn Actualizar.
Adems de la creacin de nuevos AVDs, un nmero de otras tareas se puede realizar desde la lnea de
comandos. Por ejemplo, una lista de los disponibles en la actualidad AVDs se puede obtener utilizando la lista
avd argumentos de la lnea de comandos:
Lista androide avd
Disponible dispositivos virtuales Android:
Nombre: GenericAVD
Ruta de acceso: C: \ Users \ Neil \ .android \ avd \ GenericAVD.avd
Objetivo: 5.0.1 Android (nivel de API 21)
Tag / ABI: default / armeabi-v7a
Piel: WVGA800
--------Nombre: Nexus_7_2012_API_21
Dispositivo: Nexus 7 (Google)
Ruta de acceso: C: \ Users \ Neil \ .android \ avd \ Nexus_7_2012_API_21.avd
Objetivo: 5.0.1 Android (nivel de API 21)
Tag / ABI: default / armeabi-v7a
Piel: nexus_7
Sdcard: C: \ Users \ Neil \ .android \ avd \ Nexus_7_2012_API_21.avd \ sdcard.img
Instantnea: s
Del mismo modo, para eliminar una AVD existentes, basta con utilizar la opcin de borrar de la siguiente
manera:
67
El archivo config.ini contiene los ajustes de configuracin del dispositivo, tales como dimensiones de la
pantalla y la memoria especificados durante el proceso de creacin de AVD. Estos ajustes se pueden cambiar
directamente en el archivo de configuracin y se adoptarn por la AVD cuando se invoca al lado.
El <nombre avd> archivo .ini contiene una referencia al objetivo SDK de Android y la ruta a los archivos de
AVD. Tenga en cuenta que tambin necesitar un cambio en el valor image.sysdir en el archivo config.ini que
se refleja en el valor objetivo de este archivo.
Para trasladar fsicamente los archivos asociados con la AVD, la siguiente sintaxis del comando se debe
utilizar:
movimiento androide avd -n <avd nombre> -p <ruta de acceso a la nueva ubicacin>
Por ejemplo, para mover un AVD desde su ubicacin actual sistema de archivos en / tmp / Nexus7Test:
android movimiento avd -n Nexus7 -p / tmp / Nexus7Test
Tenga en cuenta que el directorio de destino no debe ya existir antes de ejecutar el comando para mover un
AVD.
Resumen
Un proceso de desarrollo de aplicacin tpica sigue un ciclo de codificar, compilar y ejecutar en un entorno de
prueba. Aplicaciones de Android se pueden ensayar ya sea en un dispositivo Android fsico o el uso de un
dispositivo virtual (AVD) emulador de Android. AVDs se crean y administran mediante la herramienta
68
Administrador de AVD Android que puede ser utilizado como una herramienta de lnea de comandos o
mediante una interfaz grfica de usuario. Al crear un AVD para simular un modelo especfico dispositivo
Android es importante que el dispositivo virtual puede configurar con una especificacin de hardware que
coincide con el del dispositivo fsico.
69
Mientras que se puede lograr mucho por probar aplicaciones utilizando un dispositivo virtual de Android
(AVD), no hay sustituto para la realizacin de pruebas de aplicaciones del mundo real en un dispositivo
Android fsica y hay una serie de caractersticas de Android que slo estn disponibles en los dispositivos
Android fsicas. La comunicacin con ambas instancias AVD y dispositivos Android conectados es manejado
por el Puente de depuracin Android (BAD). En este captulo vamos a trabajar a travs de los pasos para
configurar el entorno de adb para permitir pruebas de aplicaciones en un dispositivo Android fsico con los
sistemas basados en Mac OS X, Windows y Linux.
Contenido
4 Resumen
70
$ adb devices
Lista de dispositivos conectados
dispositivo emulador-5554
Figura 6-1
3. Vuelva a la pantalla principal de configuracin y observe la aparicin de una nueva opcin titulada opciones
Developer. Seleccione esta opcin y localizar el ajuste en la depuracin USB titulado pantalla
desarrollador. Active la casilla junto a este artculo como se ilustra en la Figura 6-2 para permitir la conexin
de depuracin adb.
Figura 6-2
71
4. Deslice el dedo hacia abajo desde la parte superior de la pantalla para mostrar el panel de notificaciones
(Figura 6-3) y tenga en cuenta que el dispositivo est conectado como un dispositivo de medios.
Figura 6-3
En este punto, el dispositivo est configurado para aceptar conexiones de depuracin de adb en el sistema de
desarrollo. Todo lo que queda es configurar el sistema de desarrollo para detectar el dispositivo cuando est
conectado. Si bien este es un proceso relativamente sencillo, los pasos a seguir difieren dependiendo de si el
sistema de desarrollo se est ejecutando Windows, Mac OS X o Linux. Tenga en cuenta que los siguientes
pasos se supone que el directorio de la plataforma-herramientas SDK de Android est incluido en la variable
de entorno PATH del sistema operativo como se describe en el captulo titulado La creacin de un entorno de
desarrollo de Android.
A continuacin, reinicie el servidor adb emitiendo los siguientes comandos en la ventana de terminal:
$
$
*
*
Kill-server adb
Start-servidor adb
Daemon no se est ejecutando. empezando ahora en el puerto 5037 *
Daemon inici correctamente *
Una vez que el servidor se ejecuta con xito, ejecute el siguiente comando para comprobar que el dispositivo
se ha detectado:
$ adb devices
Lista de dispositivos conectados
74CE000600000001 offline
Si el dispositivo aparece como fuera de lnea, vaya al dispositivo Android y comprobar la presencia del dilogo
que se muestra en la Figura 6-9 en busca de permiso para permitir la depuracin USB.Active la casilla junto a
la opcin que permite lecturas Siempre desde este equipo, antes de hacer clic en Aceptar. Repitiendo el
comando adb devices ahora debe enumerar el dispositivo como disponibles:
72
En el caso de que el dispositivo no est en la lista, trate de cerrar la sesin y luego de nuevo en el escritorio
de Mac OS X y, si el problema persiste, reiniciar el sistema.
cuando
se
trabaja
en
un
proyecto
existente.
2. Vaya a la seccin de Extras y comprobar el estado del paquete USB Driver Google para asegurarse de que
est
catalogado
como
Instalado.
3. Si no est instalado el controlador, seleccione y haga clic en el botn Instalar paquetes para iniciar la
instalacin.
4. Una vez completada la instalacin, cierre el Administrador de Android SDK.
Para dispositivos Android no soportados por el controlador USB Google, ser necesario descargar los
controladores proporcionados por el fabricante del dispositivo. Un listado de los controladores y la informacin
de descarga se puede obtener en lnea en http://developer.android.com/tools/extras/oem-usb.html .
Cuando un dispositivo Android est conectado a un sistema Windows se configura como un dispositivo
porttil. Para que el dispositivo para conectarse a ADB debe configurarse como un dispositivo Android ADB
Compuesto. En primer lugar, conecte el dispositivo Android en el sistema informtico si no est conectado
actualmente. A continuacin, mostrar el Panel de control y seleccione Administrador de dispositivos. En el
cuadro de dilogo resultante, compruebe si hay una categora titulada Otros dispositivos. Despliegue esta
categora y comprobar para ver si el dispositivo Android est en la lista (en el caso de la figura 6 -5, un Nexus
7 ha sido detectado):
Figura 6-5
Haga clic en el nombre del dispositivo y seleccione Actualizar software de controlador en el men. Seleccione
la opcin para Hojee mi software de controlador y en el siguiente cuadro de dilogo, mantenga la opcin
73
Incluir subcarpetas seleccionadas y haga clic en el botn Examinar .... Vaya a la ubicacin en la que se han
instalado los controladores USB. En el caso de que el controlador USB Google, esto ser en el sdk \ extras \
google \ USB_Driver subcarpeta del directorio de instalacin de Android Studio (cuya ubicacin se puede
encontrar en el Administrador SDK). Una vez localizado, haga clic en Aceptar para seleccionar la carpeta del
controlador seguido de Siguiente para iniciar la instalacin.
Durante la instalacin, el smbolo de seguridad de Windows aparecer pedir permiso para instalar el
controlador como se ilustra en la Figura 6-6. Cuando aparezca este cuadro de dilogo, haga clic en el botn
Instalar para continuar.
Figura 6-6
Una vez finalizada la instalacin, la pantalla de actualizacin del controlador de Windows se actualizar para
mostrar un mensaje indicando que el controlador ha sido instalado y que el dispositivo est ahora reconocido
como un ADB Interface Android Compuesto:
74
Figura 6-7
Figura 6-8
Con los controladores instalados y el dispositivo ahora se reconocen como el tipo de dispositivo correcto, abra
una ventana del smbolo del sistema y ejecute el siguiente comando:
adb devices
Este comando debe informacin de salida del dispositivo conectado similar a la siguiente:
Lista de dispositivos conectados
015d41d4454bf80c offline
Si el dispositivo se muestra como desconectado o no autorizado, vaya a la pantalla del dispositivo y verifique
que el dilogo que se muestra en la Figura 6-9 en busca de permiso para permitir la depuracin USB.
75
Figura 6-9
Active la casilla junto a la opcin que permite lecturas Siempre desde este equipo, antes de hacer clic en
Aceptar. Repitiendo el comando adb devices ahora debe enumerar el dispositivo como estar listo:
Lista de dispositivos conectados
Dispositivo 015d41d4454bf80c
En el caso de que el dispositivo no est en la lista, ejecute los siguientes comandos para reiniciar el servidor
ADB:
adb kill-server
adb start-servidor
Figura 6-10
76
Figura 6-11
Para hacer esto, el dispositivo predeterminado para las pruebas, que el uso mismo dispositivo para la futura
opcin de lanza. Con el dispositivo seleccionado, haga clic en el botn Aceptar para instalar y ejecutar la
aplicacin en el dispositivo. Al igual que con el medio ambiente emulador, salida de diagnstico en relacin
con la instalacin y puesta en marcha de la aplicacin en el dispositivo se registra en la ventana de
herramientas Ejecutar.
Resumen
Mientras el Android emulador de dispositivo virtual proporciona un entorno de prueba excelente, es importante
tener en cuenta que no existe un sustituto real para asegurarse de que los funciones de una aplicacin
correctamente en un dispositivo Android fsica. Esto, despus de todo, es donde la aplicacin se utilizar en el
mundo real.
Por defecto, sin embargo, el entorno Android estudio no est configurado para detectar los dispositivos
Android como un dispositivo de prueba de destino. Es necesario, por lo tanto, para llevar a cabo algunas
medidas con el fin de ser capaz de cargar aplicaciones directamente en un dispositivo Android desde el
entorno de desarrollo de Android Studio. Los pasos exactos para lograr este objetivo difiere dependiendo de
la plataforma de desarrollo que se utiliza. En este captulo, hemos cubierto esos pasos para Linux, Mac OS X
y Windows plataformas basadas.
77
3 Cdigo de finalizacin
4 Finalizacin de instrucciones
5 Informacin de parmetros
6 Generacin de cdigo
7 Cdigo plegable
9 Cdigo reformateo
10 Resumen
78
Figura 7-1
Los elementos que componen la ventana del editor se puede resumir de la siguiente manera:
A - Documento aqu - Android Studio es capaz de contener mltiples archivos abiertos para la edicin en un
momento dado. Como se abre cada archivo, se le asigna una ficha de documento que muestra el nombre de
archivo en la barra de pestaas situado a lo largo del borde superior de la ventana del editor. Un pequeo
men desplegable aparecer en la esquina derecha de la barra de pestaas cuando no hay suficiente espacio
para mostrar todas las fichas. Al hacer clic en este men se desplegar una lista de archivos abiertos
adicionales. Una lnea roja ondulada debajo de un nombre de archivo en una pestaa indica que el cdigo en
el archivo contiene uno o ms errores que deben ser abordados antes de que el proyecto se puede compilar y
ejecutar.
Cambio entre archivos es simplemente una cuestin de hacer clic en la ficha correspondiente o utilizando los
atajos de teclado Alt-Derecha-Izquierda y Alt. La navegacin entre archivos tambin se puede realizar
utilizando el mecanismo de Conmutacin (accesible a travs de la combinacin de teclas Ctrl-Tab).
Para separar un panel editor desde la ventana principal de Android Estudio para que aparezca en una
ventana independiente, haga clic en la ficha y arrstrelo a un rea en el escritorio fuera de la ventana
principal. Para volver al editor a la ventana principal, haga clic en la pestaa archivo en la ventana del editor
separado y arrastre y sultelo en la barra de pestaas editor original en la ventana principal.
79
B - The Gutter rea Editor - La zona del canal es utilizado por el editor para mostrar los iconos y controles
informativos. Algunos elementos tpicos, entre otros, que aparecen en esta zona del canal est depurando
marcadores de punto de interrupcin, controles para plegar y desplegar bloques de cdigo, marcadores,
marcadores y cambiar los nmeros de lnea. Los nmeros de lnea estn apagados por defecto, pero se
pueden activar haciendo clic derecho en la cuneta y seleccionando la opcin de men Mostrar nmeros de
lnea.
C - La barra de estado - A pesar de la barra de estado es en realidad parte de la ventana principal, en
contraposicin con el editor, contiene alguna informacin acerca de la sesin de edicin activa.Esta
informacin incluye la posicin actual del cursor en trminos de lneas y caracteres y el formato de
codificacin del archivo (UTF-8, ASCII, etc.). Al hacer clic en estos valores en la barra de estado permite el
ajuste correspondiente a cambiar. Al hacer clic en el nmero de lnea, por ejemplo, muestra el pase a la lnea
de dilogo.
D - El rea Editor - Esta es el rea principal donde se muestra el cdigo, entr y editado por el usuario. En
secciones posteriores de este captulo cubrirn las principales caractersticas de la zona de edicin en detalle.
E - La validacin y Marker Sidebar - Android estudio incorpora una funcin denominada "anlisis de cdigo
en la marcha". Lo que esto significa bsicamente es que a medida que est escribiendo cdigo, el editor est
analizando el cdigo para comprobar si hay advertencias y errores de sintaxis. El cuadrado de color en la
parte superior de la barra lateral de validacin cambia de color de verde (no hay advertencias o errores
detectados) a amarillo (advertencias detectados) y roja (se han detectado errores). Al hacer clic en esta plaza
se mostrar una ventana emergente que contiene un resumen de los problemas encontrados con el cdigo en
el editor como se ilustra en la Figura 7-2:
Figura 7-2
La barra lateral tambin muestra los marcadores en los lugares donde los problemas se han detectado
utilizando el mismo cdigo de colores. Al pasar el puntero del ratn sobre un marcador, cuando la lnea de
cdigo es visible en el rea de edicin se mostrar una ventana emergente que contiene una descripcin del
problema (Figura 7-3):
80
Figura 7-3
Al pasar el puntero del ratn sobre un marcador de una lnea de cdigo que se desplaza actualmente fuera
del rea de visualizacin del editor mostrar una superposicin "lente" que contiene el bloque de cdigo en el
que se encuentra el problema (Figura 7-4) lo que le permite ser visto sin la necesidad de desplazarse a ese
lugar en el editor:
Figura 7-4
Tambin vale la pena sealar que la superposicin de la lente no se limita a las advertencias y errores en la
barra lateral. Al pasar por encima de cualquier parte de la barra lateral se traducir en una lente que aparece
con el cdigo presente en ese lugar dentro del archivo de origen.
Despus de haber proporcionado una visin general de los elementos que componen el editor de Android
Studio, el resto de este captulo explorar las caractersticas clave del entorno de edicin con ms detalle.
81
Figura 7-5
La orientacin de un panel de divisin se puede cambiar en cualquier momento haciendo clic derecho sobre
la pestaa correspondiente y seleccionando la opcin de men Orientacin Cambio Splitter. Repita estos
pasos para desdividir un solo panel, esta vez seleccionando la opcin Unir en el men. Todos los paneles de
divisin se puede eliminar haciendo clic derecho en cualquier pestaa y seleccionando la opcin de men
Unir Todo.
Ventana divisin se puede utilizar para mostrar diferentes archivos, o para proporcionar mltiples ventanas en
el mismo archivo, lo que permite diferentes reas del mismo archivo para ver y editar al mismo tiempo.
Cdigo de finalizacin
El editor de Android Studio tiene una cantidad considerable de conocimientos incorporada de la sintaxis de
programacin Java y las clases y mtodos que componen el SDK de Android, as como el conocimiento de su
propia base de cdigo. Como se escribe cdigo, el editor analiza lo que se ha escrito y, en su caso, se hacen
sugerencias con respecto a lo que podra ser necesario para completar una declaracin o de
referencia. Cuando una sugerencia conclusin es detectado por el editor, aparecer un panel que contiene
una lista de sugerencias. En la Figura 7-6, por ejemplo, el editor es lo que sugiere posibilidades para el inicio
de una declaracin de la secuencia:
82
Figura 7-6
Si ninguna de las sugerencias de terminacin automtica son correctas, simplemente siga escribiendo y el
editor seguir perfeccionando las sugerencias en su caso. Para aceptar la sugerencia ms arriba, slo tiene
que pulsar la tecla Intro o Tab en el teclado. Para seleccionar una sugerencia diferente, utilice las flechas para
moverse hacia arriba y abajo en la lista, una vez ms utilizando la tecla Intro o Tab para seleccionar el
elemento resaltado.
Sugerencias de finalizacin se pueden invocar de forma manual utilizando la secuencia de teclas CtrlEspacio. Esto puede ser til cuando se cambia una palabra o declaracin en el editor. Cuando el cursor se
encuentra sobre una palabra en el editor, esa palabra resaltar automticamente. Al pulsar Ctrl-Espacio
mostrar una lista de sugerencias alternativas. Para reemplazar la palabra actual con el elemento
actualmente resaltado en la lista de sugerencias, slo tiene que pulsar la tecla Tab.
Adems de la funcin de autocompletado en tiempo real, el editor de Android Studio tambin ofrece un
sistema denominado inteligente Finalizacin. Finalizacin inteligente se invoca utilizando la secuencia de
teclas Shift-Ctrl-Espacio y, cuando se selecciona, proporcionar sugerencias ms detalladas basadas en el
contexto actual del cdigo. Al pulsar la secuencia de atajo Shift-Ctrl-Espacio segunda vez proporcionar ms
sugerencias de una gama ms amplia de posibilidades.
Finalizacin de cdigo puede ser una cuestin de preferencia personal por muchos programadores. En
reconocimiento de este hecho, Android Studio proporciona un alto nivel de control sobre la configuracin de
terminacin automtica. Estos se pueden ver y modificar seleccionando Archivo -> Configuracin ... opcin de
men y eligiendo Editor -> Cdigo de finalizacin de la seccin Configuracin IDE del panel de configuracin,
como se muestra en la Figura 7-7:
83
Figura 7-7
Finalizacin de instrucciones
Otra forma de realizacin automtica proporcionada por el editor de Android Studio es la finalizacin de
instrucciones. Esto se puede utilizar para rellenar automticamente fuera de los parntesis y los apoyos para
los artculos tales como los mtodos y las declaraciones de bucle. Finalizacin Declaracin se invoca
utilizando el Shift-Ctrl-Enter (Shift-Cmd-Enter en Mac OS X) secuencia de teclado. Considere, por ejemplo, el
siguiente cdigo:
protegida myMethod void ()
Despus de haber escrito este cdigo en el editor, lo que provoc la finalizacin de instrucciones har que el
editor para agregar automticamente los frenos para el mtodo:
protegida myMethod void () {
}
84
Informacin de parmetros
Tambin es posible solicitar al editor para proporcionar informacin sobre los parmetros de argumentos
aceptados por un mtodo. Con el cursor colocado entre los soportes de una llamada al mtodo, el Ctrl-P
(Cmd-P en Mac OS X) Secuencia de teclado mostrar los parmetros conocidos para ser aceptado por ese
mtodo, con la sugerencia ms probable es resaltado en negrita:
Figura 7-8
Generacin de cdigo
Adems de completar el cdigo, ya que se escribe el editor puede, bajo ciertas condiciones, tambin generar
el cdigo para usted. La lista de opciones de generacin de cdigo disponibles se muestra en la Figura 7-10
se puede acceder mediante el Alt-Insert atajo de teclado cuando el cursor se encuentra en la ubicacin en el
archivo donde el cdigo se va a generar.
Figura 7-9
A los efectos de ejemplo, considere una situacin en la que queremos ser notificado cuando una actividad en
nuestro proyecto est a punto de ser destruido por el sistema operativo. Como se describe en un captulo
posterior de este libro, esto se puede lograr reemplazando el mtodo del ciclo de vida OnStop () de la
superclase Actividad. Tener Android Estudio generar un Stub para esto, slo tiene que seleccionar los
mtodos Override ... opcin de la lista de generacin de cdigo y seleccione el mtodo OnStop () de la lista
resultante de los mtodos disponibles:
85
Figura 7-10
Despus de haber seleccionado el mtodo para anular, al hacer clic en Aceptar generar el Stub en la
ubicacin actual del cursor en el archivo fuente de Java de la siguiente manera:
@ Override
protegida OnStop void () {
super.onStop ();
}
Plegable Cdigo
Una vez que un archivo de cdigo fuente alcanza cierto tamao, incluso el cdigo ms cuidadosamente
formateado y bien organizada puede llegar a ser abrumadora y difcil de navegar. Android Estudio considera
que no siempre es necesario contar con el contenido de cada bloque de cdigo visible en todo
momento. Cdigo de navegacin puede ser ms fcil con el uso de la funcin de plegado de cdigo del editor
de Android Studio. Plegado de cdigo se controla el uso de marcadores que aparecen en la cuneta editor al
86
principio y al final de cada bloque de cdigo en un archivo de origen. Figura 7-11, por ejemplo, pone de
relieve los marcadores de inicio y fin de una declaracin de mtodo que no se dobla la actualidad:
Figura 7-11
Al hacer clic en cualquiera de estos marcadores se pliega la declaracin de tal manera que solamente la lnea
de la firma es visible como se muestra en la Figura 7-12:
Figura 7-12
Para desplegar una seccin derrumbada del cdigo, simplemente haga clic en el marcador de "+" en la
cuneta editor. Para ver el cdigo oculto sin desdoblarla, pase el puntero del ratn sobre la "{...}" indicador
como se muestra en la Figura 7-13. El editor mostrar entonces la superposicin de lentes que contiene el
bloque de cdigo plegada:
Figura 7-13
Todos los bloques de cdigo en un archivo puede plegarse o desplegarse utilizando las secuencias de
teclado Ctrl-Shift-Plus y Ctrl-Shift-Minus.
Por defecto, el editor de Android Studio automticamente veces algo de cdigo cuando se abre un archivo de
origen. Para configurar las condiciones en que esto sucede, seleccione Archivo -> Configuracin ... y
87
seleccione el Editor -> entrada de plegado de cdigo que aparece en Configuracin de IDE en el panel de
configuracin resultante (Figura 7-14):
Figura 7-14
88
Figura 7-15
Una vez que aparece, el popup documentacin se puede mover por la pantalla segn sea necesario. Al hacer
clic en el icono de alfiler situada en la esquina derecha de la barra de ttulo emergente se asegurar de que la
ventana emergente permanece visible una vez que el foco se mueve hacia atrs al editor, dejando la
documentacin visible como una referencia al escribir cdigo.
Cdigo reformateo
En general, el editor de Android Studio formatear automticamente el cdigo en trminos de sangra,
espaciado y anidacin de las declaraciones y los bloques de cdigo como se abonen. En situaciones en las
lneas de cdigo necesitan ser reformateado (una ocurrencia comn, por ejemplo, al cortar y pegar cdigo de
ejemplo de un sitio web), el editor proporciona un cdigo de origen de elemento reformatear que, cuando se
selecciona, se vuelva a formatear automticamente el cdigo para que coincida con la prevalece el estilo de
cdigo.
Para cambiar el formato de cdigo fuente, pulse la secuencia de combinacin de teclas Ctrl-Alt-L para mostrar
el cuadro de dilogo Cdigo de reformateo (Figura 7-16). Este cuadro de dilogo ofrece la opcin de cambiar
el formato de slo el cdigo seleccionado en ese momento, el archivo de origen toda actualmente activo en el
editor o todos los archivos en una carpeta de proyecto dado.
89
Figura 7-16
La gama completa de las preferencias de estilo de cdigo se puede cambiar desde dentro del dilogo de
configuracin del proyecto. Seleccione Archivo -> Configuracin de opciones de men y elija Estilo Cdigo
enumerados en Configuracin del proyecto en el panel de la izquierda para acceder a una lista de lenguajes
de programacin y de marcas compatibles. Seleccin de un idioma proporcionar acceso a una amplia gama
de opciones de estilo de formato, todos los cuales pueden ser modificados desde el valor predeterminado de
Android Studio para que coincida con su estilo de cdigo preferido.
Resumen
El editor de Android Estudio va a la gran longitud para reducir la cantidad de escribir el necesario para escribir
cdigo y hacer que el cdigo ms fcil de leer y navegar. En este captulo hemos cubierto una serie de las
caractersticas del editor clave, incluyendo la finalizacin de cdigo, generacin de cdigo, editor de ventanas
divisin, plegado de cdigo, formatear y bsqueda de documentacin.
90
2 El kernel de Linux
4 Bibliotecas Android
o
4.1 C / C ++ Bibliotecas
5 Application Framework
6 Aplicaciones
7 Resumen
91
Figura 8-1
El resto de este captulo se trabajar a travs de las diferentes capas de la pila de Android, comenzando en la
parte inferior con el kernel de Linux.
El kernel de Linux
Situado en la parte inferior de la pila de software Android, el kernel de Linux proporciona un nivel de
abstraccin entre el hardware del dispositivo y las capas superiores de la pila de software Android.Basado en
Linux versin 2.6, el kernel proporciona multitarea preventiva, servicios del sistema base de bajo nivel, tales
como la memoria, el proceso y la administracin de energa, adems de proporcionar una pila y dispositivos
de red controladores para hardware, como la pantalla del dispositivo, Wi-Fi y audio.
El ncleo original de Linux fue desarrollado en 1991 por Linus Torvalds y se combin con un conjunto de
herramientas, utilidades y compiladores desarrollados por Richard Stallman en la Fundacin para el Software
92
Libre para crear un sistema operativo completo denominado GNU / Linux. Varias distribuciones de Linux se
han derivado de estos fundamentos bsicos como Ubuntu y Red Hat Enterprise Linux.
Es importante sealar, sin embargo, que Android slo utiliza el kernel de Linux. Dicho esto, vale la pena
sealar que el ncleo Linux fue desarrollado originalmente para su uso en ordenadores tradicionales en forma
de equipos de sobremesa y servidores. De hecho, Linux est ahora ms ampliamente desplegada en
entornos de servidores empresariales de misin crtica. Es un testimonio tanto a la energa de los dispositivos
mviles de hoy y de la eficiencia y el rendimiento del kernel de Linux que nos encontramos con este software
en el corazn de la pila de software Android.
Bibliotecas Android
Adems de un conjunto de bibliotecas de desarrollo Java estndar (que prestan apoyo a estas tareas de
propsito general como manejo de cadenas, redes y manipulacin de archivos), el entorno de desarrollo de
Android tambin incluye las Bibliotecas Android. Estos son un conjunto de bibliotecas basados en Java que
son especficos para el desarrollo de Android. Los ejemplos de las bibliotecas en esta categora incluyen las
bibliotecas marco de aplicacin, adems de las que facilitan la construccin de interfaz de usuario, el dibujo
de grficos y el acceso de base de datos.
Un resumen de algunas bibliotecas Android ncleo clave disponibles para el desarrollador de Android es el
siguiente:
android.app - Proporciona acceso al modelo de solicitud y es la piedra angular de todas las aplicaciones
de Android.
android.database - Se utiliza para acceder a los datos publicados por los proveedores de contenidos e
incluye clases de manejo de base de datos SQLite.
93
android.graphics - Un dibujo de la API de grficos 2D de bajo nivel incluyendo colores, puntos, filtros,
rectngulos y lienzos.
android.hardware - Presenta una API que proporciona el acceso al hardware, como el acelermetro y
sensor de luz.
android.opengl - Una interfaz de Java para los grficos OpenGL ES 3D renderizado API.
android.os - Proporciona aplicaciones con acceso a los servicios estndar del sistema operativo,
incluyendo mensajes, servicios del sistema y la comunicacin entre procesos.
android.net - Un conjunto de APIs que dan acceso a la pila de red. Incluye android.net.wifi, que
proporciona acceso a la pila inalmbrica del dispositivo.
android.print - Incluye un conjunto de clases que permite que el contenido que se enviar a las
impresoras configuradas desde las aplicaciones de Android.
android.provider - Un conjunto de clases de conveniencia que ofrecen acceso a bases de datos estndar
de proveedores de contenido de Android, como los mantenidos por las aplicaciones de calendario y
contactos.
android.text - Se utiliza para representar y manipular texto en una pantalla del dispositivo.
android.webkit - Un conjunto de clases destinadas a permitir a las capacidades de navegacin web que
se construirn en las aplicaciones.
Despus de haber cubierto las bibliotecas basadas en Java en el tiempo de ejecucin de Android, ahora es el
momento de centrar nuestra atencin en la C / C ++ bibliotecas basadas contenidas en esta capa de la pila de
software Android.
C / C ++ Bibliotecas
Las bibliotecas del ncleo de ejecucin Android descritos en la seccin anterior son basadas en Java y
proporcionan las API primaria para los desarrolladores que escriben aplicaciones de Android. Es importante
sealar, sin embargo, que las bibliotecas del ncleo en realidad no realizan gran parte del trabajo real y estn,
de hecho, esencialmente "envoltorios" de Java en torno a un conjunto de C / C ++ bibliotecas basados. Al
realizar llamadas, por ejemplo, a la biblioteca android.opengl para dibujar grficos en 3D en la pantalla del
dispositivo, la biblioteca realidad ltima instancia hace llamadas a la biblioteca de la OpenGL ES C ++, que, a
su vez, funciona con el kernel Linux subyacente para realizar las tareas de dibujo . C / C bibliotecas ++ se
incluyen para cumplir con una amplia y diversa gama de funciones, incluyendo 2D y dibujo de grficos 3D,
Secure Sockets Layer (SSL), gestin de base de datos SQLite, reproduccin de audio y vdeo, mapa de bits y
vectores renderizacin de fuentes, el subsistema de visualizacin y capa grfica gestin y una
implementacin de la biblioteca del sistema estndar de C (libc).
94
En la prctica, el desarrollador tpica aplicacin Android acceder a estas bibliotecas nicamente a travs de
las API de bibliotecas centrales Android basados en Java. En el caso de que se necesita acceso directo a
estas bibliotecas, esto se puede lograr utilizando el Kit de Android Desarrollo nativo (NDK), el propsito de los
cuales es para llamar a los mtodos nativos de lenguajes de programacin no Java (tales como C y C ++) de
en el cdigo Java utilizando Java Native Interface (JNI).
Application Framework
El Application Framework es un conjunto de servicios que forman colectivamente el entorno en el que las
aplicaciones de Android se ejecutan y se gestionan. Este marco implementa el concepto de que las
aplicaciones de Android se construyen a partir de componentes reutilizables, intercambiables y
reemplazables. Este concepto se toma un paso ms en una aplicacin que tambin es capaz de publicar sus
capacidades junto con los datos correspondientes de forma que puedan ser encontrados y reutilizados por
otras aplicaciones.
El marco Android incluye los siguientes servicios principales:
Activity Manager - Controla todos los aspectos del ciclo de vida de la aplicacin y pila actividad.
Proveedores de Contenido - Permite que las aplicaciones para publicar y compartir datos con otras
aplicaciones.
Resource Manager - Proporciona acceso a recursos no cdigo incrustado tales como cuerdas, ajustes de
color y diseos de interfaz de usuario.
Notificaciones Gerente - Permite que las aplicaciones para mostrar alertas y notificaciones para el
usuario.
Vista System - Un conjunto extensible de puntos de vista que se utilizan para crear interfaces de usuario
de aplicaciones.
Package Manager - El sistema por el cual las aplicaciones son capaces de encontrar informacin acerca
de otras aplicaciones instaladas actualmente en el dispositivo.
Location Manager - Proporciona acceso a los servicios de localizacin que permiten una aplicacin para
recibir actualizaciones sobre cambios de ubicacin.
Aplicaciones
Situado en la parte superior de la pila de software Android son las aplicaciones. Estos comprenden tanto las
aplicaciones nativas proporcionadas con la aplicacin Android en particular (por ejemplo, aplicaciones de
navegador web y correo electrnico) y las aplicaciones de terceros instaladas por el usuario despus de la
compra del dispositivo.
95
Resumen
Una buena base de conocimientos de desarrollo de Android requiere una comprensin de la estructura
general de Android. Android se implementa en forma de una arquitectura de pila de software que consiste en
un ncleo de Linux, un entorno de ejecucin y las bibliotecas correspondientes, un marco de aplicacin y un
conjunto de aplicaciones. Las aplicaciones se escriben principalmente en Java y compiladas a formato de
cdigo de bytes en el Estudio Android construir medio ambiente. Cuando la aplicacin se instala
posteriormente en un dispositivo, este cdigo de bytes es compilado por el tiempo de ejecucin de Android
(TAR) para el formato nativo utilizado por la CPU. Los objetivos principales de la arquitectura de Android son
el rendimiento y la eficiencia, tanto en la ejecucin de aplicaciones y en la ejecucin de su reutilizacin en el
diseo de aplicaciones.
96
1 Actividades Android
2 Intentos Android
3 Intentos de difusin
4 Receptores Broadcast
5 Servicios de Android
6 Proveedores de Contenido
7 La aplicacin Manifiesto
8 de recursos de aplicaciones
9 contexto de aplicacin
10 Resumen
Actividades Android
Quienes estn familiarizados con los lenguajes de programacin orientados a objetos como Java, C ++ o C #
estarn familiarizados con el concepto de elementos de la funcionalidad de la aplicacin en clases que luego
son instanciados como objetos y manipuladas para crear una aplicacin de encapsulacin. Desde
aplicaciones Android estn escritos en Java, este sigue siendo mucho el caso.Android, sin embargo, tambin
toma el concepto de componentes reutilizables a un nivel superior.
Aplicaciones de Android son creados por reunir uno o ms componentes conocidos como Actividades. Una
actividad es un nico mdulo, independiente de la funcionalidad de la aplicacin que normalmente se
correlaciona
directamente
con
una
nica
pantalla
de
interfaz
de
usuario
su
funcionalidad
correspondiente. Una aplicacin nombramientos podra, por ejemplo, tiene una pantalla de actividad que
muestra las citas establecidas para el da actual. La aplicacin tambin puede utilizar una segunda actividad
que consiste en una pantalla en la que los nuevos nombramientos pueden ser ingresados por el usuario.
Las actividades estn pensadas como bloques completamente reutilizables e intercambiables de construccin
que pueden ser compartidos entre diferentes aplicaciones. Una aplicacin de correo electrnico existente, por
97
ejemplo, podra contener una actividad especficamente para redactar y enviar un mensaje de correo
electrnico. Un desarrollador podra estar escribiendo una aplicacin que tambin tiene la obligacin de enviar
un mensaje de correo electrnico. En lugar de desarrollar una actividad composicin de correo electrnico
especficamente para la nueva aplicacin, el desarrollador puede simplemente utilizar la actividad de la
aplicacin de correo electrnico existente.
Las actividades se crean como subclases de la clase Actividad Android y deben aplicarse de manera que sea
totalmente independiente de otras actividades en la aplicacin. En otras palabras, una actividad compartida
no puede confiar en ser llamado en un punto conocido en un flujo de programa (ya que otras aplicaciones
pueden hacer uso de la actividad de manera imprevista) y una actividad no puede llamar directamente
mtodos o datos de la instancia de acceso de otra actividad. Esto, en cambio, se consigue utilizando
Intenciones y proveedores de contenido.
Por defecto, una actividad no puede devolver resultados a la actividad de la que se invoc. Si se requiere esta
funcin, la actividad debe iniciarse especficamente como un sub-actividad de la actividad de origen.
Intentos Android
Intenciones son el mecanismo por el que una actividad es capaz de lanzar otro y poner en prctica el flujo a
travs de las actividades que componen una aplicacin. Intentos consisten en una descripcin de la operacin
a realizar y, opcionalmente, los datos sobre los que se va a realizar.
Intenciones puede ser explcita, en que solicitan la puesta en marcha de una actividad especfica haciendo
referencia a la actividad por nombre de la clase, o implcita al afirmar ya sea el tipo de accin a realizar o el
suministro de datos de un tipo especfico en el que la accin se va a realizar . En el caso de las intenciones
implcitas, el tiempo de ejecucin Android seleccionar la actividad para lanzar que ms se acerque a los
criterios especificados por la Intencin mediante un proceso conocido como la Resolucin Intencin.
Intentos de difusin
Otro tipo de intencin, la intencin de difusin, es una amplia intencin sistema que se enva a todas las
aplicaciones que se han registrado un Receptor Broadcast "interesados". El sistema Android, por ejemplo,
suelen enviar Broadcast Intenciones para indicar los cambios en el estado del dispositivo, tales como la
realizacin del sistema de puesta en marcha, la conexin de una fuente de alimentacin externa para el
dispositivo o la pantalla est encendido o apagado.
A Intencin de emisin puede ser normal (asncrono) en que se enva a todos los receptores de radiodifusin
interesadas en ms o menos el mismo tiempo, o orden en que se enva a un receptor en un momento en el
que se puede procesar y luego o bien abortado o permitido para ser pasado al siguiente receptor de
radiodifusin.
Receptores Broadcast
98
Receptores de difusin son el mecanismo por el cual las aplicaciones son capaces de responder a Broadcast
Intenciones. Un receptor de difusin debe ser registrada por una aplicacin y configurado con un filtro de
Intencin para indicar los tipos de emisin en la que est interesado. Cuando se emite una intencin a juego,
el receptor ser invocado por el tiempo de ejecucin de Android, independientemente de si la aplicacin que
ha registrado el receptor se est ejecutando actualmente. El receptor dispone de 5 segundos para completar
las tareas requeridas de l (como el lanzamiento de un servicio, por lo que las actualizaciones de datos o la
emisin de una notificacin al usuario) antes de regresar. Receptores de radiodifusin funcionar en segundo
plano y no tienen una interfaz de usuario.
Servicios de Android son procesos que se ejecutan en segundo plano y no tienen una interfaz de
usuario. Ellos se pueden iniciar y posteriormente gestionar desde actividades, receptores de radiodifusin u
otros servicios. Servicios para Android son ideales para situaciones en las que una aplicacin necesita para
continuar la realizacin de tareas, pero no necesariamente necesitan una interfaz de usuario que sea visible
para el usuario. Aunque Servicios carecen de una interfaz de usuario, que todava puede notificar al usuario
de eventos utilizando las notificaciones y tostadas (mensajes de notificacin pequeas que aparecen en la
pantalla sin interrumpir la actividad actualmente visible) y tambin son capaces de emitir Intenciones.
Los servicios se dan una mayor prioridad por el tiempo de ejecucin de Android que muchos otros procesos y
slo se terminarn como ltimo recurso por el sistema con el fin de liberar recursos. En el caso de que el
tiempo de ejecucin necesita para matar a un servicio, sin embargo, se reiniciar automticamente tan pronto
como los recursos adecuados una vez estn disponibles. Un servicio puede reducir el riesgo de extincin por
la que se declara a s mismo como tener que ejecutar en primer plano. Esto se logra haciendo una llamada a
startForeground (). Esto slo se recomienda para las situaciones en las que la terminacin sera perjudicial
para la experiencia del usuario (por ejemplo, si el usuario est escuchando el audio est transmitido por el
Servicio).
Ejemplo situaciones en que un servicio puede ser una solucin prctica incluyen, como se mencion
anteriormente, la transmisin de audio que debe seguir cuando la aplicacin ya no est activa, o una
aplicacin de seguimiento del mercado de valores que hay que notificar al usuario cuando una parte realiza
un precio determinado .
Proveedores de Contenido
Proveedores
de
contenido
implementar
un
mecanismo
para
el
intercambio
de
datos
entre
aplicaciones. Cualquier aplicacin puede proporcionar otras aplicaciones con acceso a los datos subyacentes
a travs de la implementacin de un proveedor de contenidos que incluye la posibilidad de aadir, eliminar y
99
consultar los datos (sujeto a permisos). El acceso a los datos se realiza a travs de un Universal Resource
Identifier (URI) definido por el proveedor de contenidos. Los datos pueden ser compartidos en forma de un
archivo o una base de datos SQLite entera.
Las aplicaciones nativas de Android incluyen una serie de proveedores de contenido estndar que permite
que las aplicaciones accedan a los datos, como contactos y archivos multimedia.
Los proveedores de contenidos disponibles en la actualidad en un sistema Android pueden localizarse
utilizando un Resolver contenido.
La aplicacin Manifiesto
El pegamento que rene los diferentes elementos que componen una aplicacin es el archivo de manifiesto
de aplicacin. Es dentro de este archivo basado en XML que la aplicacin se describen las actividades,
servicios, receptores de radiodifusin, proveedores de datos y los permisos que componen la solicitud
completa.
De recursos de aplicaciones
Adems del archivo de manifiesto y los archivos de Dex que contienen el cdigo de bytes, un paquete de
aplicaciones de Android ser tambin suelen contener una coleccin de archivos de recursos.Estos archivos
contienen recursos tales como las cadenas, imgenes, fuentes y colores que aparecen en la interfaz de
usuario junto con la representacin XML de los diseos de interfaz de usuario.De forma predeterminada,
estos archivos se almacenan en la res / subdirectorio de la jerarqua de la aplicacin del proyecto.
Contexto de aplicacin
Cuando se compila una aplicacin, se crea una clase llamada R que contiene referencias a los recursos de la
aplicacin. El archivo de manifiesto de aplicacin y estos recursos se combinan para crear lo que se conoce
como el contexto de aplicacin. Este contexto, representada por la clase Contexto Android, se puede utilizar
en el cdigo de la aplicacin para obtener acceso a los recursos de la aplicacin en tiempo de
ejecucin. Adems, una amplia gama de mtodos puede ser llamado en el contexto de una aplicacin para
recopilar informacin y realizar cambios en el medio ambiente de la aplicacin en tiempo de ejecucin.
Resumen
Un nmero de diferentes elementos se puede reuni con el fin de crear una aplicacin Android. En este
captulo, hemos proporcionado una descripcin de alto nivel de las actividades, servicios, los intentos y
receptores de radiodifusin, junto con un resumen de los recursos de archivos y aplicaciones
manifiestas. Reutilizacin mxima y la interoperabilidad son promovidos a travs de la creacin de mdulos
individuales, independientes de la funcionalidad en forma de actividades y las intenciones, mientras que el
100
intercambio de datos entre aplicaciones se consigue mediante la aplicacin de los proveedores de
contenidos.
Mientras que las actividades se centran en las reas donde el usuario interacta con la aplicacin (una
actividad que equivale esencialmente a una sola pantalla de interfaz de usuario), el proceso de fondo est
normalmente a cargo de servicios y receptores de radiodifusin.
Los componentes que constituyen la aplicacin se describen para el sistema de ejecucin de Android en un
archivo de manifiesto que, junto con los recursos de la aplicacin, representa el contexto de la aplicacin.
Mucho se ha cubierto en este captulo que es ms probable nuevo en el desarrollador promedio. Tenga la
seguridad, sin embargo, que una amplia exploracin y la utilizacin prctica de estos conceptos se harn en
los captulos siguientes para asegurar una base de conocimientos slida sobre la que construir sus propias
aplicaciones.
101
y Actividad
En los captulos anteriores hemos aprendido que las aplicaciones de Android se ejecutan dentro de los
procesos y que se componen de varios componentes en forma de actividades, servicios y receptores de
radiodifusin. El objetivo de este captulo es ampliar este conocimiento por mirar el ciclo de vida de
aplicaciones y actividades dentro del sistema de ejecucin Android.
Independientemente de la fanfarria sobre la cantidad de memoria y potencia de clculo reside en los
dispositivos mviles de hoy en da en comparacin con los sistemas de escritorio de ayer, es importante tener
en cuenta que estos dispositivos todava se consideran "recursos limitados" por las normas de la moderna
sistemas de escritorio y porttiles basados, sobre todo en trminos de memoria. Como tal, una
responsabilidad clave del sistema Android es asegurar que estos recursos limitados se gestionan con eficacia
y que tanto el sistema operativo y las aplicaciones que se ejecutan en l siguen siendo sensibles al usuario en
todo momento. Con el fin de lograr esto, Android se da un control total sobre el ciclo de vida y el estado tanto
de los procesos en los que se ejecutan las aplicaciones y los componentes individuales que comprenden esas
aplicaciones.
Un factor importante en el desarrollo de aplicaciones para Android, por lo tanto, es para obtener una
comprensin tanto de los modelos de gestin del ciclo de vida de la aplicacin y de la actividad de Android, y
las formas en que una aplicacin puede reaccionar a los cambios de estado que es probable que se le
impone en su curso de la vida ejecucin.
Contenido
5 La Actividad Pila
6 Actividad Unidos
7 cambios de configuracin
9 Resumen
102
Figura 10-1
103
Hosts un servicio que se ha indicado, a travs de una llamada a startForeground (), que la terminacin
sera perjudicial para la experiencia del usuario.
Hosts un Servicio de ejecucin sea su onCreate (), onResume () o onStart () devoluciones de llamada.
Los anfitriones de un receptor de difusin que se est ejecutando actualmente su mtodo OnReceive ().
Proceso Visible
Un proceso que contiene una actividad que es visible para el usuario, pero no es la actividad con la que el
usuario est interactuando se clasifica como un "proceso visible". Este es tpicamente el caso cuando una
actividad en el proceso es visible para el usuario, pero otra actividad, tal como una pantalla parcial o de
dilogo, est en primer plano. Un proceso tambin es elegible para el estado visible si se recibe un servicio
que es, en s, unido a una actividad visible o en primer plano.
Proceso de Servicio
Los procesos que contienen un servicio que ya se ha iniciado y en la actualidad se est ejecutando.
Proceso de fondo
Un proceso que contiene una o ms actividades que actualmente no estn visibles para el usuario, y no aloja
un servicio que califica para el servicio de estado de proceso. Los procesos que entran en esta categora se
encuentran en alto riesgo de extincin en caso de que la memoria adicional necesita ser liberado para los
procesos de mayor prioridad. Android mantiene una lista dinmica de los procesos de fondo, finalizar
procesos en orden cronolgico de tal manera que los procesos que eran los menos recientemente en el
primer plano se matan primero.
Proceso de vaco
Procesos vacos ya no contienen todas las aplicaciones activas y se mantienen en la memoria el momento de
servir como anfitriones para las aplicaciones recin lanzados. Esto es algo anlogo a mantener las puertas
abiertas y el motor en marcha en un autobs a la espera de los pasajeros que llegan. Tales procesos son,
obviamente, considera la prioridad ms baja y son los primeros en ser asesinados para liberar recursos.
104
lo tanto, que estas actividades tambin la transicin a travs de diferentes estados durante el tiempo de vida
ejecucin de una aplicacin. El estado actual de una actividad se determina, en parte, por su posicin en algo
que se llama la Actividad Pila.
La Actividad Pila
Para cada aplicacin que se ejecuta en un dispositivo Android, el sistema de ejecucin mantiene una
actividad Pila. Cuando se inicia una aplicacin, la primera de las actividades de la aplicacin para iniciarse se
coloca en la pila. Cuando se inicia una segunda actividad, se coloca en la parte superior de la pila y la
actividad anterior se empuja hacia abajo. La actividad en la parte superior de la pila se conoce como el (o
correr) actividad activo. Cuando la actividad salidas activas, se extraen de la pila por el tiempo de ejecucin y
la actividad situada inmediatamente debajo de ella en la pila se convierte en la actividad activo actual. Podra,
por ejemplo, porque la tarea para la que es responsable se ha completado La actividad en la parte superior de
la pila simplemente salir.Alternativamente, el usuario puede haber seleccionado un botn "Atrs" en la
pantalla para volver a la actividad anterior, haciendo que la actividad actual a estallar de la pila por el sistema
de tiempo de ejecucin y, por tanto, destruida. Una representacin visual de la Android Actividad Stack se
ilustra en la Figura 10-2:
Figura 10-2
Como se muestra en el diagrama, nuevas actividades son empujados a la parte superior de la pila cuando se
inician. La actividad activo actual est situado en la parte superior de la pila hasta que se empuja hacia abajo
o bien la pila por una nueva actividad, o apareci de la pila cuando sale o el usuario navega a la actividad
105
anterior. En el caso de que los recursos se vuelven restringido, el tiempo de ejecucin matar actividades,
empezando por los que estn en la parte inferior de la pila.
La Actividad Stack es lo que se conoce en la terminologa de programacin como-In-First-Out Last (LIFO) pila
en que el ltimo elemento que se inserta en la pila es el primero en ser hecho estallar apagado.
Actividad Unidos
Una actividad puede estar en uno de un nmero de diferentes estados durante el curso de su ejecucin
dentro de una aplicacin:
En pausa - La actividad es visible para el usuario, pero actualmente no tiene enfoque (normalmente
porque esta actividad est parcialmente oscurecida por la actividad activo corriente).Actividades en pausa
se mantienen en la memoria, permanecer unidos a el administrador de ventanas, conservar toda la
informacin de estado y rpidamente se puede restaurar al estado activo cuando se traslad a la parte
superior de la Actividad Pila.
Stopped - La actividad actualmente no es visible para el usuario (en otras palabras, est totalmente
oscurecida en la pantalla del dispositivo por otras actividades). Al igual que con las actividades en pausa,
se conserva toda la informacin de estado y miembro, pero est en mayor riesgo de extincin en
situaciones de poca memoria.
Muerto - La actividad ha sido terminado por el sistema de ejecucin con el fin de liberar memoria y ya no
est presente en la actividad Pila. Tales actividades deben reiniciar si es requerido por la aplicacin.
106
Resumen
Los dispositivos mviles son considerados normalmente como recurso limitado, sobre todo en trminos de
capacidad de memoria interna. En consecuencia, la responsabilidad primordial del sistema operativo Android
es asegurar que las aplicaciones y el sistema operativo en general, siguen siendo sensibles al usuario.
Las solicitudes se reciben en Android dentro de los procesos. Cada aplicacin, a su vez, est formado por los
componentes en forma de actividades y servicios.
El sistema de ejecucin Android tiene el poder para poner fin a los procesos y actividades individuales con el
fin de liberar memoria. Se toma el estado del proceso en consideracin por el sistema de ejecucin de la hora
de decidir si un proceso es un candidato adecuado para la terminacin. El estado de un proceso depende en
gran medida del estado de las actividades organizadas por ese proceso.
El mensaje clave de este captulo es que una aplicacin se mueve a travs de una variedad de estados
durante su vida til de ejecucin y tiene muy poco control sobre su destino dentro del entorno de ejecucin de
Android. Esos procesos y actividades que no estn interactuando directamente con el usuario corren un
mayor riesgo de rescisin por parte del sistema de ejecucin. Un elemento esencial de desarrollo de
aplicaciones de Android, por lo tanto, consiste en la capacidad de una aplicacin para responder a las
notificaciones de cambio de estado desde el sistema operativo, un tema que se trata en el captulo siguiente.
107
1 La clase de actividad
4 Actividad Vidas
5 Resumen
La Clase de Actividad
Con pocas excepciones, las actividades en una aplicacin se crean como subclases de la clase, ya sea
Actividad Android, o de otra clase que es, en s, una subclase de la clase de actividad (por ejemplo, las clases
ActionBarActivity o FragmentActivity).
Consideremos, por ejemplo, el proyecto AndroidSample sencillo creado en Creacin de una aplicacin para
Android Ejemplo en Android Studio. Cargue este proyecto en el entorno Android Studio y busque el archivo
AndroidSampleActvity.java (ubicado en aplicacin -> Java -> com.ebookfrenzy.androidsample). Despus de
haber localizado el archivo, haga doble clic en l para cargarlo en el editor de donde se leer como sigue:
com.ebookfrenzy.androidsample paquete;
108
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
public class AndroidSampleActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_android_sample);
}
@ Override
public boolean onCreateOptionsMenu (men Men) {
// Inflar el men; esto agrega elementos a la barra de accin si est presente.
. getMenuInflater () inflar (R.menu.android_sample, men);
return true;
}
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
// Elemento de la barra de accin de la manija hace clic aqu. La barra de accin
ser
// Manejar automticamente los clics en el botn / Subir Inicio, siempre
// Como se especifica una actividad principal en AndroidManifest.xml.
int id = item.getItemId ();
si (id == R.id.action_settings) {
return true;
}
volver super.onOptionsItemSelected (punto);
}
}
Cuando se cre el proyecto, instruimos Android Studio tambin para crear una actividad inicial llamado
AndroidSampleActivity. Como es evidente por el cdigo anterior, la clase AndroidSampleActivity se extiende,
y por lo tanto es una subclase de la clase ActionBarActivity.
Una revisin de la documentacin de referencia para la clase ActionBarActivity revelara que ella misma es
una subclase de la clase de actividad. Esto se puede verificar en el editor de Android Studio usando la
ventana de herramientas Jerarqua. Con el archivo AndroidSampleActivity.java cargado en el editor, haga clic
en ActionBarActivity en la lnea de declaracin de la clase pblica y presionar la combinacin de teclas CtrlH. La ventana de herramientas jerarqua posteriormente aparecer mostrando la jerarqua de clases de la
clase seleccionada. Como se ilustra en la Figura 11-1, ActionBarActivity est claramente una subclase de la
clase FragmentActivity que es en s misma una subclase de la clase Actividad:
109
Figura 11-1
Esto plantea la pregunta de por qu se utiliza en lugar de la clase Actividad ActionBarActivity. La razn de
esto se remonta a las selecciones realizadas cuando el proyecto fue creado primero. Al elegir los objetivos
versin SDK para el proyecto en el captulo Creacin de una aplicacin Android en Android Ejemplo de
estudio, el proyecto se ha configurado para apuntar a un nivel mnimo de SDK API 8: Android 2.2. Desde la
introduccin de Android 3.0, sin embargo, las solicitudes han incluido una vista Barra de acciones en la parte
superior de la pantalla, que ofrece opciones de men y la informacin al usuario. El propsito de la clase
ActionBarActivity es hacer de esta Barra de acciones disponibles para las aplicaciones que se requieren para
funcionar en las versiones anteriores de Android y se incluye como parte de la biblioteca de soporte
android.support.v7. Si hubiramos especificamos API 11: Android 3.0 o posterior como el SDK mnimo para el
proyecto AndroidSample, sin embargo, la actividad habra sido declarada como no habra sido necesaria una
subclase de la clase de actividad en lugar de ActionBarActivity ya la compatibilidad hacia atrs para la Barra
de acciones.
La clase de actividad y sus subclases contienen una serie de mtodos que estn destinados a ser llamado
por el tiempo de ejecucin de Android para notificar una actividad que su estado est cambiando. A los
efectos de este captulo, nos referiremos a estos como los mtodos de la actividad del ciclo de vida. Una
clase de actividad simplemente necesita reemplazar estos mtodos e implementar la funcionalidad necesaria
dentro de ellos con el fin de reaccionar en consecuencia a los cambios de estado.
Uno de estos mtodos es el nombre onCreate () y, dando vuelta una vez ms al fragmento de cdigo anterior,
podemos ver que este mtodo ya ha sido anulado y puesto en prctica por nosotros en la clase
AndroidSampleActivity. En una seccin posterior vamos a explorar en detalle tanto onCreate () y los otros
mtodos de ciclo de vida pertinentes de la clase de actividad.
110
111
onCreate (Bundle savedInstanceState) - El mtodo que se llama cuando se crea por primera vez la
actividad y el lugar ideal para la mayora de tareas de inicializacin a realizar. El mtodo se pasa un
argumento en la forma de un objeto Bundle, que puede contener informacin de estado dinmico
(tpicamente en relacin con el estado de la interfaz de usuario) de una invocacin antes de la actividad.
onRestart () - Se llama cuando la actividad est a punto de reiniciar despus de haber sido previamente
detenido por el sistema de ejecucin.
onStart () - Siempre llam inmediatamente despus de la llamada a los mtodos onCreate () o onRestart
(), este mtodo indica que la actividad que se est a punto de llegar a ser visibles para el usuario. Esta
convocatoria ser seguido por una llamada a onResume () si la actividad se traslada a la parte superior de
la pila de la actividad, o OnStop () en el caso de que se empuja hacia abajo la pila por otra actividad.
onResume () - Indica que la actividad se encuentra ahora en la parte superior de la pila de actividad y es
la actividad con la que el usuario est actualmente interactuando.
onPause () - Indica que una actividad anterior est a punto de convertirse en la actividad de primer
plano. Esta convocatoria ser seguido por una llamada al mtodo ya sea la onResume () o OnStop () en
funcin de si la actividad se mueve de nuevo al primer plano o se vuelve invisible para el usuario. Se
deben tomar medidas dentro de este mtodo para almacenar datos persistentes requeridos por la
actividad (por ejemplo, los datos almacenados a un proveedor de contenido, base de datos o
archivo). Este mtodo tambin debe garantizar que las tareas intensivas de la CPU como la animacin se
detienen.
OnStop () - La actividad ya no es visible para el usuario. Los dos escenarios posibles que pueden seguir
esta convocatoria son un llamado a onRestart () en el caso de que la actividad se mueve al primer plano
de nuevo, o OnDestroy () si se termina la actividad.
OnDestroy () - La actividad est a punto de ser destruido, ya sea voluntariamente porque la actividad ha
completado sus tareas y ha llamado el mtodo de acabado () o debido a que el tiempo de ejecucin est
terminando ya sea para liberar memoria o debido a un cambio en la configuracin (como el orientacin del
cambio de dispositivo). Es importante tener en cuenta que no siempre se realiza una llamada a OnDestroy
() cuando se termina una actividad.
Adems de los mtodos de ciclo de vida descritos anteriormente, hay dos mtodos destinados
especficamente para guardar y restaurar el estado dinmico de una actividad:
112
que tiene ms sentido para restaurar un estado anterior despus de la inicializacin de la actividad se ha
realizado en onCreate () y onStart ().
onSaveInstanceState (Bundle outstate) - Llamado antes de que se destruy una actividad para que el
estado dinmico actual (por lo general en relacin con la interfaz de usuario) puede ser salvado. El
mtodo se pasa el objeto Bundle en la que el Estado debe ser salvado y que se pasa posteriormente a
travs de la onCreate () y onRestoreInstanceState () mtodos cuando se reinicia la actividad. Tenga en
cuenta que este mtodo slo es llamado en situaciones en las que el tiempo de ejecucin comprueba que
estado dinmico necesita ser salvado.
Al reemplazar los mtodos anteriores en una actividad, es importante recordar que con la excepcin de
onRestoreInstanceState () y onSaveInstanceState (), el mtodo de aplicacin debe incluir una llamada al
mtodo correspondiente en la sper clase de actividad. Por ejemplo, el siguiente mtodo reemplaza el
mtodo onRestart (), pero tambin incluye un llamado a la instancia superclase del mtodo:
protegida onRestart void () {
super.onRestart ();
Log.i (TAG, "onRestart");
}
Si no se hace esta llamada superclase en anulaciones mtodo dar lugar a la ejecucin lanzar una excepcin
durante
la
ejecucin
de
la
actividad. Mientras
que
las
llamadas
los
super
clase
en
el
Vidas Actividad
El ltimo tema a cubrir implica un esquema de todo, visibles y en primer plano los cursos de la vida a travs
del cual una actividad ser la transicin durante la ejecucin:
Todo el curso de la vida - El trmino "toda la vida" se utiliza para describir todo lo que ocurre dentro de
una actividad entre la llamada inicial al mtodo onCreate () y la llamada a OnDestroy () antes de la
terminacin de la actividad.
Lifetime Visible - Cubre los perodos de ejecucin de una actividad entre la llamada a onStart () y OnStop
(). Durante este perodo la actividad es visible para el usuario, aunque puede no ser la actividad con la
que el usuario est actualmente interactuando.
Lifetime primer plano - Se refiere a los perodos de ejecucin entre llamadas a la onResume () y
onPause () mtodos.
Es importante sealar que una actividad puede pasar a travs del primer plano y visibles vidas varias veces
durante el transcurso de toda la vida til.
Los conceptos de vidas y los mtodos de ciclo de vida se ilustran en la Figura 11-2:
113
Figura 11-2
Resumen
Todas las actividades se derivan de la clase Actividad Android, que, a su vez, contiene una serie de mtodos
de evento que estn diseados para ser llamado por el sistema de ejecucin cuando el estado de un cambio
de actividad. Por imperiosas de estos mtodos, una actividad puede responder a los cambios de estado y, en
su caso, adoptar las medidas para salvar y restaurar el estado actual de la actividad y la aplicacin. Estado de
actividad se puede considerar como tomar dos formas. El estado persistente se refiere a los datos que
necesita ser almacenada entre invocaciones de la aplicacin (por ejemplo, a un archivo o base de
datos). Estado dinmico, por otro lado, se refiere en cambio a la aparicin actual de la interfaz de usuario.
En este captulo, hemos puesto de relieve los mtodos de ciclo de vida a disposicin de las actividades y se
cubre el concepto de vida til de actividad. En el siguiente captulo, titulado Actividad Android Estado Cambios
- Un ejemplo de aplicacin, vamos a implementar una aplicacin de ejemplo que pone gran parte de esta
teora a la prctica.
114
5 Ejecutar la aplicacin
7 Resumen
de
una
actividad
en
blanco
denominada
StateChangeActivity
un
diseo
llamado
115
Una vez finalizado el proceso de creacin del proyecto, el proyecto StateChange debe aparecer en la ventana
de herramientas Proyecto ubicado a lo largo del borde izquierdo de la ventana principal de Android Studio con
el archivo de diseo activity_state_change.xml precargado en el Diseador como se ilustra en la Figura 12 -1:
Figura 12-1
La siguiente accin a tomar implica el diseo de la interfaz de usuario para la actividad. Esto se almacena en
un archivo llamado activity_state_change.xml que ya debe estar cargado en la herramienta Designer. Si no lo
es, una forma de acceder a este fichero es la de navegar hacia l en la ventana de herramientas del proyecto
donde se puede encontrar en la aplicacin -> res -> carpeta de presentacin. Una vez localizado, haga doble
clic en el archivo se cargar en la herramienta Android Studio Designer. Una opcin ms rpida, sin embargo,
es utilizar el acceso directo Ir al editor de la declaracin, cuyo propsito es que le llevar directamente al
archivo y la ubicacin en la que se declara el elemento seleccionado actualmente en la ventana del editor.
En este caso, el diseo activity_state_change se hace referencia en el mtodo onCreate () del archivo
StateChangeActivity.java (ubicado en el panel de proyecto en el marco de aplicaciones -> Java ->
com.ebookfrenzy.statechange):
116
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_state_change);
}
Para abrir el archivo en el Diseador, haga clic en la referencia activity_state_change para que resalta y pulse
la secuencia de atajo de teclado Ctrl-B. Android Studio abra el archivo activity_state_change.xml en la
herramienta Diseador listo para el trabajo de diseo para comenzar.
Figura 12-2
Observe que el icono de la bombilla ha aparecido junto a la vista lo que indica que la asistencia est
disponible para nosotros en la configuracin de este componente. Cuando se trabaja con vistas EditText en
una interfaz de usuario de Android, es necesario declarar el tipo de entrada para la vista. Esto simplemente
define el tipo de texto o datos que sern introducidos por el usuario. Por ejemplo, si el tipo de entrada est
117
establecido en el telfono, el usuario se limitar a entrar dgitos numricos en la vista. Alternativamente, si el
tipo
de
entrada
est
establecido
en
TextCapCharacters,
la
entrada
ser
por
defecto
Figura 12-3
Desde el dilogo Establecer valor de atributo resultante, seleccione la opcin de texto desde el men
desplegable.
El paso final en el proceso de diseo de la interfaz de usuario es aumentar la anchura del componente
TextView. Con el componente seleccionado en el diseo, desplcese por la lista de atributos en el panel
Propiedades hasta que el atributo width est a la vista e introduzca un valor de 200dp como se indica en la
Figura 12-4:
118
Figura 12-4
com.ebookfrenzy.statechange paquete;
119
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
@ Override
public boolean onCreateOptionsMenu (men Men) {
// Inflar el men; esto agrega elementos a la barra de accin si est presente.
. getMenuInflater () inflar (R.menu.menu_state_change, men);
return true;
}
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
// Elemento de la barra de accin de la manija hace clic aqu. La barra de accin
ser
// Manejar automticamente los clics en el botn / Subir Inicio, siempre
// Como se especifica una actividad principal en AndroidManifest.xml.
int id = item.getItemId ();
si (id == R.id.action_settings) {
return true;
}
volver super.onOptionsItemSelected (punto);
}
}
Hasta ahora el nico mtodo del ciclo de vida se reemplaza por la actividad es el mtodo onCreate () que se
ha aplicado para llamar la instancia superclase del mtodo antes de configurar la interfaz de usuario para la
actividad. Ahora vamos a modificar este mtodo de forma que produzca un mensaje de diagnstico en el
panel Android Estudio LogCat cada vez que se ejecuta. Para ello, vamos a utilizar la clase de registro, el cual
requiere que importamos android.util.Log y declaramos una etiqueta que nos permitir filtrar estos mensajes
en la salida del registro:
com.ebookfrenzy.statechange paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
120
android.view.Menu importacin;
android.view.MenuItem importacin;
android.util.Log importacin;
public class StateChangeActivity extiende ActionBarActivity {
esttica TAG final String privada = "com.ebookfrenzy.StateChange";
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_state_change);
Log.i (TAG, "onCreate");
}
.
.
.
}
La siguiente tarea es reemplazar algunos ms mtodos, cada uno que contiene una llamada de registro
correspondiente. Estos mtodos de anulacin se pueden aadir manualmente o generados utilizando el AltInsert atajo de teclado como se indica en el captulo titulado Los fundamentos del Android Estudio Editor de
cdigo. Tenga en cuenta que el registro de llamadas todava tendr que aadir manualmente si los mtodos
se generan automticamente:
@ Override
protegida onStart void () {
super.onStart ();
Log.i (TAG, "onStart");
}
@ Override
protected void onResume () {
super.onResume ();
Log.i (TAG, "onResume");
}
@ Override
protegida onPause void () {
super.onPause ();
Log.i (TAG, "onPause");
}
@ Override
protegida OnStop void () {
super.onStop ();
Log.i (TAG, "OnStop");
}
@ Override
protegida onRestart void () {
121
super.onRestart ();
Log.i (TAG, "onRestart");
}
@ Override
protegida OnDestroy void () {
super.onDestroy ();
Log.i (TAG, "OnDestroy");
}
@ Override
protected void onSaveInstanceState (Bundle outstate) {
super.onSaveInstanceState (outstate);
Log.i (TAG, "onSaveInstanceState");
}
@ Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
super.onRestoreInstanceState (savedInstanceState);
Log.i (TAG, "onRestoreInstanceState");
}
Figura 12-5
122
En el cuadro de dilogo Nuevo filtro Logcat Crear (Figura 12-6), el nombre del ciclo de vida del filtro y, en el
campo por Tag Iniciar (regex), introduzca el valor declarado en la etiqueta StateChangeActivity.java (en el
ejemplo de cdigo anterior se trataba de com.ebookfrenzy .StateChange pero pueden haber cambiado esto
para reflejar la URL de su empresa).
Figura 12-6
Cuando los cambios se hayan completado, haga clic en el botn Aceptar para crear el filtro y cerrar el
dilogo. En vez de enumerar Sin filtros, el filtro recin creado ahora debe ser seleccionado en la ventana de
herramientas Android.
Ejecutar la aplicacin
Para obtener resultados ptimos, la aplicacin debe ejecutarse en un dispositivo Android fsica, cuyos detalles
se pueden encontrar en el captulo titulado Aplicaciones Prueba de Android en un dispositivo Android fsico
con ADB. Con el dispositivo configurado y conectado al equipo de desarrollo, haga clic en el botn de
ejecucin representado por un tringulo verde ubicado en la barra de herramientas de Android Studio como
se muestra en la Figura 12-7 a continuacin, seleccione Ejecutar -> opcin Ejecutar ... del men o utilizar las
teclas Shift + F10 atajo de teclado:
Figura 12-7
123
Seleccione el dispositivo Android fsica del dispositivo de dilogo Elija si aparece (suponiendo que no lo ha
configurado para ser el blanco por defecto). Despus de Android Studio ha incorporado la aplicacin e
instalado en el dispositivo debe poner en marcha y se ejecuta en segundo plano.
Una revisin del panel LogCat debe indicar que hasta el momento se han desencadenado mtodos (teniendo
cuidado para asegurarse de que se selecciona el filtro del ciclo de vida creado en la seccin anterior para
filtrar los eventos de registro que no son actualmente de inters para nosotros):
Figura 12-8
Claramente, los cambios iniciales estatales son exactamente como se indica en la Figura 9 2. Tenga en
cuenta, sin embargo, que una llamada no se hizo para onRestoreInstanceState (), ya que el tiempo de
ejecucin Android detect que no haba estado para restaurar en esta situacin.
Toque en el icono Inicio en la barra de estado inferior de la pantalla del dispositivo y tenga en cuenta la
secuencia de llamadas a mtodos reportados en el registro de la siguiente manera:
onPause
onSaveInstanceState
OnStop
En este caso, el tiempo de ejecucin se ha dado cuenta de que la actividad ya no est en el primer plan o es,
no es visible para el usuario y se ha detenido la actividad, pero no sin dar una oportunidad para que la
actividad para salvar el estado dinmico. Dependiendo de si el tiempo de ejecucin en ltima instancia,
destruy la actividad o simplemente reinicia ella, la actividad o bien se notificar que se ha reiniciado a travs
de una llamada a onRestart () o pasar a travs de la secuencia de creacin de nuevo cuando el usuario
vuelve a la actividad.
124
Como se indica en Descripcin Aplicacin para Android y Actividad Ciclos de vida, la destruccin y la
reconstruccin de la actividad pueden ser provocados por hacer un cambio de configuracin en el dispositivo,
tales como la rotacin de vertical a horizontal. Para ver esto en accin, simplemente gire el dispositivo
mientras la aplicacin StateChange est en primer plano. Cuando se utiliza el emulador, rotacin dispositivo
puede ser simulado utilizando el atajo de teclado Ctrl-F12 o pulsando el nmero 7 en el teclado teclado
mientras Bloq Num est desactivado. La secuencia resultante de llamadas a mtodos en el registro queda
redactado como sigue:
onPause
onSaveInstanceState
OnStop
OnDestroy
onCreate
onStart
onRestoreInstanceState
En resumen
Es evidente que el sistema de ejecucin ha dado la actividad una oportunidad para salvar el estado antes de
ser destruidas y renovadas.
Resumen
El viejo adagio de que una imagen vale ms que mil palabras tiene tan cierto para los ejemplos en el
aprendizaje de un nuevo paradigma de programacin. En este captulo, hemos creado un ejemplo de
aplicacin de Android con el fin de demostrar los diferentes estados del ciclo de vida a travs del cual es
probable que pase una actividad. En el transcurso del desarrollo del proyecto en este captulo, tambin
observamos un mecanismo para generar informacin de diagnstico de registro desde dentro de una
actividad.
En el prximo captulo, vamos a ampliar el proyecto de ejemplo StateChange para demostrar cmo guardar y
restaurar el estado dinmico de una actividad.
125
3 La Clase Bundle
4 Guardar el Estado
6 Prueba de la aplicacin
7 Resumen
126
Inicie la aplicacin StateChange una vez ms, esta vez de entrar en algn texto en el campo EditarTexto
antes de realizar la rotacin del dispositivo. Despus de haber girado el dispositivo, la siguiente secuencia de
cambio de estado debe aparecer en la ventana LogCat:
onPause
onSaveInstanceState
OnStop
OnDestroy
onCreate
onStart
onRestoreInstanceState
En resumen
Es evidente que esto ha dado lugar a la actividad que se destruyeron y re-creado. Una revisin de la interfaz
de usuario de la aplicacin en ejecucin, sin embargo, debe mostrar que el texto introducido en el campo
EditarTexto se ha conservado. Teniendo en cuenta que la actividad fue destruido y recreado, y que no
aadimos ningn cdigo especfico para asegurarse de que el texto se ha guardado y restaurado, este
comportamiento requiere alguna explicacin.
En realidad la mayora de los widgets de visin incluidas en el SDK de Android ya implementan el
comportamiento necesario para salvar y restaurar el estado de forma automtica cuando se reinicia una
actividad. El nico requisito para que este comportamiento es que el onSaveInstanceState () y
onRestoreInstanceState () mtodos de anulacin de la actividad para incluir las llamadas a los mtodos
equivalentes de la super clase:
@ Override
protected void onSaveInstanceState (Bundle outstate) {
super.onSaveInstanceState (outstate);
}
@ Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
super.onRestoreInstanceState (savedInstanceState);
}
El ahorro automtico de Estado para una vista de la interfaz de usuario se puede desactivar en el archivo de
diseo XML configurando el androide: propiedad saveEnabled false. A los efectos de un ejemplo, vamos a
desactivar el mecanismo automtico de ahorro de Estado para la vista EditarTexto en el diseo de la interfaz
de usuario y luego agregar cdigo a la aplicacin para guardar manualmente y restaurar el estado de la vista.
Para configurar la vista EditarTexto tal que el estado no se guardar y restaurada en el caso de que se
reinicie la actividad, edite el archivo activity_state_change.xml para que la entrada para la vista dice lo
siguiente (tenga en cuenta que el XML se puede editar directamente haciendo clic en la ficha Texto en el
borde inferior del panel Designer):
<EditarTexto
android: layout_width = "wrap_content"
127
android:
android:
android:
android:
android:
android:
android:
layout_height = "wrap_content"
id = "@ + / Identificacin del EditarTexto"
saveEnabled = "false"
InputType = "text"
layout_centerVertical = "true"
layout_centerHorizontal = "true"
width = "200dp" />
Despus de hacer el cambio, ejecute la aplicacin, introducir texto y girar el dispositivo para comprobar que el
texto ya no se guarda y se restaura antes de proceder.
La Clase Bundle
Para situaciones en las que el estado necesita para ser salvo ms all de la funcionalidad predeterminada
proporcionada por los componentes de interfaz de usuario, la clase Bundle proporciona un contenedor para el
almacenamiento de datos utilizando un mecanismo par clave-valor. Las teclas tienen la forma de valores de
cadena, mientras que los valores asociados con esas llaves pueden ser en forma de un valor simple o
cualquier objeto que implemente la interfaz de Android parcelable. Una amplia gama de clases ya implementa
la interfaz parcelable. Clases personalizadas se pueden hacer "parcelable" mediante la aplicacin del
conjunto de los mtodos definidos en la interfaz parcelable (cuyos detalles se pueden encontrar en la
documentacin de Android enhttp://developer.android.com/reference/android/os/Parcelable.html ).
La clase Bundle tambin contiene un conjunto de mtodos que se pueden utilizar para obtener y definir pares
clave-valor para una variedad de tipos de datos que incluye los dos tipos primitivos (incluyendo Boole, char,
doble y flotar valores) y objetos (tales como cadenas y CharSequences ).
A los efectos de este ejemplo, y despus de haber desactivado el ahorro automtico de texto para la vista
EditarTexto, tenemos que asegurarnos de que el texto introducido en el campo EditarTexto por el usuario se
guarda en el objeto Bundle y posteriormente restaurada. Esto servir como una demostracin de cmo
guardar manualmente y restaurar el estado dentro de una aplicacin para Android y ser logrado me diante el
putCharSequence () y getCharSequence () de la clase Bundle respectivamente.
Guardar el Estado
El primer paso en la ampliacin de la aplicacin StateChange es asegurarse de que el texto introducido por el
usuario se extrae del componente EditarTexto dentro del mtodo onSaveInstanceState () de la actividad
StateChangeActivity, y luego guarda como un par clave-valor en el objeto Bundle.
Con el fin de extraer el texto del objeto EditarTexto primero tenemos que identificar dicho objeto en la interfaz
de usuario. Evidentemente, se trata de salvar la distancia entre el cdigo Java para la actividad (que figura en
el archivo de cdigo fuente StateChangeActivity.java) y la representacin XML de la interfaz de usuario (que
figura en el archivo de recursos activity_state_change.xml). Con el fin de extraer el texto introducido en el
componente de EditarTexto que necesitamos para obtener acceso a dicho objeto de interfaz de usuario.
Cada componente dentro de un interfaz de usuario ha asociado un identificador nico. De forma
predeterminada, la herramienta Diseador construye el ID para un componente recin aadida por el tipo de
objeto. Si ms de una vista del mismo tipo est contenida en la disposicin el nombre del tipo es seguido de
128
un nmero secuencial (aunque esto puede, y debe, ser cambiado a algo ms significativo por el
promotor). Como se puede ver marcando el panel de componentes dentro de la ventana principal de Android
Studio cuando se selecciona el archivo activity_state_change.xml y la herramienta Diseador mostrada, el
componente EditarTexto se ha asignado el ID EditarTexto:
Figura 13-1
Como se indica en el captulo titulado La Anatoma de una aplicacin Android, todos los recursos que
componen una aplicacin se compilan en una clase denominada R. Entre esos recursos son los que definen
los diseos, incluyendo el diseo de nuestra actividad actual. Dentro de la clase R es una subclase llamada
diseo, que contiene los recursos de diseo, y dentro de esa subclase es nuestro diseo
activity_state_change. Con este conocimiento, podemos hacer una llamada al mtodo findViewById () de
nuestra actividad objeto de obtener una referencia al objeto EditarTexto de la siguiente manera:
textBox EditarTexto final = (EditarTexto) findViewById (R.id.editText);
Despus de haber obtenido una referencia al objeto EditarTexto y asignado al cuadro de texto que ahora
podemos obtener el texto que contiene llamando al mtodo del objeto getText (), que, a su vez, devuelve el
texto actual en la forma de un objeto CharSequence:
CharSequence usertext = textBox.getText ();
Por ltimo, podemos guardar el texto utilizando el mtodo del objeto Bundle putCharSequence (), pasando a
travs de la clave (puede ser cualquier valor de cadena, pero en este caso, la declararemos como
"savedText") y el objeto usertext como argumentos:
outState.putCharSequence ("savedText", usertext);
modificado onSaveInstanceState
() en el archivo
129
android.os.Bundle importacin;
android.util.Log importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.EditText importacin;
public class StateChangeActivity extiende ActionBarActivity {
.
.
.
protected void onSaveInstanceState (Bundle outstate) {
super.onSaveInstanceState (outstate);
Log.i (TAG, "onSaveInstanceState");
textBox definitiva EditarTexto =
(EditarTexto) findViewById (R.id.editText);
CharSequence usertext = textBox.getText ();
outState.putCharSequence ("savedText", usertext);
}
.
.
.
Ahora que se han tomado medidas para salvar el estado, la siguiente fase es asegurar que se restaura
cuando sea necesario.
130
Prueba de la aplicacin
Todo lo que queda es una vez ms para generar y ejecutar la aplicacin StateChange. Una vez en ejecucin
y en el primer plano, toque el componente EditarTexto e introduzca algn texto antes de girar el dispositivo a
otra orientacin. Mientras que se perdieron previamente el texto cambia, el nuevo texto se mantiene dentro de
los componentes EditarTexto gracias al cdigo que hemos aadido a la actividad en este captulo.
Resumen
El ahorro y la restauracin del estado dinmico en una aplicacin Android es simplemente una cuestin de la
aplicacin del cdigo apropiado en los mtodos de ciclo de vida adecuadas. Para la mayora de los puntos de
vista de la interfaz de usuario, esto se maneja de forma automtica por la sper clase de actividad. En otros
casos, esto normalmente consiste en extraer los valores y ajustes en el mtodo onSaveInstanceState () y
guardar los datos como pares de valores clave dentro del objeto Bundle pasado a travs de la actividad por el
sistema de ejecucin.
Estado se puede restaurar ya sea en el onCreate () o la onRestoreInstanceState () de la actividad de
extraccin de valores desde el objeto Bundle y la actualizacin de la actividad basndose en los valores
almacenados.
En este captulo, hemos utilizado estas tcnicas para actualizar el proyecto StateChange de modo que la
actividad conserva cambios a travs de la destruccin y posterior reconstruccin de una actividad.
131
4 El Ver Jerarqua
6 Resumen
132
LinearLayout - Posiciones nio vistas en una sola fila o columna en funcin de la orientacin
seleccionada. Un valor de peso se puede establecer en cada nio para especificar la cantidad de espacio
de diseo ese nio debe ocupar en relacin con otros nios.
TableLayout - Organiza visitas del nio en un formato de cuadrcula de filas y columnas. Cada fila dentro
de una tabla est representado por un nio objeto TableRow, que, a su vez, contiene un objeto de vista
para cada celda.
133
gravedad center_vertical en un nio har que se coloque en el centro vertical de la vista que contiene
FrameLayout.
AbsoluteLayout - Permite vistas nio para ser colocados en X e Y las coordenadas especfica dentro de
la vista de diseo que contiene. El uso de este diseo se desaconseja ya que carece de la flexibilidad
necesaria para responder a los cambios en el tamao y la orientacin de la pantalla.
Al considerar el uso de diseos de la interfaz de usuario de una aplicacin Android vale la pena tener en
cuenta que, como se indica en la siguiente seccin, se pueden anidar dentro de s para crear un diseo de
interfaz de usuario de casi cualquier nivel necesario de complejidad.
La vista Jerarqua
Cada vista en una interfaz de usuario representa un rea rectangular de la pantalla. Una vista es responsable
de lo que est dibujado en ese rectngulo y para responder a eventos que ocurren dentro de la parte de la
pantalla (como un evento de contacto).
Una pantalla de interfaz de usuario se compone de una jerarqua de vistas con una vista raz colocado en la
parte superior de las vistas de rbol y el nio posicionado en las ramas de abajo. El hijo de un contenedor de
vista aparece en la parte superior de su vista padre y est obligado a aparecer dentro de los lmites del rea
de visualizacin de la vista padre. Consideremos, por ejemplo, la interfaz de usuario ilustrada en la
Figura 14-1:
134
Figura 14-1
Adems de las vistas visibles los botones y casillas de verificacin, la interfaz de usuario realmente incluye
una serie de puntos de vista de diseo que controlan cmo se posicionan las vistas visibles.Figura 14-2
muestra una visin alternativa de la interfaz de usuario, esta vez destacando la presencia de las vistas de
diseo en relacin con los puntos de vista del nio:
Figura 14-2
Como se discuti anteriormente, las interfaces de usuario estn construidas en forma de una jerarqua de
135
vistas con una vista de la raz en la parte superior. Siendo este el caso, tambin puede visualizar el ejemplo
de interfaz de usuario anterior en forma de rbol vista ilustrada en la Figura 14-3:
Figura 14-3
El diagrama de vista de jerarqua da probablemente el panorama ms claro de la relacin entre los diversos
puntos de vista que componen la interfaz de usuario se muestra en la Figura 14-1.Cuando se muestra una
interfaz de usuario para el usuario, el tiempo de ejecucin Android camina la jerarqua de vistas, a partir de la
opinin de la raz y de trabajo por el rbol, ya que hace que cada vista.
Resumen
Cada elemento dentro de una pantalla de interfaz de usuario de una aplicacin Android es una vista que se
subclase en ltima instancia de la clase android.view.View. Cada vista representa un rea rectangular de la
pantalla del dispositivo y es responsable tanto de lo que aparece en ese rectngulo y para el manejo de
eventos que tienen lugar dentro de los lmites de la vista. Mltiples puntos de vista pueden ser combinados
136
para crear una sola vista compuesta. Los puntos de vista dentro de una vista compuesta son hijos de un
contenedor de vista que en general es una subclase de android.view.ViewGroup (que es en s misma una
subclase de android.view.View). Una interfaz de usuario est compuesta de puntos de vista construidos en la
forma de una jerarqua de vistas.
El SDK de Android incluye una gama de puntos de vista pre-construidos que se pueden utilizar para crear una
interfaz de usuario. Estos incluyen componentes bsicos tales como campos de texto y botones, adems de
una serie de gestores de diseo que se pueden utilizar para controlar el posicionamiento de puntos de vista
del nio. En el caso de que las opiniones suministrados no cumplen con un requisito especfico, vistas
personalizadas se pueden crear, ya sea mediante la ampliacin o la combinacin de vistas existentes, o
subclases android.view.View y la creacin de una nueva clase de vista.
Las interfaces de usuario pueden ser creados usando la herramienta Android Studio Designer, los archivos de
recursos de diseo de escritura XML o escribiendo cdigo Java. Cada uno de estos enfoques se tratarn en
los captulos que siguen.
137
2 modo de diseo
3 Modo de texto
5 Tipo Morphing
7 Resumen
Modo Diseo
En modo de diseo, la interfaz de usuario se puede manipular visualmente al trabajar directamente con la
paleta de vista y la representacin grfica de la distribucin.
138
Figura 15-1 se destacan las reas clave de la herramienta Diseador Android Estudio en modo de diseo:
Figura 15-1
A - Paleta - La paleta proporciona acceso a la gama de componentes de vista que ofrece el SDK de
Android. Estos se agrupan en categoras para una fcil navegacin. Los productos que se pueden aadir a la
disposicin ya sea arrastrando un componente de vista de la paleta y colocndolo en la posicin deseada en
el diseo, o haciendo clic en un widget en la paleta y luego haciendo clic en la ubicacin en la disposicin
donde se va a ser posicionado.
Pantalla de dispositivos - B - La pantalla del dispositivo proporciona una representacin visual "lo que ves
es lo que obtienes" representacin del diseo de la interfaz de usuario, ya que se est diseando. Este diseo
permite la manipulacin directa del diseo en trminos de permitir visitas a seleccionar, eliminar, mover y
redimensionar. El modelo de dispositivo representado por el diseo se puede cambiar en cualquier momento
utilizando un men situado en la barra de herramientas. Tenga en cuenta que si usted encuentra la imagen de
la trama dispositivo que rodea el diseo de presentacin de distraccin, se puede desactivar seleccionando el
men de configuracin en la barra de herramientas (representado por el icono de engranaje) y alternar de los
marcos dispositivo incluyen (si est disponible) opcin.
139
C - rbol de componentes - Como se ha sealado en el captulo anterior (Entendiendo Vistas Android, Ver
grupos y diseos) interfaces de usuario se construyen utilizando una estructura jerrquica.El rbol de
componentes proporciona una descripcin visual de la jerarqua del diseo de la interfaz de
usuario. Seleccin de un elemento del rbol componente har que la vista correspondiente en la disposicin a
ser seleccionado. Del mismo modo, la seleccin de una vista desde el diseo de la pantalla del dispositivo
seleccionar ese punto de vista en la jerarqua de rbol de componentes.
D - Propiedades - Todas las vistas de componentes que figuran en la paleta han asociado con ellos un
conjunto de propiedades que se pueden utilizar para ajustar el comportamiento y la apariencia de esa
opinin. El panel de propiedades del diseador proporciona acceso a las propiedades de la vista seleccionada
actualmente en el diseo que permite que se realicen cambios.
E - Barra de herramientas - La barra de herramientas Diseador proporciona un acceso rpido a una amplia
gama de opciones que incluyen, entre otras opciones, la posibilidad de hacer zoom dentro y fuera de la
disposicin de la pantalla del dispositivo, cambie el modelo de dispositivo muestra actualmente, gire el
trazado entre el retrato y el paisaje y cambiar a un nivel API de Android SDK diferente. La barra de
herramientas tambin tiene un conjunto de botones sensibles al contexto que aparecern cuando se
seleccionan los tipos de vista relevantes en el diseo de la pantalla del dispositivo.
F - Modo de conmutacin aqu - Las pestaas situadas a lo largo del borde inferior del Diseador
proporciona una forma de alternar entre los modos de texto y el diseo de la herramienta Diseador.
Modo de texto
Es importante tener en cuenta al utilizar la herramienta Diseador Android Studio que todo lo que est
haciendo en realidad est proporcionando un enfoque fcil de usar para la creacin de archivos de recursos
de diseo XML. En cualquier momento durante el proceso de diseo, el cdigo XML subyacente puede verse
y editarse directamente simplemente haciendo clic en la ficha Texto situada en la parte inferior del panel de
herramientas Diseador. Para volver al modo de diseo, haga clic en la pestaa Diseo.
Figura 15-2 se destacan las reas clave de la herramienta Diseador Android Estudio en modo texto:
140
Figura 15-2
A - Editor - El panel muestra el editor de XML que compone el diseo actual diseo de la interfaz de
usuario. Este es el entorno de editor de Android estudio completo que contiene todas las caractersticas
descritas anteriormente en los Los fundamentos del captulo Editor de cdigo Android estudio de este libro.
B - Preview - A medida que se realizan cambios en el cdigo XML en el editor, estos cambios se reflejan
visualmente en la ventana de vista previa. Esto proporciona retroalimentacin visual instantnea sobre los
cambios XML, ya que se hacen en el editor, evitando as la necesidad de alternar entre el texto y el modo de
diseo para ver los cambios. Mientras que la vista preliminar no permite la manipulacin directa de los puntos
de vista, hacer doble clic en una vista en la vista previa cambiar automticamente al modo de diseo y
preseleccionar la vista correspondiente en el diseo de la pantalla del dispositivo.
C - Barra de herramientas - La barra de herramientas en modo texto ofrece un subconjunto de las funciones
disponibles en el modo de diseo con la adicin de un botn para tomar una captura de pantalla de la
disposicin de la pantalla del dispositivo actual.
D - Modo de conmutacin aqu - Las pestaas situadas a lo largo del borde inferior del Diseador
proporciona una forma de alternar entre los modos de texto y el diseo de la herramienta Diseador.
141
Mientras el panel de propiedades proporciona acceso a la lista completa de propiedades para el componente
seleccionado actualmente, el acceso rpido a un subconjunto de propiedades comunes se puede ganar
haciendo doble clic en la vista de componentes en el diseo. Haciendo doble clic en un componente
TextView, por ejemplo, ofrece un rpido acceso a los textos e id propiedades para la vista como se muestra
en la Figura 15-3:
Figura 15-3
Algunos establecimientos, tanto en las principales propiedades y los paneles de acceso rpido contienen un
botn que muestra tres puntos. Esto indica que un dilogo de configuracin est disponible para ayudar en la
seleccin de un valor de propiedad adecuado. Para mostrar el cuadro de dilogo, haga clic en el
botn. Propiedades en el que un nmero finito de opciones vlidas estn disponibles presentar un men
desplegable (Figura 15-4) desde el cual se puede hacer una seleccin.
Figura 15-4
Por defecto, el panel de propiedades slo se enumeran las propiedades ms utilizadas. El acceso a la gama
completa de propiedades para el tipo de componente seleccionado actualmente est disponible cambiando el
panel en el modo experto. Este modo se puede activar y desactivar haciendo clic en el botn de embudo en la
barra de herramientas, como se indica por la flecha en la Figura 15-5:
142
Figura 15-5
En la mayora de los casos, no ser necesario el acceso a las propiedades del modo experto, aunque es til
para estar al tanto de este modo en el caso de que la propiedad que usted est buscando no aparece en el
modo estndar.
Tipo Morphing
La funcin de morphing de la herramienta Designer permite una vista de componente que ya es parte de la
disposicin de interfaz de usuario para cambiar de un tipo a otro. Morphing puede, por ejemplo, se utiliza para
cambiar un componente TextView en un componente de vista EditarTexto. Mientras morphing est limitado en
cuanto a los tipos de conversin que se pueden realizar (no es posible, por ejemplo, para transformar una
TextView en un ProgressBar), esto proporciona una alternativa ms rpida a la supresin y adicin de
componentes en muchos casos.
Para transformar un componente, simplemente haga clic en la vista en el diseo y seleccione la opcin de
men Morphing seguido por el tipo al que la vista se va a cambiar. Figura 15-6, por ejemplo, muestra las
opciones de morphing disponibles para un componente ImageButton:
Figura 15-6
143
Resumen
Una parte fundamental del desarrollo de aplicaciones Android implica la creacin de la interfaz de
usuario. Dentro del entorno Android de estudio, esto se realiza mediante la herramienta Diseador que opera
en dos modos. En modo de diseo, mira componentes son seleccionados de una paleta y colocados en un
diseo que representa una pantalla del dispositivo Android y configurar mediante una lista de propiedades. En
el modo texto, el cdigo XML subyacente que representa el diseo de la interfaz de usuario se puede editar
directamente, con los cambios reflejados en una pantalla de vista previa. Estos modos se combinan para
proporcionar una extensa e intuitivo entorno de diseo de interfaz de usuario.
144
5 Ejecutar la aplicacin
8 Resumen
145
Figura 16-1
146
En este punto Android Estudio debera haber aadido dos archivos para el proyecto. El archivo de cdigo
fuente de Java para la actividad debe estar ubicado en la aplicacin -> Java -> carpeta
com.ebookfrenzy.layoutsample.
Adems, el archivo XML para el diseo de la interfaz de usuario debera haber sido creado en la aplicacin ->
res -> carpeta de diseo y tambin debera haber sido precargado en la herramienta Diseador.
Por ltimo, se debera haber aadido la nueva actividad en el fichero AndroidManifest.xml y designada como
la actividad de lanzamiento. El archivo de manifiesto se puede encontrar en la ventana de proyecto en el
marco de la aplicacin -> manifiesta carpeta y debe contener la siguiente XML:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.layoutsample">
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
<Actividad
android: name = ". LayoutSampleActivity"
android: label = "@ string / title_activity_layout_sample">
<Intencin de filtro>
<Accin android: name = "android.intent.action.MAIN" />
<Categora
android: name = "android.intent.category.LAUNCHER" />
</ Intencin de filtro>
</ Actividad>
</ Application>
</ Manifiesto>
147
Figura 16-2
Haga clic en el icono de la bombilla para que aparezca el men de sugerencias y hacer clic en el mensaje que
dice "Este campo de texto no especifica un InputType o una indirecta" y seleccionar el texto como el tipo de
entrada en el conjunto de atributos de dilogo. Haga clic en Aceptar para cerrar el cuadro de dilogo y
establezca el atributo.
148
campo Valor, escriba un valor para el ancho deseado del campo. El valor debe incluir una unidad de medida
de la siguiente lista:
en - Pulgadas
mm - Milmetros
sp --Scale independiente pxeles. Similar a dp pero a escala basada en la preferencia de fuente del
usuario.
px - pxeles de pantalla reales. El uso no se recomienda ya que diferentes pantallas tendrn diferentes
pxeles por pulgada. Utilice dp con preferencia a esta unidad.
A los efectos de este ejemplo, utilizaremos densidad pxeles independientes como nuestra unidad de medida,
por lo que entrar en 350dp en el cuadro de dilogo y haga clic en el botn Aceptar. La anchura de la vista
EditarTexto debe cambiar en consecuencia.
A continuacin, haga doble clic en la vista del botn y en el panel resultante, cambie la propiedad de texto del
"Nuevo botn" a "Pulse Me". Haga clic en el icono de la bombilla seguido del mensaje I18N para mostrar el
dilogo de Recursos Extraer. Nombre del button_string de recursos y haga clic en Aceptar para crear un
recurso de cadena para el botn.
El diseo de la interfaz de usuario muy sencilla ha finalizado. Disear un diseo de interfaz de usuario ms
complejo es una continuacin de los pasos descritos anteriormente. Basta con arrastrar y soltar vistas a la
pantalla, la posicin y las propiedades que figuran como sea necesario y diseos nido segn sea necesario.
Ejecutar la aplicacin
Todo lo que queda es probar que la aplicacin se ejecuta. Haga clic en el botn Ejecutar en la barra de
herramientas de la ventana principal. Seleccione el simulador o un dispositivo Android fsica y esperar a que
la aplicacin se inicie. Suponiendo que la ausencia de errores, la aplicacin y la actividad deben lanzar y
aparecer exactamente como fue diseado con la funcin Designer.
Esta declaracin debe ser seguido por el elemento raz de la disposicin, por lo general una visin recipiente
tal como un controlador de distribucin. Esto est representado por las dos etiquetas de apertura y cierre y las
propiedades que hay que establecer en la vista. El siguiente XML, por ejemplo, declara una vista
RelativeLayout como el elemento raz y establece las propiedades match_parent tales que llena todo el
espacio disponible de la pantalla del dispositivo con relleno a cada lado de 64 densidad pxeles
independientes:
149
<RelativeLayout
xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: paddingLeft = "64DP"
android: paddingRight = "64DP"
android: paddingTop = "64DP"
android: paddingBottom = "64DP"
herramientas: contexto =
"Com.ebookfrenzy.layoutsample.layoutsample.LayoutSampleActivity">
</ RelativeLayout>
Cualquier nio que necesitan ser aadido al padre RelativeLayout deben estar anidadas dentro de las
etiquetas de apertura y cierre. En el siguiente ejemplo, un botn y un campo EditarTexto se han aadido
como hijos de la vista RelativeLayout:
<RelativeLayout
xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: paddingLeft = "64DP"
android: paddingRight = "64DP"
android: paddingTop = "64DP"
android: paddingBottom = "64DP"
herramientas: contexto =
"Com.ebookfrenzy.layoutsample.layoutsample.LayoutSampleActivity">
<Botn
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / button_string"
id = "@ + / Identificacin del botn"
layout_centerVertical = "true"
layout_centerHorizontal = "true" />
<EditarTexto
android:
android:
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
id = "@ + / Identificacin del EditarTexto"
layout_above = "@ + / Identificacin del botn"
layout_centerHorizontal = "true"
layout_marginBottom = "51dp"
InputType = "text"
width = "350dp" />
</ RelativeLayout>
Adems, tenga en cuenta que los dos puntos de vista del nio tienen una serie de propiedades
declaradas. En el caso de la vista del botn, se ha asignado "botn" Identificacin y configurado para mostrar
150
el texto que se representa mediante un recurso de cadena denominado button_string. Adems, se ha
centrado vertical y horizontalmente dentro de la altura vista padre y wrap_content y propiedades width han
sido declaradas de modo que se dimensiona el botn para acomodar el contenido (en este caso el texto se
muestra en el botn).
La vista EditarTexto, por otro lado, tiene una anchura declarada como 350dp, se centra horizontalmente
dentro de la matriz y 51dp encima de la vista botn situado.
Este archivo XML es, por supuesto, el diseo que se ha creado con la herramienta de diseo en este
captulo. Al escribir XML manualmente en lugar de utilizar la herramienta de diseo en el modo de diseo es
una cuestin de preferencia personal. Hay, sin embargo, las ventajas de utilizar el modo de diseo. En primer
lugar, el modo de diseo generalmente ser ms rpido ya que evita la necesidad de escribir lneas de
XML. Adems, el modo de diseo evita la necesidad de aprender los entresijos de los diferentes valores de
las propiedades de las clases de vista del SDK de Android.En lugar de hacer referencia continuamente a la
documentacin de Android para encontrar las palabras clave y los valores correctos, la mayora de las
propiedades se pueden localizar consultando el panel Propiedades.
Todas las ventajas de modo de diseo a un lado, es importante tener en cuenta que los dos enfoques de
diseo de la interfaz de usuario son de ninguna manera mutuamente excluyentes. Como un desarrollador de
aplicaciones, es muy probable que el resultado final ser la creacin de interfaces de usuario en el modo de
diseo, mientras que la realizacin de ajuste y maquetacin ajustes del diseo editando directamente los
recursos XML generados. Ambos puntos de vista del diseo de la interfaz son, despus de todo, un solo clic
del ratn aparte dentro del entorno Android estudio por lo que es fcil cambiar de ida y vuelta, segn sea
necesario. De hecho, un consejo til para recordar es que la seleccin de un punto de vista en el diseo de la
pantalla y pulsar la combinacin de teclas Ctrl-B saltar automticamente y poner de relieve el XML para ese
punto de vista en el archivo de recursos.
151
Figura 16-3
Seleccin de la ventana de muestra de diseo har que la jerarqua para cargar en el panel de vista de rbol
como se muestra en la Figura 16-4 (tenga en cuenta que puede haber un pequeo retraso entre la seleccin
de la ventana y el diagrama de jerarqua que aparece):
Figura 16-4
Si bien es posible hacer zoom dentro y fuera de la vista de rbol utilizando la escala en la parte inferior del
panel o haciendo girar la rueda del ratn, en la mayora de los casos el rbol ser demasiado grande como
para ver por completo dentro del panel de vista de rbol. Para mover la ventana de vista alrededor del rbol
simplemente haga clic y arrastre en el panel de vista de rbol, o mover la lente en el panel rbol general
(Figura 16-5):
152
Figura 16-5
Al revisar la vista de rbol, tener en cuenta que se mostrarn algunos puntos de vista, adems de las
incluidas en la disposicin actividad. Estos son los puntos de vista y diseos que, por ejemplo, mostrar la
barra de accin en la parte superior de la pantalla y proporcionan un rea para la actividad que se mostrar.
Seleccin de un nodo en la vista de rbol har que el elemento correspondiente en la representacin de
interfaz de usuario que se resalta en rojo en la vista de diseo. En la figura 16-6 la vista RelativeLayout est
seleccionado actualmente:
Figura 16-6
Del mismo modo, la seleccin de vistas desde la vista de diseo har que el nodo correspondiente en la vista
de rbol para resaltar y mover a la vista.
Informacin adicional acerca de una vista se puede conseguir mediante la seleccin del nodo dentro de la
vista de rbol. Un panel entonces emergente junto al nodo y puede ser destituido mediante la realizacin de
un clic derecho en el nodo. Al hacer doble clic en un nodo mostrar un cuadro de dilogo que contiene una
153
representacin de cmo aparece la vista dentro de la interfaz de usuario de la aplicacin. Figura 16-7, por
ejemplo, muestra el botn de la aplicacin LayoutSample:
Figura 16-7
Las opciones tambin estn disponibles dentro de la herramienta para llevar a cabo tareas como la
invalidacin de una vista de diseo seleccionado (por lo tanto lo que oblig a ser redibujado) y para salvar la
vista de rbol como una imagen PNG file.The espectador jerarqua tambin se puede utilizar para mostrar
informacin sobre la velocidad con el que el nio vistas de un nodo seleccionado se prestan cuando se crea
la interfaz de usuario. Para mostrar esta informacin de rendimiento, seleccione el nodo de actuar como la
vista de la raz y haga clic en el botn de la barra indica en la figura 16-8. Cuando se activa, los puntos de
colores dentro de los nodos indican el rendimiento en cada categora (medida, diseo y dibujar) con rojo
indicando un rendimiento ms lento para la vista en relacin con otros puntos de vista en la actividad. Vistas
de contenedores con mayor nmero de visitas de nios pueden mostrar el estado rojo, simplemente porque el
punto de vista tiene que esperar a que cada nio a prestar. Esto no es necesariamente una indicacin de un
problema de rendimiento con esa opinin.
Figura 16-8
Resumen
La herramienta Android Studio Designer proporciona un mtodo visual intuitiva para el diseo de interfaces de
usuario. El uso de un paradigma de arrastrar y soltar en combinacin con un conjunto de editores de
propiedades, la herramienta proporciona considerables beneficios de productividad a los desarrolladores de
aplicaciones.
154
Diseos de interfaz de usuario tambin pueden ser implementadas por escribir manualmente los archivos de
recursos de diseo XML, cuyo formato est bien estructurado y de fcil comprensin.
El hecho de que la herramienta Diseador genera archivos de recursos XML significa que estos dos enfoques
para interfaz de diseo se pueden combinar para proporcionar una "mejor de ambos mundos" enfoque de
desarrollo de interfaz de usuario.
Por ltimo, una descripcin detallada de la vista de rbol para una actividad y una indicacin del rendimiento
de cada vista dentro de esa actividad se pueden obtener utilizando la herramienta Visor de Jerarqua.
155
2 Creacin de Vistas
10 Resumen
156
En trminos de los puntos fuertes del enfoque de Java codificacin para la creacin de diseo, quizs la
ventaja ms significativa que Java tiene ms archivos de recursos XML entra en juego cuando se trata de las
interfaces de usuario dinmicas. Archivos de recursos XML son inherentemente ms til en la definicin de
los diseos estticos, en otras palabras, los diseos que son poco probable que cambie significativamente de
una invocacin de una actividad a otra. Cdigo de Java, por otro lado, es ideal para crear interfaces de
usuario de forma dinmica en tiempo de ejecucin. Esto es particularmente til en situaciones en las que la
interfaz de usuario puede aparecer de forma diferente cada vez que se ejecuta la actividad sujeta a factores
externos.
El conocimiento de trabajar con componentes de la interfaz de usuario en cdigo Java tambin puede ser til
cuando los cambios dinmicos a un diseo basado en los recursos XML esttica se deben realizar en tiempo
real como la actividad est en marcha.
Por ltimo, algunos desarrolladores simplemente prefieren escribir cdigo Java que utilizar herramientas de
diseo y XML, independientemente de las ventajas ofrecidas por los ltimos enfoques.
Crear vistas
Segn lo establecido anteriormente, el SDK de Android incluye una caja de herramientas de la vista de clases
diseadas para satisfacer la mayora de las necesidades bsicas de diseo de interfaz de usuario. La
creacin de una vista en Java es simplemente una cuestin de crear instancias de estas clases, pasando por
como argumento una referencia a la actividad con la que esa visin es ser asociado.
La primera vista (normalmente una vista contenedor al que vistas adicionales del nio se pueden aadir) se
muestra al usuario a travs de una llamada al mtodo setContentView () de la actividad.Visitas adicionales se
aaden a la vista de la raz a travs de las llamadas al mtodo del objeto addView ().
Cuando se trabaja con cdigo Java para manipular opiniones que figuran en los archivos de recursos de
diseo de XML, es necesario obtener el ID de la vista. La misma regla es vlida para vistas creadas en
Java. Como tal, es necesario asignar un ID a cualquier vista para la que se requieren ciertos tipos de acceso
posterior en cdigo Java. Esto se logra a travs de una llamada al mtodo setId () del objeto de vista de que
se trate. En el cdigo ms tarde, el ID de un punto de vista puede ser obtenida a travs de una llamada
posterior al mtodo del objeto getId ().
157
padres, o asignado a la opinin de los nios a travs de una llamada a setLayoutParams de la vista ()
mtodo.
Un objeto LayoutParams para una visin tpicamente se cre al declarar cmo la visin debe ser de un
tamao en relacin con el punto de vista de los padres (es decir, si debe llenar el padre o ser dimensionado
para ajustar el contenido que necesita para mostrar). Una vez que el objeto existe LayoutParams, normas
adicionales, tales como si la vista debe estar alineado con otro punto de vista, se pueden aadir a travs de
llamadas al mtodo addRule () del objeto LayoutParams.
Hay subclases de ViewGroup.LayoutParams para cada uno de los
(AbsoluteLayout.LayoutParams, RelativeLayout.LayoutParams y as sucesivamente).
tipos
de
diseo
Despus de haber cubierto la teora de la creacin de la interfaz de usuario en el cdigo de Java, el resto de
este captulo se va a trabajar metdicamente a travs de la creacin de una aplicacin de ejemplo con el
objetivo de poner en prctica esta teora.
158
La siguiente modificacin en el mtodo onCreate () es escribir algo de cdigo Java para agregar un objeto
RelativeLayout con una sola vista Botn nio a la actividad. Esto implica la creacin de nuevas instancias de
las clases RelativeLayout y Button. Necesita entonces el botn Vista que se aade como un nio a la vista
RelativeLayout que, a su vez, se muestra a travs de una llamada al mtodo setContentView () de la instancia
de actividad:
com.ebookfrenzy.javalayout paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.Button importacin;
android.widget.RelativeLayout importacin;
Una vez que se han hecho las adiciones anteriores, compilar y ejecutar la aplicacin (ya sea en un dispositivo
fsico o un emulador). Una vez puesto en marcha, el resultado visible ser un botn que no contiene el texto
que aparece en la esquina superior izquierda de la vista RelativeLayout como se muestra en la Figura 17-1:
Figura 17-1
159
Cuando la aplicacin est ahora compila y ejecuta, la distribucin reflejar la configuracin de propiedades de
manera que el diseo aparecer con un fondo azul y el botn mostrar el texto asignado en un fondo amarillo.
160
El cdigo para crear un objeto LayoutParams para nuestro botn dira lo siguiente:
RelativeLayout.LayoutParams buttonParams =
nuevos RelativeLayout.LayoutParams (
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
El cdigo anterior crea un nuevo RelativeLayout LayoutParams objetos nombrados buttonParams y establece
la altura y la anchura de tal manera que el botn slo ser lo suficientemente grande como para mostrar la
"Pulse Me" texto configurado previamente a travs de la configuracin de la propiedad.
Ahora que el objeto LayoutParams ha sido creado, el siguiente paso es aadir algunas reglas adicionales a
los parmetros para instruir a los padres disposicin para centrar el botn vertical y horizontalmente. Esto se
logra mediante una llamada al mtodo addRule () del objeto buttonParams, pasando por los valores
apropiados como argumentos:
buttonParams.addRule (RelativeLayout.CENTER_HORIZONTAL);
buttonParams.addRule (RelativeLayout.CENTER_VERTICAL);
Simplemente crear un objeto nuevo LayoutParams y configuracin slo es til si ese objeto se le asigna a la
vista de los nios. Una forma de lograr esto es pasar los LayoutParams objeto a travs como argumento
cuando se aade el punto de vista del nio a los padres:
myLayout.addView (myButton, buttonParams);
Alternativamente, los parmetros se pueden asignar al nio a travs de una llamada al mtodo de la vista
setLayoutParams ():
myButton.setLayoutParams (buttonParams);
Llevar estos resultados juntos en un mtodo onCreate modificado () que dice lo siguiente:
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
Botn myButton = new Button (this);
myButton.setText ("me Pulse");
myButton.setBackgroundColor (Color.YELLOW);
RelativeLayout myLayout = new RelativeLayout (this);
myLayout.setBackgroundColor (Color.BLUE);
RelativeLayout.LayoutParams buttonParams =
nuevos RelativeLayout.LayoutParams (
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
buttonParams.addRule (RelativeLayout.CENTER_HORIZONTAL);
buttonParams.addRule (RelativeLayout.CENTER_VERTICAL);
161
Despus de haber realizado los cambios anteriores, compilar y ejecutar la aplicacin, una vez ms, esta vez
sealando que el botn se centra ahora en la vista RelativeLayout como se ilustra en la Figura 17 216 2:
Figura 17-2
Con el fin de obtener una comprensin ms clara de la configuracin de los parmetros de altura y diseo de
ancho, modificar temporalmente el cdigo de creacin buttonParams de la siguiente manera, a continuacin,
volver a compilar y ejecutar la aplicacin:
RelativeLayout.LayoutParams buttonParams =
nuevos RelativeLayout.LayoutParams (
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
Tanto con la altura y la anchura de los parmetros establecidos para MATCH_PARENT, el botn est
dimensionado para que coincida con la opinin de los padres y, en consecuencia llena toda la pantalla.
Antes de continuar, revertir la altura y la configuracin de ancho de WRAP_CONTENT.
162
vista EditarTexto que ser configurado para ser alineado 80 pxeles por encima del botn existente y centrado
horizontalmente. Las siguientes modificaciones de cdigo aaden la nueva vista a la actividad y luego
establecer los ID de 1 y 2 en el botn y vistas EditText respectivamente. Parmetros de diseo se crean a
continuacin para la vista EditarTexto para que quede alineado con el botn (nota de la llamada a getId () en
el botn para obtener el ID de vista) y centrado horizontalmente dentro del diseo. Por ltimo, la propiedad
mrgenes del campo EditarTexto est configurado para establecer el margen inferior a 80 pxeles antes de
aadir el nuevo objeto de disposicin de los padres:
com.ebookfrenzy.javalayout paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.Button importacin;
android.widget.RelativeLayout importacin;
android.graphics.Color importacin;
android.widget.EditText importacin;
public class JavaLayoutActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
Botn myButton = new Button (this);
myButton.setText ("me Pulse");
myButton.setBackgroundColor (Color.YELLOW);
RelativeLayout myLayout = new RelativeLayout (this);
myLayout.setBackgroundColor (Color.BLUE);
EditarTexto myEditText = new EditarTexto (this);
myButton.setId (1);
myEditText.setId (2);
RelativeLayout.LayoutParams buttonParams =
nuevos RelativeLayout.LayoutParams (
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
RelativeLayout.LayoutParams textParams =
nuevos RelativeLayout.LayoutParams (
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
textParams.addRule (RelativeLayout.ABOVE, myButton.getId ());
textParams.addRule (RelativeLayout.CENTER_HORIZONTAL);
textParams.setMargins (0, 0, 0, 80);
buttonParams.addRule (RelativeLayout.CENTER_HORIZONTAL);
buttonParams.addRule (RelativeLayout.CENTER_VERTICAL);
myLayout.addView (myButton, buttonParams);
163
Una prueba de funcionamiento de la aplicacin debe mostrar el campo EditarTexto centrado sobre el botn
con un margen de 80 pxeles.
164
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
buttonParams.addRule (RelativeLayout.CENTER_HORIZONTAL);
buttonParams.addRule (RelativeLayout.CENTER_VERTICAL);
RelativeLayout.LayoutParams textParams =
nuevos RelativeLayout.LayoutParams (
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
textParams.addRule (RelativeLayout.ABOVE, myButton.getId ());
textParams.addRule (RelativeLayout.CENTER_HORIZONTAL);
textParams.setMargins (0, 0, 0, 80);
Recursos r = getResources ();
int px = (int) TypedValue.applyDimension (
TypedValue.COMPLEX_UNIT_DIP, 200,
r.getDisplayMetrics ());
myEditText.setWidth (px);
myLayout.addView (myButton, buttonParams);
myLayout.addView (myEditText, textParams);
setContentView (myLayout);
}
}
Compile y ejecute la aplicacin una vez ms y tenga en cuenta que el ancho de la vista EditarTexto ha
cambiado como se ilustra en la Figura 17-3:
Figura 17-3
165
Resumen
Como alternativa a la escritura de archivos de recursos de diseo XML o utilizando la herramienta Android
Studio Designer, interfaces de usuario de Android tambin pueden ser creados de forma dinmica en cdigo
Java. Crear presentaciones en cdigo Java consiste en crear instancias de clases de vista y configuracin de
propiedades de los objetos para definir la apariencia y el comportamiento requerido.
Cmo se coloca una vista y un tamao en relacin a su vista padre y ninguna vistas hermano se define
mediante los parmetros de diseo, que se almacenan en los objetos LayoutParams. Una vez que un objeto
LayoutParams ha sido creado e inicializado con la altura y la configuracin del comportamiento de ancho, a
continuacin, se pueden aadir reglas adicionales para configurar los parmetros ms.
La actividad ejemplo creado en este captulo ha, por supuesto, creado de la misma interfaz de usuario (el
cambio en el color de fondo a pesar) como el creado en el captulo anterior utilizando las herramientas y los
recursos XML Graphical Layout. Por lo menos, este captulo debera haber proporcionado una apreciacin del
nivel al que la herramienta Diseador y XML recursos Android Studio protegen el promotor de muchas de las
complejidades de la creacin de diseos de interfaz de usuario de Android.
Hay, sin embargo, casos en los que tiene sentido para crear una interfaz de usuario en Java. Este enfoque es
ms til, por ejemplo, cuando la creacin de diseos de interfaz de usuario dinmicas.
166
2 El Ejemplo GridLayout
9 Resumen
167
manera que la vista aparece centrada, llena toda la clula o se coloca en una esquina especfica de la clula
dentro de la que reside.
Adems, una vista hijo de un padre GridLayout tambin puede estar configurado para abarcar varias filas y
columnas a travs del uso de las propiedades rowspan y ColumnSpan del nio. Otra clase til que puede ser
utilizado en conjuncin con el GridLayout es la clase de espacio. Esta es una clase muy simple, con el nico
propsito de los cuales es la creacin de lagunas dentro de diseos. En el caso de la clase GridLayout, una
vista espacial se puede colocar en cualquier clula como cualquier otro objeto de vista.
Adems de utilizar la clase de espacio para crear huecos, el espacio alrededor de puntos de vista en las
clulas puede ser controlado a travs de las diversas propiedades de diseo de margen (superior, inferior,
izquierda y derecha) de cada nio.
El GridLayout Ejemplo
Dada la naturaleza visual tanto de la clase GridLayout y la herramienta Android Studio Designer, la me jor
manera de obtener un nivel de familiaridad con los conceptos involucrados es trabajar a travs de un
ejemplo. El resto de este captulo, por lo tanto, va a crear una aplicacin de ejemplo que muestra algunas de
las caractersticas clave de la clase GridLayout en el contexto de la herramienta Diseador.
168
Figura 18-1
Para los propsitos de este tutorial, el GridLayout slo est obligado a ser lo suficientemente grande para dar
cabida a los puntos de vista del nio contenidas en el mismo. Como tal, los parmetros de altura y anchura de
la vista GridLayout necesitan ser cambiados de fill_parent a wrap_content. Una manera de hacer este cambio
es localizar las propiedades en el panel Propiedades de la herramienta Diseador. Una opcin ms rpida es
seleccionar la instancia GridLayout y utilizar los dos botones en la barra de herramientas del
Diseador. Establezca la propiedad anchura haciendo clic en el botn de ancho de diseo como se destaca
en la Figura 18-2:
Figura 18-2
Despus de haber establecido la propiedad width de wrap_content, haga clic en el botn de la barra
169
adyacente, para seleccionar de manera similar la propiedad layout_height. Estos ajustes tendrn el efecto de
la reduccin de la disposicin a una pequea plaza listo para dar cabida a algunos puntos de vista del nio. Si
la instancia GridLayout todava se coloca en el centro de la pantalla, haga clic y arrstrelo a la esquina
superior izquierda.
Figura 18-3
Como es evidente en el mensaje mostrado por la herramienta, la liberacin de la vista en este punto lo
colocar en la celda referenciada por las coordenadas de 0,0.
Suelte la vista en este punto y observe que el botn se coloca en la clula como se muestra en la Figura 18-4:
Figura 18-4
Tenga en cuenta tambin que las barras verdes han aparecido en los mrgenes en los lados superior y
170
derecho de la zona principal de Designer. Estas barras representan las filas y columnas presentes en el
GridLayout (actualmente el diseo tiene una fila y una columna).
Repetir los pasos anteriores para colocar un segundo botn en el GridLayout de modo que se posiciona en la
fila cero y despus de la columna 0 tal que aparece inmediatamente a la derecha de la primera botn.
Arrastre un tercer punto de vista del botn a una posicin a la izquierda de la primera vista del botn hasta
que el mensaje que se muestra en la Figura 18-6 aparece proporcionar la opcin de cambiar la columna 0
derecha e inserte la nueva vista en la clula en 0,0:
Figura 18-5
Cuando la vista se deja caer en esta posicin, las columnas existentes se desplazan de un lugar a la derecha,
se insertar una nueva columna en el borde izquierdo de la GridLayout y el nuevo botn colocado en la
clula.
Siguiendo la misma secuencia de pasos, aadir una vista botn en la segunda fila de la parrilla colocada
despus de la fila 0 en la columna 0 de modo que el diseo se asemeja a la de la Figura 18-6:
Figura 18-6
171
Figura 18-7
A continuacin, seleccione la nica vista Button en la segunda fila, esta vez cambiando el diseo
correspondiente: Valor ColumnSpan en el panel Propiedades para 2.
Estos dos puntos de vista estn configurados para abarcar varias clulas. Una revisin de la lona de la
disposicin, sin embargo, muestra que las opiniones se han mantenido el mismo tamao, aunque las clulas
en las que residen ahora abarcan varias filas o columnas. La razn de esto es que la configuracin de
gravedad para estos puntos de vista necesitan ser cambiados.
172
Figura 18-8
173
Figura 18-9
Despus de haber establecido esta propiedad, la vista del botn ahora se centra verticalmente entre las dos
clulas:
Figura 18-10
Una opcin alternativa para el centrado es para la vista de nio para llenar el espacio disponible. Para lograr
esto, cambie el ajuste de relleno del trazado: la propiedad gravedad para fill_vertical. Es importante sealar
que las diferentes categoras de propiedades de gravedad se combinan como se seleccionan. Para la celda
seleccionada, por ejemplo, ahora hemos permitido ambas propiedades gravedad center_vertical y
fill_vertical. Esto puede ser verificada mediante referencia a la disposicin: lnea de gravedad en el panel
Propiedades como se indica en la Figura 18-11:
174
Figura 18-11
Desde la propiedad center_vertical ya no es necesario, apguelo dejando caer el men propiedad del centro
(Figura 18-12) y seleccionando el <unset> opcin:
Figura 18-12
Aadir una propiedad gravedad para el botn de la segunda fila, esta vez permitiendo el ajuste de la gravedad
fill_horizontal. Despus de cambiar las banderas de gravedad, los dos botones deberan haber ampliado para
rellenar las celdas abarcado:
Figura 18-13
175
Resumen
La clase GridLayout permite vistas a ser dispuestos en un diseo de cuadrcula, donde una o ms vistas
estn contenidas dentro de celdas de la cuadrcula. Cada nio puede ser configurado para abarcar varias
clulas tanto horizontal como verticalmente. El comportamiento de la posicin y el tamao de un punto de
vista del nio dentro de una celda o rango de celdas se controla a travs de la configuracin de los valores de
gravedad.
GridLayouts pueden implementarse ya sea mediante el Diseador de Android Estudio en modo de diseo, o
mediante el uso de cdigo Java o recursos de diseo XML. En este captulo se ha cubierto el enfoque de
modo de diseo. El siguiente captulo se analizar el uso de los recursos de diseo XML para implementar
configuraciones GridLayout.
176
4 Resumen
La sintaxis XML anterior se aplica cuando el GridLayout es el elemento raz de un diseo de interfaz de
usuario (es decir, el diseo ms superior en la jerarqua de la vista). En situaciones en que el GridLayout est
anidado como un hijo de otro recipiente los cambios de sintaxis ligeramente. El siguiente XML, por ejemplo,
muestra una instancia GridLayout incrustado en un gerente RelativeLayout donde el RelativeLayout es el
elemento raz de la interfaz de usuario:
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: layout_width = "match_parent"
177
layout_width = "wrap_content"
layout_height = "wrap_content"
layout_alignParentTop = "true"
layout_alignParentLeft = "true"
layout_alignParentStart = "true"
orientacin = "vertical">
</ GridLayout>
</ RelativeLayout>
El nmero de filas y columnas dentro de la red puede ser declarada usando el androide: rowCount y android:
columnCount propiedades. Tpicamente, sin embargo, si se declara el nmero de columnas de la GridLayout
inferir el nmero de filas basado en el nmero de celdas ocupadas haciendo que el uso de la propiedad
rowCount innecesario.
Del mismo modo, la orientacin de la GridLayout opcionalmente se puede definir a travs de Android: la
propiedad de orientacin. El siguiente ejemplo XML declara una configuracin de 2 x 2 GridLayout en
orientacin horizontal:
<GridLayout xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: id = "@ + / Identificacin del GridLayout1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: columnCount = "2"
android: rowCount = "2"
android: orientacin = "horizontal"
herramientas: context = ". GridLayoutActivity">
</ GridLayout>
178
Figura 19-1
Una vista se puede colocar dentro de una clula especfica mediante la especificacin de la fila y la columna
nmero de interseccin de la celda de destino. La siguiente vista Button, por ejemplo, se colocar en la celda
ubicada en la fila 1, columna 2 de la matriz GridLayout:
<Botn
android:
android:
android:
android:
179
Los mrgenes alrededor de una vista dentro de una clula pueden ser declaradas para todos los lados de la
vista con el androide: propiedad margin layout_margin. Por otra parte, los mrgenes de los lados individuales
pueden definirse mediante el topmargin, BottomMargin, leftmargin y RightMargin propiedades. La siguiente
vista Botn declara un margen 10DP por los cuatro costados:
<Botn
android:
android:
android:
android:
Llevar este conocimiento en conjunto, que ahora puede revisar el diseo de XML para la interfaz de usuario
basada en GridLayout creado en el captulo anterior:
<GridLayout
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
layout_alignParentTop = "true"
layout_alignParentLeft = "true"
layout_alignParentStart = "true"
orientacin = "vertical">
<Botn
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "Nuevo Botn"
id = "@ + / Identificacin del button4"
layout_row = "1"
layout_column = "0"
180
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "Nuevo Botn"
id = "@ + / Identificacin del botn"
layout_row = "0"
layout_column = "1" />
<Botn
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "Nuevo Botn"
id = "@ + / Identificacin del button3"
layout_row = "0"
layout_column = "0" />
<Botn
android:
android:
android:
android:
android:
android:
android:
android:
</ GridLayout>
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "Nuevo Botn"
id = "@ + / Identificacin del button2"
layout_row = "0"
layout_column = "2"
layout_rowSpan = "2"
layout_gravity = "fill_vertical" />
El fragmento de archivo de recursos por encima aparece exactamente como se cre dentro de la herramienta
Diseador Android Estudio en el captulo anterior. Como puede verse, que contiene un administrador de
GridLayout y cuatro vistas del botn con posiciones celulares especificadas por las propiedades de fila y
columna. Finalmente, los valores de la amplitud de fila y columna, junto con propiedades de gravedad se
utilizan para hacer dos de los botones de abarcar mltiples clulas. Cuando se implementa dentro de una
aplicacin, esta disposicin XML aparecera como se ilustra en la figura 16-13.
Resumen
Como alternativa al uso de la herramienta Android Studio Designer en modo de diseo para crear elementos
de la interfaz de usuario basada GridLayout, el mismo objetivo tambin se puede lograr mediante la creacin
manual de recursos de diseo XML. Despus de haber cubierto el uso del enfoque de diseo grfico en el
181
captulo anterior, este captulo ha cubierto los conceptos de declarar un GridLayout y posicionamiento y
configuracin de puntos de vista del nio dentro de un archivo de recursos XML.
182
7 El consumo de Eventos
8 Resumen
183
Con el fin de ser capaz de manejar el caso de que se ha pasado, la vista debe contar con un detector de
eventos. La clase View Android, del que se derivan todos los componentes de la interfaz de usuario, contiene
una serie de interfaces de evento de escucha, cada uno de los cuales contiene una declaracin abstracta de
un mtodo de devolucin de llamada. Con el fin de ser capaz de responder a un evento de un tipo particular,
una visin debe registrar el detector de eventos adecuada e implementar la devolucin de llamada
correspondiente. Por ejemplo, si un botn es para responder a un evento click (el equivalente a la
conmovedora usuario y soltando el botn de vista como si al hacer clic en un botn fsico) debe registrar tanto
el detector de eventos View.OnClickListener (a travs de una llamada a la meta el mtodo de vista
setOnClickListener ()) y aplicar el mtodo de devolucin de llamada correspondiente onClick (). En el caso de
que un evento de "click" se detecta en la pantalla a la ubicacin de la vista botn, el marco Android llamar al
mtodo onClick () de ese punto de vista, cuando ese evento se elimina de la cola de eventos.Es, por
supuesto, dentro de la implementacin del mtodo de devolucin de llamada onClick () que las tareas deben
realizarse u otros mtodos llamado en respuesta al botn de clic.
Esto proporciona una manera sencilla de capturar eventos de clic. No, sin embargo, proporciona la gama de
opciones ofrecidas por los controladores de eventos, que son el tema del resto de este captulo. Cuando se
trabaja en Android Studio Designer, la propiedad onClick se puede encontrar y configurado en el panel
Propiedades cuando se selecciona un tipo de vista adecuado en el diseo de la pantalla del dispositivo.
184
OnClickListener - Se utiliza para detectar eventos clic de estilo por el que los toques de usuario y luego
libera un rea de la pantalla del dispositivo ocupada por una vista. Corresponde al mtodo de devolucin
de llamada onClick () que se pasa una referencia a la opinin de que recibi el evento como un
argumento.
onLongClickListener - Se utiliza para detectar cuando el usuario mantiene el contacto a travs de una
vista por un perodo prolongado. Corresponde al mtodo de devolucin de llamada onLongClick () que se
pasa como argumento la opinin de que recibi el evento.
onTouchListener - Se usa para detectar cualquier tipo de contacto con la pantalla tctil que incluye
toques individuales o mltiples y movimientos gestuales. En correspondencia con la devolucin de
llamada onTouch (), este tema se tratar con mayor detalle en el captulo titulado Android Touch y multitouch control de eventos. El mtodo de devolucin de llamada se pasa como argumentos la opinin de
que recibi el evento y un objeto MotionEvent.
onFocusChangeListener - Detecta cuando el foco se mueve lejos de la vista actual como el resultado de
la interaccin con un trackball o la tecla de navegacin. Corresponde al mtodo de devolucin de llamada
onFocusChange () que se transmite la idea de que recibi el evento y un valor booleano para indicar si el
foco se gana o se pierde.
onKeyListener - Se utiliza para detectar cuando se pulsa una tecla en un dispositivo, mientras que un
punto de vista tiene el foco. Corresponde al mtodo de devolucin de llamada OnKey ().Pas como
argumentos son la opinin de que recibi el evento, el cdigo de tecla de la tecla fsica que se presion y
un objeto KeyEvent.
185
Figura 20-1
Busque y seleccione el archivo activity_event_example.xml creado por Android Studio (situado en la ventana
de herramientas Proyecto en aplicacin -> res -> layouts) y haga doble clic en l para cargarlo en la
herramienta Diseador. Cambiar de modo de diseo a modo de texto de la pestaa en la parte inferior del
panel Diseador y borrar el contenido actual del archivo. Con un lienzo en blanco, ya sea el uso modo de
diseo visualmente el diseo de la interfaz de usuario de la figura 20-1 (asegurndose de cambiar los ID de la
Button y TextView objeta @ + / Identificacin del myButton y @ + / Identificacin del myTextView
respectivamente), o directamente introducir el siguiente cdigo XML se utiliza el modo texto:
186
<TextView
android:
android:
android:
android:
android:
android:
android:
android:
</ RelativeLayout>
187
para cargarlo en el editor de cdigo. Una vez cargada, busque el mtodo onCreate () plantilla y modificarla
para obtener una referencia a la opinin de botn, registrar el detector de eventos y aplicar el mtodo de
devolucin de llamada onClick ():
com.ebookfrenzy.eventexample paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.View importacin;
android.widget.Button importacin;
android.widget.TextView importacin;
public class EventExampleActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_event_example);
Botn Botn = (Button) findViewById (R.id.myButton);
button.setOnClickListener (
nueva Button.OnClickListener () {
public void onClick (Ver v) {
}
}
);
}
.
.
.
}
El cdigo anterior se ha registrado el detector de eventos en el botn y aplicado el mtodo onClick (). Si la
aplicacin eran para ser ejecutado en este punto, sin embargo, no habra ninguna indicacin de que el
detector de eventos instalado en el botn estaba trabajando ya que no es, hasta ahora, ningn cdigo
implementado dentro del cuerpo del mtodo de devolucin de llamada onClick (). La meta para el ejemplo es
tener un mensaje aparecer en la TextView cuando se hace clic en el botn, por lo que algunos cambios de
cdigo adicionales deben hacerse:
188
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_event_example);
Botn Botn = (Button) findViewById (R.id.myButton);
button.setOnClickListener (
nueva Button.OnClickListener () {
public void onClick (Ver v) {
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText ("Botn de clic");
}
}
);
}
Completar esta fase del tutorial de compilar y ejecutar la aplicacin en ambos un emulador AVD o dispositivo
Android fsica. Al tocar y soltar el botn de vista (tambin conocido como "clic") la vista de texto debera
cambiar para mostrar el texto "Botn de clic".
El consumo de Eventos
La deteccin de clics estndar (a diferencia de clics largos) en las vistas es un caso muy simple de manejo de
eventos. El ejemplo ahora se ampla para incluir la deteccin de eventos de clic largos que se producen
cuando el usuario hace clic y sostiene una visin de la pantalla y, al hacerlo, cubren el tema del consumo de
evento.
Considere el cdigo para el mtodo onClick () en la seccin anterior de este captulo. La devolucin de
llamada se declara nulo y, como tal, no devuelve un valor en el marco de Android despus de que haya
terminado
de
de
devolucin
de
llamada
de
la
interfaz
onLongClickListener, por el contrario, tiene la obligacin de devolver un valor booleano al marco Android. El
propsito de este valor de retorno es indicar al tiempo de ejecucin de Android o no la devolucin de llamada
se ha consumido el evento. Si la devolucin de llamada devuelve un valor verdadero, el evento se descarta
por el marco. Si, por el contrario, la devolucin de llamada devuelve un valor falso el marco Android
considerar el evento sigue siendo activo y en consecuencia va a pasar a lo largo del evento oyente prximo
juego que est registrado en la misma vista.
Al igual que con muchos conceptos de programacin que es, tal vez, el mejor demostrado con un ejemplo. El
primer paso es aadir un detector de eventos y el mtodo de devolucin de llamada durante largos clics a la
vista botn en la actividad de ejemplo:
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_event_example);
Botn Botn = (Button) findViewById (R.id.myButton);
189
button.setOnClickListener (
nueva Button.OnClickListener () {
public void onClick (Ver v) {
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText ("Botn de clic");
}
}
);
button.setOnLongClickListener (
nueva Button.OnLongClickListener () {
public boolean onLongClick (Ver v) {
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText ("botn Larga clic");
return true;
}
}
);
}
Es evidente que, cuando se detecta una pulsacin larga, el mtodo de devolucin de llamada onLongClick ()
mostrar "clic de botn largo" en la vista de texto. Tenga en cuenta, sin embargo, que el mtodo de
devolucin de llamada tambin devuelve un valor true para indicar que se ha consumido el evento. Compilar y
ejecutar la aplicacin y pulse y mantenga la punta del dedo sobre la vista botn hasta el botn "Larga haga
clic en" texto aparece en la vista de texto. Al soltar el botn, la vista de texto sigue mostrando el texto "botn
Larga clic" que indica que el mtodo de devolucin de llamada onClick () no fue llamado.
A continuacin, modifique el cdigo de tal manera que el mtodo onLongClick () ahora devuelve un valor
falso:
button.setOnLongClickListener (
nueva Button.OnLongClickListener () {
public boolean onLongClick (Ver v) {
TextView
myTextView
=
(TextView)
(R.id.myTextView);
myTextView.setText ("botn Larga clic");
return false;
}
}
);
findViewById
Una vez ms, compilar y ejecutar la aplicacin y realizar una pulsacin larga en el botn hasta que aparezca
el mensaje largo clic. Al soltar el botn de este tiempo, sin embargo, tenga en cuenta que la devolucin de
llamada onClick () tambin se activa y el texto cambia a "Botn de clic". Esto es porque el valor falso devuelto
190
por el mtodo de devolucin de llamada onLongClick () indica al marco Android que el evento no fue
consumido por el mtodo y era elegible para ser pasado a la siguiente oyente registrada en la vista. En este
caso, el tiempo de ejecucin determin que el OnClickListener en el botn tambin estaba interesado en los
eventos de este tipo y, posteriormente llamado el mtodo de devolucin de llamada onClick ().
Resumen
Una interfaz de usuario es de poca utilidad prctica si los puntos de vista que contiene no hacer nada en
respuesta a la interaccin del usuario. Android cierra la brecha entre la interfaz de usuario y el cdigo de
back-end de la aplicacin a travs de los conceptos de los detectores de eventos y los mtodos de devolucin
de llamada. La clase Android Ver define un conjunto de detectores de eventos, que pueden estar registradas
en objetos de vista. Cada detector de eventos tambin se ha asociado con un mtodo de devolucin de
llamada.
Cuando un evento tiene lugar en un punto de vista en una interfaz de usuario, ese evento se coloca en una
cola de eventos y manipulen en una primera entrada, primera salida por la base de tiempo de ejecucin de
Android. Si la vista en la que tuvo lugar el evento ha registrado un oyente que coincida con el tipo de evento,
se llama al mtodo de devolucin de llamada correspondiente. El mtodo de devolucin de llamada y luego
realiza las tareas requeridas por la actividad antes de regresar. Se requieren Algunos mtodos de devolucin
de llamada para devolver un valor booleano para indicar si el evento tiene que ser transmitida a otros
detectores de eventos registrados en la vista o descartados por el sistema.
Despus de haber cubierto los conceptos bsicos de la gestin de eventos, el prximo captulo explorar con
cierta profundidad el tema de los eventos de toque con un nfasis particular en el manejo de mltiples toques.
191
2 El objeto MotionEvent
9 Resumen
192
Como se indica en el ejemplo de cdigo, se requiere la devolucin de llamada onTouch () para devolver un
valor booleano que indica que el sistema de ejecucin de Android si el evento debe ser transmitida a otros
detectores de eventos registrados en el mismo punto de vista o desechados. El mtodo se pasa tanto una
referencia a la vista en la que se activa el evento y un objeto de tipo MotionEvent.
El objeto MotionEvent
El objeto MotionEvent pasado por el mtodo de devolucin de llamada onTouch () es la clave para la
obtencin de informacin sobre el evento. La informacin contenida en el objeto incluye la ubicacin del
contacto dentro de la vista y el tipo de accin realizada. El objeto MotionEvent es tambin la clave para el
manejo de mltiples toques.
escenario
multi-touch,
punteros
comienzan
terminan
con
acciones
de
eventos
de
tipo
193
ID. El nmero actual de punteros se puede obtener a travs de una llamada al mtodo getPointerCount () del
objeto MotionEvent actual. El ID de un puntero a un ndice determinado en la lista de punteros actuales se
puede obtener a travs de una llamada al mtodo MotionEvent getPointerId (). Por ejemplo, el siguiente
fragmento de cdigo obtiene un recuento de punteros y el ID del puntero en el ndice 0:
onTouch public boolean (Ver v, MotionEvent m) {
int pointerCount = m.getPointerCount ();
int pointerId = m.getPointerId (0);
return true;
}
Tenga en cuenta que el recuento de puntero siempre ser mayor que o igual a 1 cuando se llama a un
mtodo onTouch () (por lo menos desde un solo toque debe haber ocurrido para la devolucin de llamada
para ser activado).
Un toque en una vista, en particular uno que involucra el movimiento por la pantalla, va a generar una
corriente de los acontecimientos antes de que el punto de contacto con que se levante la pantalla. Como tal,
es probable que una aplicacin tendr que realizar un seguimiento de toques individuales a travs de
mltiples eventos tctiles. Mientras que el ID de un gesto tctil especfica no cambiar de un evento a otro, es
importante tener en cuenta que el valor del ndice cambiar a medida que otros eventos tctiles van y
vienen. Cuando se trabaja con un gesto contacto a travs de mltiples eventos, por lo tanto, es esencial que
el valor ID ser utilizado como la referencia de contacto con el fin de asegurarse de que el mismo toque est
siendo rastreado. Al llamar a mtodos que requieren un valor de ndice, este debe ser obtenido mediante la
conversin de la ID de un toque para el valor del ndice correspondiente a travs de una llamada al mtodo
findPointerIndex () del objeto MotionEvent.
194
en la herramienta Android Studio Designer. Una opcin es disear la disposicin ilustrada en la Figura 21-1
utilizando un RelativeLayout como la vista de la raz y teniendo en cuenta que el componente inferior
TextView se centra horizontalmente dentro de la vista de los padres y el TextView superior se coloca a una
distancia relativa por encima de la TextView inferior. Cuando el esquema de trazado se haya completado,
haga doble clic en el RelativeLayout (esencialmente el fondo de la disposicin) y establecer el ID de @ + /
Identificacin del RelativeLayout1. Repita estos pasos para asignar identificadores @ + / Identificacin del
textView1 y @ + / Identificacin del textView2 a los componentes TextView.
Como alternativa, cambie al editor XML seleccionando la ficha Texto en la parte inferior del panel Diseador y
reemplace el cdigo XML actual con el siguiente:
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
android: id = "@ + / Identificacin del RelativeLayout1"
android: layout_width = "fill_parent"
android: layout_height = "fill_parent">
<TextView
android:
android:
android:
android:
android:
android:
<TextView
android: id = "@ + / Identificacin del textView1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_above = "@ + / Identificacin del textView2"
android: layout_alignLeft = "@ + / Identificacin del textView2"
android: layout_marginBottom = "47dp"
android: text = "Toque Uno de estado" />
</ RelativeLayout>
195
Figura 21-1
Para recibir notificaciones de eventos tctiles ser necesario registrar un oyente toque en la vista
RelativeLayout1 dentro del mtodo onCreate () de la clase de actividad MotionEventActivity.Selecciona la
pestaa MotionEventActivity.java desde el panel editor de Android Studio para mostrar el cdigo
fuente. Dentro del mtodo onCreate (), agregue cdigo para identificar el objeto vista RelativeLayout, registrar
el detector tctil y aplicar el onTouch () mtodo de devolucin de llamada, que, en este caso, se va a llamar a
un segundo mtodo denominado handleTouch () a la que se pasa el MotionEvent objeto:
196
com.ebookfrenzy.motionevent paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.MotionEvent importacin;
android.view.View importacin;
android.widget.RelativeLayout importacin;
android.widget.TextView importacin;
public class MotionEventActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_motion_event);
RelativeLayout myLayout =
(RelativeLayout) findViewById (R.id.RelativeLayout1);
myLayout.setOnTouchListener (
nueva RelativeLayout.OnTouchListener () {
public boolean onTouch (Ver v,
MotionEvent m) {
handleTouch (m);
return true;
}
}
);
}
.
.
.
}
La ltima tarea antes de probar la aplicacin es poner en prctica el mtodo handleTouch () convocada por el
mtodo de devolucin de llamada onTouch (). El cdigo de este mtodo es el siguiente:
anular handleTouch (MotionEvent m)
{
TextView textView1 = (TextView) findViewById (R.id.textView1);
TextView textView2 = (TextView) findViewById (R.id.textView2);
int pointerCount = m.getPointerCount ();
for (int i = 0; i <pointerCount; i ++)
{
int x = (int) m.getX (i);
int y = (int) m.getY (i);
int id = m.getPointerId (i);
int action = m.getActionMasked ();
int actionindex = m.getActionIndex ();
197
ActionString String;
interruptor (accin)
{
caso MotionEvent.ACTION_DOWN:
actionString = "DOWN";
descanso;
caso MotionEvent.ACTION_UP:
actionString = "UP";
descanso;
caso MotionEvent.ACTION_POINTER_DOWN:
actionString = "RCNP DOWN";
descanso;
caso MotionEvent.ACTION_POINTER_UP:
actionString = "RCNP UP";
descanso;
caso MotionEvent.ACTION_MOVE:
actionString = "MOVE";
descanso;
por defecto:
actionString = "";
}
Cadena touchStatus = "Accin:" "ndice:" + + + actionString actionindex +
"ID:" + Identificacin + "X:" + x + "Y:" + y;
si (id == 0)
textView1.setText (touchStatus);
ms
textView2.setText (touchStatus);
}
}
Antes de compilar y ejecutar la aplicacin, vale la pena tomarse el tiempo para caminar a travs de este
cdigo de forma sistemtica para poner de relieve las tareas que se estn realizando. El cdigo empieza por
la obtencin de referencias a los dos objetos TextView en la interfaz de usuario e identificar el nmero de
punteros estn activos actualmente en la vista:
TextView textView1 = (TextView) findViewById (R.id.textView1);
TextView textView2 = (TextView) findViewById (R.id.textView2);
int pointerCount = m.getPointerCount ();
A continuacin, la variable pointerCount se utiliza para iniciar un bucle que realiza un conjunto de tareas para
cada puntero activo. Las primeras lneas del bucle obtener la coordenadas X e Y de la mano junto con el
correspondiente identificador de evento, tipo de accin y el ndice de la accin. Por ltimo, una variable de
cadena se declara:
for (int i = 0; i <pointerCount; i ++)
198
{
int x = (int) m.getX (i);
int y = (int) m.getY (i);
int id = m.getPointerId (i);
int action = m.getActionMasked ();
int actionindex = m.getActionIndex ();
ActionString String;
Desde los tipos de acciones equivalen a valores enteros, una sentencia switch se utiliza para convertir el tipo
de accin a un valor de cadena ms significativo, que se almacena en el declarada la variable actionString:
interruptor (accin)
{
caso MotionEvent.ACTION_DOWN:
actionString = "DOWN";
descanso;
caso MotionEvent.ACTION_UP:
actionString = "UP";
descanso;
caso MotionEvent.ACTION_POINTER_DOWN:
actionString = "RCNP DOWN";
descanso;
caso MotionEvent.ACTION_POINTER_UP:
actionString = "RCNP UP";
descanso;
caso MotionEvent.ACTION_MOVE:
actionString = "MOVE";
descanso;
por defecto:
actionString = "";
}
Por ltimo, el mensaje de cadena se construye utilizando el valor actionString, el ndice de accin, el tacto ID
y coordenadas X e Y. El valor de ID se utiliza para decidir si la cadena se debe mostrar en el primer o
segundo objeto TextView:
Cadena touchStatus = "Accin:" + actionString + "ndice"
+ Actionindex + "ID:" + Identificacin + "X:" + x + "Y:" + y;
si (id == 0)
textView1.setText (touchStatus);
ms
textView2.setText (touchStatus);
199
Figura 21-2
Resumen
200
6 Prueba de la aplicacin
7 Resumen
201
Los pasos bsicos en la deteccin de los gestos comunes son los siguientes:
1. Declaracin de una clase que implementa la interfaz GestureDetector.OnGestureListener incluyendo el
onFling requerido (), onDown (), onscroll (), onShowPress, onSingleTapUp () y onLongPress () los mtodos de
devolucin de llamada. Tenga en cuenta que esto puede ser o bien una clase completamente nueva, o la
clase de actividad de encerramiento. En el caso de que se requiere la deteccin de doble toque gesto, la
clase debe implementar la interfaz GestureDetector.OnDoubleTapListener e incluir el mtodo onDoubleTap
correspondiente ().
2. Creacin de una instancia de la clase Android GestureDetectorCompat, pasando por una instancia de la
clase creada en el paso 1 como argumento.
3. Una llamada opcional al mtodo setOnDoubleTapListener () de la instancia GestureDetectorCompat para
permitir la deteccin de doble toque si es necesario.
4. Aplicacin del mtodo de devolucin de llamada onTouchEvent () sobre la actividad que encierra el cual, a
su vez, debe llamar al mtodo onTouchEvent () de la instancia GestureDetectorCompat, pasando por el
objeto de evento de movimiento actual como argumento para el mtodo.
Una vez implementado, el resultado es un conjunto de mtodos en el cdigo de la aplicacin que se llamar
cuando se detecta un gesto de un tipo particular. El cdigo dentro de estos mtodos puede entonces ser
implementado para realizar las tareas que deben realizarse en respuesta al gesto correspondiente.
En el resto de este captulo, vamos a trabajar a travs de la creacin de un proyecto de ejemplo que nos
permitir mantener los pasos anteriores en prctica.
202
Dentro de la herramienta de diseo, haga doble clic en el Hola, mundo! TextView componentes y, en la
ventana emergente de propiedades, introduzca gestureStatusText como ID. Finalmente, mueva el TextView
de modo que se posiciona en el centro de la pantalla.
y,
si
se
requiere
la
deteccin
de
doble
toque,
la
interfaz
GestureDetector.OnDoubleTapListener. Mientras que esto puede ser una clase completamente nueva,
tambin es perfectamente vlida para implementar esta dentro de la clase de actividad actual.Para los fines
de este ejemplo, por lo tanto, vamos a modificar la clase CommonGesturesActivity para implementar estas
interfaces oyentes. Edite el archivo CommonGesturesActivity.java para que se lea de la siguiente manera
para declarar las interfaces y para extraer y almacenar una referencia al componente TextView en la interfaz
de usuario:
com.ebookfrenzy.commongestures paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.GestureDetector importacin;
android.widget.TextView importacin;
Declarando que la clase implementa los mandatos de interfaces de escucha que los mtodos
correspondientes tambin se implementan en la clase:
com.ebookfrenzy.commongestures paquete;
android.support.v7.app.ActionBarActivity importacin;
203
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.GestureDetector importacin;
android.widget.TextView importacin;
android.view.MotionEvent importacin;
204
return true;
}
@ Override
onDoubleTap public boolean (evento MotionEvent) {
gestureText.setText ("onDoubleTap");
return true;
}
@ Override
onDoubleTapEvent public boolean (evento MotionEvent) {
gestureText.setText ("onDoubleTapEvent");
return true;
}
@ Override
public boolean onSingleTapConfirmed (evento MotionEvent) {
gestureText.setText ("onSingleTapConfirmed");
return true;
}
.
.
.
}
Tenga en cuenta que todos estos mtodos devuelven verdadero. Esto indica al Marco de Android que el
evento ha sido consumido por el mtodo y no necesita ser pasado al siguiente controlador de eventos en la
pila.
com.ebookfrenzy.commongestures.commongestures paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.GestureDetector importacin;
android.widget.TextView importacin;
android.view.MotionEvent importacin;
android.support.v4.view.GestureDetectorCompat importacin;
205
Si la solicitud fuera a ser compilado y ejecutar en este punto, no pasara nada si los gestos se realizaron en la
pantalla del dispositivo. Esto es porque no hay cdigo ha sido aadido a interceptar eventos tctiles y pase a
travs de ellos a la instancia GestureDetectorCompat. Con el fin de lograr esto, es necesario reemplazar el
mtodo onTouchEvent () dentro de la clase de actividad y ponerlo en prctica de tal manera que llama al
mtodo
onTouchEvent
()
de
la
instancia
GestureDetectorCompat. Permanecer
en
el
archivo
CommonGesturesActivity.java, por lo tanto, poner en prctica este mtodo para que se lea de la siguiente
manera:
@ Override
onTouchEvent public boolean (evento MotionEvent) {
this.gDetector.onTouchEvent (evento);
// Asegrese de llamar a la implementacin de la superclase
volver super.onTouchEvent (evento);
}
Prueba de la aplicacin
Compila y ejecuta la aplicacin en un dispositivo Android, ya sea fsico o un emulador AVD. Una vez puesto
en marcha, experimentar con golpes, prensas, movimientos de desplazamiento y grifos dobles e
206
individuales. Tenga en cuenta que la vista se actualiza texto para reflejar los acontecimientos tal como se
ilustra en la Figura 22-1:
Figura 22-1
Resumen
Cualquier contacto fsico entre el usuario y la pantalla tctil de un dispositivo puede ser considerado como un
"gesto". Careciendo el teclado fsico y el puntero del ratn de un sistema de ordenador tradicional, los gestos
se utilizan ampliamente como un mtodo de interaccin entre el usuario y la aplicacin. Mientras que un gesto
puede estar compuesto por casi cualquier secuencia de movimientos, hay un conjunto ampliamente utilizado
de gestos con los que los usuarios de los dispositivos de pantalla tctil han familiarizado. Un nmero de estos
llamados "gestos comunes" se puede detectar fcilmente dentro de una aplicacin, haciendo uso de las
207
clases Detector Gesto Android. En este captulo, el uso de esta tcnica se ha descrito tanto en la teora como
a travs de la implementacin de un proyecto de ejemplo.
Tener gestos comunes tratados en este captulo, el siguiente captulo se ver en la deteccin de una gama
ms amplia de tipos de gestos, incluyendo la capacidad de diseo y detectar sus propios gestos.
208
2 El GestureOverlayView Clase
3 La deteccin de gestos
14 Prueba de la aplicacin
15 Configuracin de la GestureOverlayView
16 Gestos Interceptar
19 Resumen
209
la aplicacin Generador de Gesto, ya sea en un dispositivo fsico o emulador, y "dibujar" los gestos que
necesitarn ser detectado por la aplicacin. Una vez que los gestos se han diseado, el archivo que contiene
los datos de gestos se puede sacar la tarjeta SD del dispositivo o emulador y ha aadido que el proyecto de
aplicacin. Dentro del cdigo de la aplicacin, el archivo se carga en una instancia de la clase GestureLibrary
donde se puede utilizar para buscar coincidencias con los gestos realizados por el usuario en la pantalla del
dispositivo.
La Clase GestureOverlayView
Con el fin de facilitar la deteccin de gestos dentro de una aplicacin, el SDK de Android proporciona la clase
GestureOverlayView. Esta es una vista transparente que se puede colocar sobre otras vistas en la interfaz de
usuario para el nico propsito de gestos de deteccin.
La deteccin de gestos
Los gestos son detectados por la carga del archivo gestos creado utilizando la aplicacin Generador de Gesto
y luego registrar un detector de eventos GesturePerformedListener en una instancia de la clase
GestureOverlayView. La clase envolvente se declar entonces para implementar tanto la interfaz
OnGesturePerformedListener y el mtodo de devolucin de llamada onGesturePerformed correspondiente
requerida por dicha interfaz. En el caso de que un gesto es detectado por el oyente, una llamada al mtodo
de devolucin de llamada onGesturePerformed es desencadenada por el sistema de ejecucin de Android.
210
Para instalar y construir la utilidad GestureBuilder, comenzar con la instalacin de las muestras de SDK. Para
ello, abra el Administrador de Android SDK seleccionando Herramientas -> Android -> opcin de barra de
men Administrador SDK desde la ventana principal del proyecto.
Una vez que el administrador haya cargado, localizar las muestras para el paquete SDK situado debajo de la
seccin para la versin de Android para el que est desarrollando actualmente (por ejemplo, Android 5.0.1
(API 21)). Si el paquete no est instalado, establezca la casilla junto al paquete y haga clic en el botn Instalar
1 Paquete para iniciar la instalacin.
Una vez completada la instalacin, las muestras de SDK se instalarn en el directorio siguiente (donde
<path_to_installation> representa la ubicacin en su sistema en el que el SDK se instal originalmente como
se muestra en la parte superior de la ventana del Administrador de SDK):
<Path_to_installation> / sdk / samples / android-21
El cdigo fuente de la aplicacin Generador de Gesto se encuentra dentro de este directorio en una carpeta
denominada GestureBuilder dentro de la subcarpeta legado.
Desde la ventana principal de Android Estudio de un proyecto existente, seleccione Archivo -> opcin
Importar proyecto ... del men y, en el cuadro de dilogo resultante, busque y seleccione la carpeta
GestureBuilder dentro del directorio de ejemplos del SDK y haga clic en Aceptar. Confirme el directorio de
destino y haga clic en Siguiente seguido Finalizar para aceptar la configuracin predeterminada en la pantalla
final. En este punto, Android Estudio importar el proyecto en la carpeta designada y convertirlo para que
coincida con el archivo de proyecto Android Estudio y construir la estructura.
Una vez importados, instalar y ejecutar la utilidad GestureBuilder en un dispositivo Android conectado al
sistema de desarrollo.
211
Figura 23-1
Despus de que el gesto se ha guardado, la aplicacin Generador de Gesto mostrar una lista de gestos
definidos actualmente, que, en este punto, consistirn nicamente de la nueva Gesto Circle.
Repita el proceso de creacin de gesto para agregar un gesto ms para el archivo. Esto debera implicar un
gesto de dos tiempos creando una X en la pantalla el nombre X Gesto. Al crear gestos que implican mltiples
golpes, asegrese de dejar el menor tiempo posible entre cada carrera para que el constructor sabe que los
golpes son parte de un mismo gesto. Una vez que este gesto se ha aadido, la lista dentro de la aplicacin
Constructor gesto debe ser similar a la expuesta en la Figura 23-2:
212
Figura 23-2
Con el fin de tirar de los gestos archivo del emulador en el ejemplo anterior y colocarlo en el directorio de
trabajo actual de la ventana del smbolo del Terminal o Comando, necesitara el siguiente comando para
ejecutar:
adb -s-emulador 5554 tirn / sdcard / gestos.
Alternativamente, el archivo de gestos se puede tirar desde un dispositivo conectado a travs de adb con el
comando siguiente (donde se utiliza la bandera -d para indicar un dispositivo fsico):
adb -d tirn / sdcard / gestos.
213
Una vez que el archivo de gestos ha sido creado y se quit la tarjeta SD, est listo para ser aadido a un
proyecto Android Studio como un archivo de recursos. El siguiente paso, por lo tanto, es crear un nuevo
proyecto.
214
Vuelva al modo Diseo, busque la seccin de Expertos de la paleta y arrastrar y soltar un objeto
GestureOverlayView al lienzo de diseo. Seleccione la instancia GestureOverlayView en el diseo y el uso de
los paneles o de la barra de herramientas Diseador botones Propiedades para cambiar el diseo: la anchura
y el diseo: altura propiedades a match_parent para que la vista se llena el espacio disponible.
Haga doble clic en la instancia GestureOverlayView y utilizar el panel de propiedades emergente para
cambiar el ID de @ + / Identificacin del GOverlay. Cuando se haya completado, el archivo
activity_custom_gestures.xml debera decir lo siguiente:
<LinearLayout
android: orientacin = "vertical"
android: layout_width = "fill_parent"
android: layout_height = "fill_parent"
xmlns: android = "http://schemas.android.com/apk/res/android"
android: weightSum = "1">
<Android.gesture.GestureOverlayView
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: id = "@ + / Identificacin del GOverlay"
android: layout_gravity = "center_horizontal">
</android.gesture.GestureOverlayView>
</ LinearLayout>
extiende
ActionBarActivity
implementa
215
gLibrary =
GestureLibraries.fromRawResource (esto, R.raw.gestures);
if (! gLibrary.load ()) {
acabado ();
}
}
.
.
.
}
Adems de algunas directivas de importacin necesarios, los cambios de cdigo anteriores al mtodo
onCreate () tambin crean una instancia GestureLibrary llamado gLibrary y luego cargas en ella el contenido
del archivo de gestos ubicado en la carpeta de recursos en bruto. La clase de actividad tambin se ha
modificado para implementar la interfaz OnGesturePerformedListener, que requiere la aplicacin del mtodo
de devolucin de llamada onGesturePerformed (que se cre en una seccin posterior de este captulo).
216
android.view.Menu importacin;
android.view.MenuItem importacin;
android.gesture.GestureLibraries de importacin;
android.gesture.GestureLibrary importacin;
android.gesture.GestureOverlayView importacin;
android.gesture.GestureOverlayView.OnGesturePerformedListener importacin;
android.gesture.Prediction importacin;
android.widget.Toast importacin;
android.gesture.Gesture importacin;
java.util.ArrayList importacin;
public
class
CustomGesturesActivity
OnGesturePerformedListener {
extiende
ActionBarActivity
implementa
Cuando un gesto en la vista de superposicin de objetos gesto es detectado por el tiempo de ejecucin de
Android, se llama al mtodo onGesturePerformed. Paso a travs de como argumentos son una referencia al
objeto GestureOverlayView en el que se detect el gesto junto a un objeto de tipo de gestos. La clase Gesto
217
est diseado para contener la informacin que define un gesto especfico (esencialmente una secuencia de
puntos cronometrados en la pantalla que representa la trayectoria de los trazos que comprenden un gesto).
El objeto se pasa a travs de gestos con el mtodo de reconocer () de nuestro ejemplo gLibrary, el propsito
de los cuales es comparar el gesto actual con cada gesto cargado desde los gestos presentar. Una vez que
esta tarea se ha completado, la reconocen () devuelve un objeto ArrayList que contiene un objeto de
prediccin para cada comparacin realizada. La lista est clasificada en orden desde el mejor partido (en la
posicin 0 de la matriz) para lo peor. Contenido dentro de cada objeto prediccin es el nombre de la
correspondiente gesto del archivo de gestos y una puntuacin de prediccin que indica cun estrechamente
coincide con el gesto actual.
El cdigo en el mtodo anterior, por lo tanto, lleva a la prediccin en la posicin 0 (el valor ms cercano) se
asegura de que tiene una puntuacin superior a 1,0 y luego muestra un mensaje de Brindis (una clase de
Android diseada para mostrar la notificacin pop ups para el usuario) que muestra el nombre del gesto a
juego.
Prueba de la aplicacin
Genere y ejecute la aplicacin a ambos un emulador o en un dispositivo Android fsica y realizar los gestos
circulares y banda magntica en la pantalla. Cuando se realiza la notificacin tostadas debera aparecer que
contiene el nombre del gesto que se realiz. Tenga en cuenta, sin embargo, que al intentar realizar la X gesto
que el gesto no se reconoce. Adems, tenga en cuenta que cuando se reconoce un gesto, se perfila en la
pantalla con una lnea de color amarillo brillante, mientras que los gestos de la que la superposicin es
incierto aparecen como una lnea amarilla descolorida. Mientras til durante el desarrollo, esto probablemente
no es ideal para una aplicacin en el mundo real. Es evidente, por lo tanto, todava hay ms trabajo de
configuracin que hacer.
218
En volver a ejecutar la aplicacin, los gestos deben ahora ser invisible (ya que se dibujan en blanco en el
fondo blanco de la vista LinearLayout).
Interceptar Gestos
El GestureOverlayView es, como se ha descrito anteriormente, una cubierta transparente que puede ser
colocado sobre la parte superior de otras vistas. Esto lleva a la pregunta de si los eventos interceptados por la
superposicin gesto entonces deben ser transmitidos a las vistas subyacentes cuando un gesto ha sido
reconocido. Esto se controla a travs del androide: eventsInterceptionEnabled propiedad de la instancia
GestureOverlayView. Cuando se define como true, los eventos de gestos no se pasan a las vistas
subyacentes cuando se reconoce un gesto.Esto puede ser un ajuste particularmente til cuando se estn
realizando gestos sobre una vista que podran ser configurado para desplazarse en respuesta a ciertos
gestos. Al establecer esta propiedad en true evitar gestos tambin est siendo interpretado como
instrucciones para la vista subyacente para desplazarse en una direccin particular.
219
En la pantalla de factores de forma, active la opcin Telfono y Tablet y establecer la configuracin de la API
de 8 SDK mnimo: Android 2.2 (Froyo). Continuar para proceder a travs de las pantallas, que solicita la
creacin de una actividad en blanco denominada PinchExampleActivity con archivos de diseo y de recursos
men nombrados activity_pinch_example y menu_pinch_example respectivamente.
Dentro del archivo activity_pinch_example.xml, busque el objeto TextView y haga doble clic en l para
cambiar el ID de myTextView.Localizar y cargar el archivo en el editor PinchExampleActivity.java Android
Studio y modificar el archivo de la siguiente manera:
com.ebookfrenzy.pinchexample paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.MotionEvent importacin;
android.view.ScaleGestureDetector importacin;
android.view.ScaleGestureDetector.SimpleOnScaleGestureListener importacin;
android.widget.TextView importacin;
public class PinchExampleActivity extiende ActionBarActivity {
TextView scaleText;
ScaleGestureDetector scaleGestureDetector;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_pinch_example);
scaleText = (TextView) findViewById (R.id.myTextView);
scaleGestureDetector =
nueva ScaleGestureDetector (esto,
nueva MyOnScaleGestureListener ());
}
@ Override
onTouchEvent public boolean (evento MotionEvent) {
scaleGestureDetector.onTouchEvent (evento);
return true;
}
public class MyOnScaleGestureListener extiende
SimpleOnScaleGestureListener {
@ Override
onScale public boolean (detector ScaleGestureDetector) {
flotar scaleFactor = detector.getScaleFactor ();
si (scaleFactor> 1) {
scaleText.setText ("Zoom Out");
220
} Else {
scaleText.setText ("Zoom In");
}
return true;
}
@ Override
onScaleBegin public boolean (detector ScaleGestureDetector) {
return true;
}
@ Override
public void onScaleEnd (detector ScaleGestureDetector) {
}
}
.
.
.
}
El cdigo empieza por declarar variables TextView y ScaleGestureDetector. Una nueva clase llamada
MyOnScaleGestureListener se declara que se extiende la clase Android SimpleOnScaleGestureListener. Esta
interfaz requiere que tres mtodos (onScale (), onScaleBegin () y onScaleEnd ()) de su ejecucin. En este
caso el mtodo onScale () identifica el factor de escala y muestra un mensaje en la vista de texto que indica el
tipo de gesto de pellizcar detectado.
Dentro del mtodo onCreate (), se obtiene una referencia al objeto de vista de texto y se asigna a la variable
scaleText. A continuacin, se crea una nueva instancia ScaleGestureDetector, pasando a travs de una
referencia a la actividad de encerramiento y una instancia de nuestra nueva clase MyOnScaleGestureListener
como argumentos. Por ltimo, un onTouchEvent () mtodo de devolucin de llamada se implementa para la
actividad, que simplemente llama al mtodo del objeto ScaleGestureDetector correspondiente onTouchEvent
(), pasando por el objeto MotionEvent como argumento.
Compilar y ejecutar la aplicacin en un dispositivo Android fsica y realizar pellizcos gestos en la pantalla, y
seal que la vista de texto muestra ya sea el zoom o alejar el mensaje en funcin del movimiento de pellizco.
Resumen
Un gesto es esencialmente el movimiento de puntos de contacto en una pantalla tctil que implican uno o ms
golpes y puede ser utilizado como un mtodo de comunicacin entre el usuario y la aplicacin. Android
permite gestos para ser diseados utilizando la aplicacin Generador de Gesto. Una vez creados, los gestos
se pueden guardar en un archivo de gestos y se cargan en una actividad en tiempo de ejecucin de
aplicaciones utilizando la GestureLibrary.
Los gestos se pueden detectar en las reas de la pantalla mediante la superposicin de puntos de vista
existentes con instancias de la clase GestureOverlayView transparente e implementacin de un detector de
221
eventos OnGesturePerformedListener. Utilizando el GestureLibrary, una lista clasificada de los partidos entre
un gesto realizado por el usuario y los gestos almacenados en un archivo gestos se puede generar, mediante
una puntuacin de prediccin para decidir si un gesto es un partido lo suficientemente cerca.
222
1 Qu es un fragmento?
2 Creacin de un fragmento
7 Resumen
Qu es un fragmento?
Un fragmento es una seccin modular autnomo de la interfaz de usuario de una aplicacin y el
comportamiento correspondiente que puede ser embebido dentro de una actividad. Los fragmentos se
pueden ensamblar para crear una actividad durante la fase de diseo de la aplicacin, y se aade a, o se
quitan de una actividad durante el tiempo de ejecucin de aplicaciones para crear una interfaz de usuario que
cambia dinmicamente.
Fragmentos slo pueden ser utilizados como parte de una actividad y no puede ser instanciada como
elementos aplicacin independiente. Dicho esto, sin embargo, un fragmento puede ser pensado como un
"sub-actividad" funcional con su propio ciclo de vida similar a la de una actividad completa.
Los fragmentos se almacenan en forma de archivos de diseo XML y pueden ser aadidos a una actividad ya
sea mediante la colocacin apropiada <fragmento> elementos en fichero de layout de la actividad, o
directamente a travs de cdigo dentro de implementacin de la clase de la actividad.
Antes de comenzar a utilizar fragmentos de una aplicacin para Android, es importante tener en cuenta que
los fragmentos no se introdujeron a Android hasta la versin 3.0 del SDK de Android. Una aplicacin que
utiliza fragmentos deben, por lo tanto, hacer uso de el androide-support-v4 Android Soporte Biblioteca con el
fin de ser compatible con las versiones de Android de mayor edad. Los pasos para lograrlo se tratarn en el
prximo captulo, titulado Uso de fragmentos en Android Studio - Un Ejemplo .
223
Creacin de un Fragmento
Los dos componentes que componen un fragmento son un archivo de diseo XML y una clase Java
correspondiente. El archivo de diseo XML para un fragmento lleva el mismo formato que un diseo para
cualquier otra disposicin de la actividad y puede contener cualquier combinacin y complejidad de los
controladores de distribucin y puntos de vista. El siguiente distribucin XML, por ejemplo, es para un
fragmento que consta simplemente de un RelativeLayout con un fondo rojo que contiene un nico TextView:
<? Xml version = "1.0" encoding = "UTF-8"?>
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: fondo = "@ / color rojo">
<TextView
android: id = "@ + / Identificacin del textView1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_centerHorizontal = "true"
android: layout_centerVertical = "true"
android: text = "@ string / fragone_label_text"
android: textAppearance = "android:? attr / textAppearanceLarge" />
</ RelativeLayout>
La clase correspondiente a ir con el diseo debe ser una subclase de la clase Fragmento Android. Si la
solicitud es para ser compatible con los dispositivos que ejecutan versiones de Android anteriores a la versin
3.0, el archivo de clase debe importar android.support.v4.app.Fragment. La clase debe, como mnimo,
reemplazar el mtodo onCreateView (), que es responsable de cargar el diseo fragmento. Por ejemplo:
com.example.myfragmentdemo paquete;
android.os.Bundle importacin;
android.support.v4.app.Fragment importacin;
android.view.LayoutInflater importacin;
android.view.View importacin;
android.view.ViewGroup importacin;
public class FragmentOne extiende Fragmento {
@ Override
pblica Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup,
Bundle savedInstanceState) {
// Inflar el diseo de este fragmento
volver inflater.inflate (R.layout.fragment_one_layout,
contenedor, false);
}
}
Adems del mtodo onCreateView (), la clase tambin puede anular los mtodos de ciclo de vida estndar.
Tenga en cuenta que con el fin de hacer que el fragmento anterior compatible con las versiones de Android
anteriores a la versin 3.0, la clase Fragmento de la biblioteca de soporte v4 se ha importado.
224
Una vez que se han creado la disposicin fragmento y la clase, el fragmento est listo para ser utilizado
dentro de las actividades de aplicacin.
Los fragmentos estn incrustados en archivos de diseo de actividad utilizando el <fragmento> elemento. El
siguiente ejemplo de diseo incorpora el fragmento creado en la seccin anterior de este captulo en una
maquetacin de la actividad:
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
herramientas: context = ". FragmentDemoActivity">
<Fragmento
android: id = "@ + / Identificacin del fragment_one"
android: name = "com.example.myfragmentdemo.myfragmentdemo.FragmentOne"
android: layout_width = "match_parent"
android: layout_height = "wrap_content"
android: layout_alignParentLeft = "true"
android: layout_centerVertical = "true"
herramientas de diseo: = "@ diseo / fragment_one_layout" />
225
</ RelativeLayout>
Las propiedades clave dentro de la <fragmento> elemento son android: nombre, que debe hacer referencia a
la clase asociada con el fragmento y herramientas: diseo, que debe hacer referencia al archivo de recursos
XML que contiene la disposicin del fragmento.
Una vez aadido a la disposicin de una actividad, los fragmentos pueden ser vistos y manipulados dentro de
la herramienta Android Studio Designer. Figura 24-1, por ejemplo, muestra la disposicin anterior con el
fragmento incrustado dentro Diseador Android Estudio:
Figura 24-1
226
Cuando se utiliza cdigo para administrar fragmentos, el propio fragmento todava consistir en un archivo de
diseo XML y una clase correspondiente. La diferencia viene cuando se trabaja con el fragmento dentro de la
actividad de alojamiento. Hay una secuencia estndar de pasos cuando se aade un fragmento a una
actividad utilizando el cdigo. Estos pasos son los siguientes:
1. Crear una instancia de la clase del fragmento.
2. Pasar argumentos adicionales a travs de la intencin a la clase.
3. Obtener una referencia a la instancia del gestor de fragmentos.
4. Llame al mtodo beginTransaction () en la instancia del gestor de fragmentos. Esto devuelve una instancia
de transaccin fragmento.
5. Llame al mtodo de la instancia de transaccin fragmento add (), pasando por como argumentos el
identificador de recursos de la opinin de que es contener el fragmento y fragmento de la instancia de clase.
6. Llame al mtodo commit () de la transaccin fragmento.
El siguiente cdigo, en aras de un ejemplo, aade un fragmento definido por la clase FragmentOne para que
aparezca en la vista de contenedor con un id de LinearLayout1:
FragmentOne firstFragment = new FragmentOne ();
firstFragment.setArguments (getIntent () getExtras ().);
FragmentManager fragManager = getSupportFragmentManager ();
FragmentTransaction transaccin = fragManager.beginTransaction ();
transaction.add (R.id.LinearLayout1, firstFragment);
transaction.Commit ();
El cdigo anterior se descompone cada paso en una declaracin separada a los efectos de claridad. Las
ltimas cuatro lneas pueden, sin embargo, ser abreviados en una sola lnea de cdigo de la siguiente
manera:
getSupportFragmentManager (). beginTransaction ()
.add (R.id.LinearLayout1, firstFragment) .commit ();
Una vez aadido a un contenedor, un fragmento posteriormente puede ser eliminado a travs de una llamada
al mtodo remove () de la instancia de transaccin fragmento, pasando a travs de una referencia a la
instancia fragmento que se va a quitar:
transaction.remove (firstFragment);
Del mismo modo, un fragmento puede ser reemplazado con otro por una llamada al mtodo replace () de la
instancia de transaccin fragmento. Esto toma como argumentos el id de la vista que contiene el fragmento y
una instancia del nuevo fragmento. El fragmento reemplazado tambin se puede colocar en lo que se conoce
como la pila de atrs de modo que se puede restaurar rpidamente en el caso de que el usuario navega de
nuevo a l. Esto se logra mediante una llamada al mtodo addToBackStack () del objeto de transaccin
fragmento antes de hacer el commit () llamada al mtodo:
227
En el caso de interceptar eventos de clic, el segundo enfoque implic establecer el androide: propiedad
onClick en el archivo de diseo XML:
<Botn
android:
android:
android:
android:
android:
La regla general para los eventos generados por una vista en un fragmento es que si el detector de eventos
fue declarado en la clase fragmento utilizando el enfoque de detector de eventos y el mtodo de devolucin
de llamada, entonces el caso ser manejado por primera vez por el fragmento. Si el android: onClick se utiliza
de recursos, sin embargo, el evento se pasa directamente a la actividad que contiene el fragmento.
228
Para que una actividad para comunicarse con un fragmento, la actividad debe identificar el objeto fragmento a
travs de la ID asignado a l usando el mtodo findViewById (). Una vez obtenida esta referencia, la actividad
slo puede llamar a los mtodos pblicos del objeto fragmento.
La comunicacin en la otra direccin (de fragmento a la actividad) es un poco ms complicado. En el primer
caso, el fragmento debe definir una interfaz de escucha, que se implementa a continuacin, dentro de la clase
de actividad. Por ejemplo, el cdigo siguiente declara una interfaz llamada ToolbarListener en una clase
fragmento llamado ToolbarFragment. El cdigo tambin declara una variable en la que ms adelante se
almacena una referencia a la actividad:
public class ToolbarFragment extiende Fragmento {
ToolbarListener activityCallback;
interfaz pblica ToolbarListener {
onButtonClick void (int posicin, texto String) pblica;
}
.
.
}
El cdigo anterior dicta que cualquier clase que implemente la interfaz ToolbarListener tambin debe
implementar un mtodo de devolucin de llamada con nombre onButtonClick que, a su vez, acepta un entero
y una cadena como argumentos.
A continuacin, el mtodo onAttach () de la clase fragmento debe ser anulado e implementado. Este mtodo
es llamado automticamente por el sistema Android cuando el fragmento se ha inicializado y se asocia con
una actividad. El mtodo se pasa una referencia a la actividad en la que se contiene el fragmento. El mtodo
debe almacenar una referencia local para esta actividad y verificar que implementa la interfaz ToolbarListener:
@ Override
public void onAttach (actividad Actividad) {
super.onAttach (actividad);
tratar {
activityCallback = actividad (ToolbarListener);
} Catch (ClassCastException e) {
throw new ClassCastException (activity.toString ()
+ "Debe implementar ToolbarListener");
}
}
Tras la ejecucin de este ejemplo, una referencia a la actividad se almacena en la variable activityCallback
local y una excepcin ser lanzada si esa actividad no implementa la interfaz ToolbarListener.
El siguiente paso es llamar al mtodo de devolucin de llamada de la actividad desde dentro del
fragmento. Cundo y cmo esto sucede es totalmente dependiente de las circunstancias en que la actividad
tiene que ser contactado por el fragmento. En aras de un ejemplo, el cdigo siguiente llama al mtodo de
devolucin de llamada en la actividad cuando se hace clic en un botn:
public void buttonClicked (Ver vista) {
229
Todo lo que queda es modificar la clase de actividad para que se implemente la interfaz ToolbarListener. Por
ejemplo:
public class FragmentExampleActivity extiende implementos FragmentActivity
ToolbarFragment.ToolbarListener {
pblica onButtonClick void (String arg1, arg2 int) {
// Implementar cdigo para el mtodo de devolucin de llamada
}
.
.
}
Como podemos ver en el cdigo anterior, la actividad declara que implementa la interfaz ToolbarListener de la
clase ToolbarFragment y luego procede a aplicar el mtodo onButtonClick () como es requerido por la
interfaz.
Resumen
Fragmentos proporcionan un poderoso mecanismo para la creacin de mdulos reutilizables de diseo de la
interfaz de usuario y comportamiento de la aplicacin, que, una vez creado, puede ser embebido en las
actividades. Un fragmento consiste en un archivo de diseo de interfaz de usuario y una clase. Los
fragmentos se pueden utilizar en una actividad, ya sea aadiendo el fragmento de archivo de diseo de la
actividad, o escribiendo cdigo para gestionar los fragmentos en tiempo de ejecucin. Fragmentos aadido a
una actividad en el cdigo pueden ser removidos y reemplazados dinmicamente en tiempo de
ejecucin. Toda la comunicacin entre los fragmentos se debe realizar a travs de la actividad dentro de la
cual estn incrustadas las actividades.
Despus de haber cubierto los conceptos bsicos de fragmentos en este captulo, el captulo siguiente
( Usando fragmentos en Android Studio - Un Ejemplo ) trabajar a travs de un tutorial diseado para reforzar
las tcnicas descritas en este captulo.
230
9 Prueba de la aplicacin
10 Resumen
231
Dado que esta solicitud est destinada a trabajar en las versiones anteriores de Android, sino que tambin
ser necesario hacer uso de la biblioteca de soporte Android apropiado.
men
correspondientes
nombrados
activity_fragment_example
menu_fragment_example
respectivamente.
Haga clic en el botn Finalizar para iniciar el proceso de creacin del proyecto.
232
Figura 25-1
<EditarTexto
android: id = "@ + / Identificacin del editText1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_alignParentTop = "true"
android: layout_centerHorizontal = "true"
android: layout_marginTop = "16dp"
android: ems = "10"
android: InputType = "text">
<RequestFocus />
</ EditarTexto>
<SeekBar
android:
android:
android:
android:
android:
android:
</ RelativeLayout>
Una vez se han realizado los cambios, cambiar la herramienta Diseador de nuevo a modo de
diseo. Seleccione la vista botn y haga clic en el icono de la bombilla seguido del mensaje I18N para mostrar
el dilogo de Recursos Extraer. Nombre del button_text de recursos y haga clic en Aceptar para crear un
recurso de cadena para el botn.
233
Al trmino de estos pasos, el diseo de la interfaz de usuario debe parecerse a la de la Figura 25-2:
Figura 25-2
Con la disposicin para el primer fragmento implementado, el siguiente paso es crear una clase para ir con
ella.
234
Por el momento, los nicos cambios en esta clase son para agregar algunas directivas de importacin y
reemplazar el mtodo onCreateView () para asegurarse de que el archivo de diseo se infla y se muestra
cuando se utiliza el fragmento dentro de una actividad. La declaracin de la clase tambin debe indicar que la
clase ampla la clase Fragmento Android:
com.ebookfrenzy.fragmentexample paquete;
android.os.Bundle importacin;
android.support.v4.app.Fragment importacin;
android.view.LayoutInflater importacin;
android.view.View importacin;
android.view.ViewGroup importacin;
public class ToolbarFragment extiende Fragmento {
@ Override
pblica Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup, Bulto
savedInstanceState) {
// Inflar el diseo de este fragmento
Ver view = inflater.inflate (R.layout.toolbar_fragment,
contenedor, false);
vista regresar;
}
}
235
Ms adelante en este captulo, se agregar ms funcionalidad a esta clase. Antes de eso, sin embargo,
tenemos que crear el segundo fragmento.
</ RelativeLayout>
Una vez se han realizado los cambios XML, volver al modo Diseo, seleccione el componente TextView y
haga clic en el icono de bombilla seguido del mensaje I18N para mostrar el dilogo de Recursos
Extraer. Nombre del text_label de recursos y haga clic en Aceptar para crear un recurso de cadena para el
botn. Al completar estos pasos, el diseo de la interfaz de usuario para este segundo fragmento debe ser
similar a la de la Figura 25-3:
236
Figura 25-3
Al igual que con el primer fragmento, ste tambin tendr que tener una clase asociada a ella. Haga click en
la aplicacin -> Java -> com.ebookfrenzy.fragmentexample en la ventana de herramientas del proyecto. En el
men resultante, seleccione la Nueva opcin -> Clase Java. Nombre del TextFragment fragmento y haga clic
en Aceptar para crear la clase.
Edite el nuevo archivo de clase TextFragment.java y modificarlo para implementar el mtodo onCreateView ()
y designar a la clase que extiende la clase Android Fragmento:
237
com.ebookfrenzy.fragmentexample paquete;
android.os.Bundle importacin;
android.support.v4.app.Fragment importacin;
android.view.LayoutInflater importacin;
android.view.View importacin;
android.view.ViewGroup importacin;
public class TextFragment extiende Fragmento {
@ Override
pblica Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup,
Bundle savedInstanceState) {
Ver view = inflater.inflate (R.layout.text_fragment,
contenedor, false);
vista regresar;
}
}
Ahora que la estructura bsica de los dos fragmentos se ha implementado, que estn listos para ser
embebido en la actividad principal de la aplicacin.
238
Figura 25-4
Seleccione la entrada ToolbarFragment de la lista y haga clic en el botn Aceptar para cerrar el cuadro de
dilogo Fragmentos. Mueva el puntero del ratn al borde superior central del rea de disposicin de los
padres para que se muestren las opciones centerHorizontal y alignParentTop (Figura 25-5).
239
Figura 25-5
Una vez colocado correctamente, liberar el fragmento para aadirlo a la disposicin. Una vez aadido, un
panel de mensaje aparecer (Figura 25-6) lo que indica que la herramienta Diseador necesita saber qu
fragmento para mostrar durante la sesin de vista previa. Visualizar el fragmento ToolbarFragment haciendo
clic en el uso @ diseo / toolbar_fragment enlace dentro del mensaje:
240
Figura 25-6
Haga clic en el <fragmento> entrada en la seccin de Uso de la paleta, una vez ms, esta vez seleccionando
la entrada TextFragment desde el dilogo fragmento antes de hacer clic en el botn Aceptar. Mueva el
puntero del ratn hasta el centro de la distribucin de modo que las propiedades centerHorizontal y
centerVertical se activan y liberar el fragmento. Cuando aparezca el mensaje de representacin, haga clic en
la opcin Usar @ diseo / text_fragment. Tenga en cuenta que los fragmentos son ahora visibles en el diseo
como se demuestra en la Figura 25-7:
241
Figura 25-7
Antes de proceder con el siguiente paso, haga doble clic en la instancia TextFragment en el diseo y, en el
panel resultante, cambiar el id del fragmento de @ + / Identificacin del text_fragment.
242
fragmento de texto. Como se indica en Introduccin al uso de fragmentos en Android Estudio , fragmentos no
deben comunicarse entre s directamente, en lugar de utilizar la actividad en la que estn inmersos como
intermediario. El primer paso en este proceso es asegurarse de que el fragmento de la barra de herramientas
responde al botn se hizo clic. Tambin tenemos que poner en prctica algo de cdigo para no perder de
vista el valor de la opinin de SeekBar. A los efectos de este ejemplo, vamos a implementar estos oyentes
dentro de la clase ToolbarFragment. Seleccione el archivo ToolbarFragment.java y modificarlo para que se
lea como se muestra en el siguiente listado:
com.ebookfrenzy.fragmentexample paquete;
android.os.Bundle importacin;
android.support.v4.app.Fragment importacin;
android.view.LayoutInflater importacin;
android.view.View importacin;
android.view.ViewGroup importacin;
android.app.Activity importacin;
android.widget.Button importacin;
android.widget.EditText importacin;
android.widget.SeekBar importacin;
android.widget.SeekBar.OnSeekBarChangeListener importacin;
public class ToolbarFragment extiende Fragmento implementa OnSeekBarChangeListener {
int esttica privada seekvalue = 10;
EditarTexto EditarTexto esttica privada;
@ Override
pblica Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup, Bulto
savedInstanceState) {
// Inflar el diseo de este fragmento
Ver view = inflater.inflate (R.layout.toolbar_fragment,
contenedor, false);
EditarTexto = (EditarTexto) view.findViewById (R.id.editText1);
ltima SeekBar seekbar =
(SeekBar) view.findViewById (R.id.seekBar1);
seekbar.setOnSeekBarChangeListener (this);
botn Botn final =
(Button) view.findViewById (R.id.button1);
button.setOnClickListener (nueva View.OnClickListener () {
public void onClick (Ver v) {
buttonClicked (v);
}
});
vista regresar;
}
public void buttonClicked (Ver vista) {
243
}
@ Override
public void onProgressChanged (SeekBar seekBar, int progreso,
boolean fromuser) {
seekvalue = progreso;
}
@ Override
public void onStartTrackingTouch (SeekBar arg0) {
}
@ Override
public void onStopTrackingTouch (SeekBar arg0) {
}
}
Antes de continuar, tenemos que tomar algn tiempo para explicar los cambios en el cdigo de arriba. En
primer lugar, la clase se declara como la implementacin de la interfaz OnSeekBarChangeListener. Esto es
porque la interfaz de usuario contiene una instancia de SeekBar y el fragmento necesita recibir notificaciones
cuando el usuario desliza la barra para cambiar el tamao de fuente. Implementacin de la interfaz
OnSeekBarChangeListener
requiere
que
se
apliquen
los
mtodos
onProgressChanged
(),
onStartTrackingTouch () y onStopTrackingTouch (). Estos mtodos se han aplicado, pero slo el mtodo
onProgressChanged () es realmente necesario para realizar una tarea, en este caso almacenar el nuevo valor
en un llamado seekvalue variable que ha sido declarado en el inicio de la clase. Tambin es una variable
declarada en el que almacenar una referencia al objeto EditarTexto.
El mtodo onCreateView () se ha modificado para obtener referencias al EditarTexto, SeekBar y vistas Button
en el diseo. Una vez se ha obtenido una referencia al botn se utiliza para configurar una OnClickListener en
el botn que est configurado para llamar a un mtodo llamado buttonClicked () cuando se detecta un evento
de clic. Tambin entonces se implementa este mtodo, aunque en este momento no hace nada.
La siguiente fase de este proceso es establecer el oyente que permitir que el fragmento de llamar a la
actividad cuando se hace clic en el botn. Esto sigue el mecanismo descrito en el captulo anterior:
244
@ Override
public void onAttach (actividad Actividad) {
super.onAttach (actividad);
tratar {
activityCallback = actividad (ToolbarListener);
} Catch (ClassCastException e) {
throw new ClassCastException (activity.toString ()
+ "Debe implementar ToolbarListener");
}
}
@ Override
pblica Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup, Bulto savedInstanceState) {
// Inflar el diseo de este fragmento
Ver view = inflater.inflate (R.layout.toolbar_fragment,
contenedor, false);
EditarTexto = (EditarTexto) view.findViewById (R.id.editText1);
ltima SeekBar seekbar =
(SeekBar) view.findViewById (R.id.seekBar1);
seekbar.setOnSeekBarChangeListener (this);
botn Botn final =
(Button) view.findViewById (R.id.button1);
button.setOnClickListener (nueva View.OnClickListener () {
public void onClick (Ver v) {
buttonClicked (v);
}
});
vista regresar;
}
public void buttonClicked (Ver vista) {
activityCallback.onButtonClick (seekvalue,
. edittext.getText toString () ());
}
.
.
.
}
245
ActionBarActivity. Llevar
estos
requisitos
juntos
los
resultados
en
el
siguiente
archivo
FragmentExampleActivity.java modificado:
com.ebookfrenzy.fragmentexample paquete;
android.support.v7.app.ActionBarActivity importacin;
android.support.v4.app.FragmentActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
public
class
FragmentExampleActivity
ToolbarFragment.ToolbarListener {
extiende
FragmentActivity
implementa
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_fragment_example);
}
public void onButtonClick (int tamao de fuente, texto String) {
}
.
.
.
}
Con los cambios de cdigo en su estado actual, el fragmento de la barra de herramientas detectar cuando el
botn se hace clic por el usuario y llamar a un mtodo de la actividad pasa por el contenido del campo
EditarTexto y la configuracin actual de la opinin de SeekBar. Ahora es el trabajo de la actividad para
comunicarse con el fragmento de texto y pasar a lo largo de estos valores para que el fragmento puede
actualizar el objeto TextView en consecuencia.
246
android.view.View importacin;
android.view.ViewGroup importacin;
android.widget.TextView importacin;
public class TextFragment extiende Fragmento {
TextView TextView esttica privada;
@ Override
pblica Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup,
Bundle savedInstanceState) {
Ver view = inflater.inflate (R.layout.text_fragment,
contenedor, false);
TextView = (TextView) view.findViewById (R.id.textView1);
vista regresar;
}
changeTextProperties public void (int tamao de fuente, texto String)
{
textview.setTextSize (tamao de fuente);
textview.setText (texto);
}
}
Prueba de la aplicacin
Con la codificacin para este proyecto ha finalizado, la ltima tarea que queda es ejecutar la
aplicacin. Cuando se inicia la aplicacin, la actividad principal se iniciar y, a su vez, crear y mostrar los dos
fragmentos. Cuando el usuario toca el botn en la barra de herramientas de fragmento, el mtodo
onButtonClick () de la actividad ser llamado por el fragmento de barra de herramientas y aprob el texto de
la vista EditarTexto y el valor actual de la SeekBar. La actividad ser entonces llamar a los
247
changeTextProperties () mtodo del segundo fragmento, que se modifique el TextView para reflejar el nuevo
texto y el tamao del texto:
Figura 25-8
248
Resumen
El objetivo de este captulo ha sido la de trabajar a travs de la creacin de un proyecto de ejemplo destinado
especficamente para demostrar los pasos involucrados en el uso de fragmentos dentro de una aplicacin
Android. Los temas cubiertos incluyen el uso de la Biblioteca Apoyo Android para la compatibilidad con
versiones de Android anteriores a la introduccin de fragmentos, la inclusin de fragmentos dentro de un
diseo de la actividad y la implementacin de la comunicacin entre los fragmentos.
249
9 Ejecucin de la aplicacin
10 Resumen
250
Figura 26-1
El ms pequeo, el telfono de tamao dispositivos Android, la lista maestra ocupa toda la pantalla y el panel
de detalles aparece en una pantalla separada que aparece cuando se realiza una seleccin de la lista
principal. En este modo, la pantalla de detalles incluye una barra de entrada de accin para volver a la lista
principal. Figura 26-2, por ejemplo, ilustra tanto la maestra y detalle pantallas para la misma lista de tres punto
en una pantalla de telfono 4 ":
251
Figura 26-2
252
Figura 26-3
La siguiente pantalla (Figura 26-4) ofrece la posibilidad de configurar los objetos que se mostrarn dentro de
la actividad de maestro / detalle. En el tutorial ms adelante en este captulo, la lista maestra contendr una
serie de nombres de sitios web, y que, cuando se selecciona, se carga el sitio web elegido en una vista web
en el panel de detalles. Con estos requisitos en mente, establezca el campo Objeto Clase a "Sitio Web" y el
objeto Kind Plural y los ajustes de ttulo a "Pginas".
253
Figura 26-4
Por ltimo, haga clic en Finalizar para crear el nuevo Maestro / proyecto de aplicacin basada Detalle de flujo.
<Kind_name> ListActivity.java - Esta es la actividad principal del proyecto, cuyo objetivo es mostrar la
lista maestra para el usuario (la disposicin de que se almacena en el archivo activity_ <kind_name>
_list.xml recursos fragmento XML) . Si la clase detecta que la pantalla es lo suficientemente grande como
para soportar el modo de dos paneles, una instancia de la <kind_name> _list fragmento del activity_
<kind_name> _twopane.xml archivo se crea y se muestra, de lo contrario, la instancia que figura en el
activity_ < kind_name> se utiliza archivo _list.xml. Esta clase tambin implementa y establece el mtodo
de devolucin de llamada onItemSelected () que se llama cuando el usuario realiza una seleccin de la
lista principal. Es la responsabilidad de este mtodo para crear y mostrar un ejemplo del panel de
254
detalle. En el caso del modo de dos paneles, el panel de detalles est a cargo de la creacin de una
instancia de la <kind_name> clase DetailFragment y agregarlo a la actividad actual. En las pantallas de
dispositivos ms pequeos, esta vez involucra el lanzamiento de una segunda actividad en la forma de la
etiqueta <kind_name> clase DetailActivity (que luego, a su vez, crear una instancia de la clase
<kind_name> DetailFragment).
activity_ <kind_name> _twopane.xml - Contiene tanto el <kind_name> _list fragmento lista maestra y
<kind_name> _detail_container FrameLayout declaraciones para el panel de detalles que se utilizar
cuando la aplicacin se ejecuta en un dispositivo de pantalla lo suficientemente grande como para
soportar el modo de dos paneles.
activity_ <kind_name> _list.xml - El archivo de recursos de diseo XML que contiene el <kind_name>
fragmento _list para la lista principal que se utilizar en las pantallas demasiado pequeas para apoyar el
modo de dos paneles.
<Kind_name> DetailActivity.java - La clase Java que representa la actividad para el panel de detalles
para su uso en dispositivos demasiado pequeos para manejar el modo de dos paneles.Esta clase crea
una instancia de la <kind_name> clase FragmentDetail y muestra el <kind_name> _detail_container
FrameLayout contenedor declarado en la _detail.xml archivo activity_ <kind_name>.
255
Dos archivos adicionales tambin son de inters puramente por el bien de la comprensin de cmo la
aplicacin es capaz de identificar si desea utilizar el modo de dos paneles o no. Estos archivos son res /
valores-grandes / refs.xml y res / valores-sw600dp / refs.xml.
Como se describe con mayor detalle en el captulo titulado Manejo de diferentes dispositivos y pantallas de
Android, cada proyecto de aplicacin tiene varios conjuntos de recursos que se dirigen a diferentes tamaos
de pantalla. En tiempo de ejecucin, el sistema Android utiliza automticamente el conjunto de recursos que
ms se acerque el tamao de visualizacin fsica del dispositivo. Los valores grandes y recursos valoressw600dp son, por supuesto, que se utiliza en dispositivos con pantallas ms grandes. Los archivos ref.xml en
estas carpetas simplemente declarar un alias que hace que los diseos modo de dos paneles a utilizar:
<Nombre
de
elemento
=
tipo
activity_item_twopane </ item>
"activity_item_list"
"layout">
diseo
256
Tenga en cuenta que la clase DummyContent encapsular aade actualmente tres elementos en forma de
cadenas que se lea "Artculo 1", "Seccin 2" y "Artculo 3":
public static Map <String, DummyItem> ITEM_MAP = new HashMap <String, DummyItem> ();
static {
// Aadir 3 elementos de
addItem (nueva DummyItem
addItem (nueva DummyItem
addItem (nueva DummyItem
}
la muestra.
("1", "Punto 1"));
("2", "Artculo 2"));
("3", "Artculo 3"));
Este cdigo debe ser modificado para inicializar el modelo de datos con los datos de sitio web requiere:
public static Map <String, DummyItem> ITEM_MAP =
nuevo HashMap <String, DummyItem> ();
static {
// Aadir 3 elementos de la muestra.
addItem (nuevo DummyItem ("1", "eBookFrenzy",
"Http://www.ebookfrenzy.com"));
addItem (nueva DummyItem ("2", "Amazonas",
"Http://www.amazon.com"));
addItem (nueva DummyItem ("3", "Wikipedia",
"Http://www.wikipedia.org"));
}
El cdigo ahora se aprovecha de la clase DummyItem modificado para almacenar un ID, nombre del sitio web
y la URL para cada artculo.
257
una pgina Web, este debe ser cambiado a un objeto WebView para los propsitos de este tutorial. Para ello,
vaya a la aplicacin -> res -> diseo -> archivo fragment_website_detail.xml en la ventana de herramientas
del proyecto y haga doble clic en l para cargarlo en la herramienta Diseador. Cambie a modo de texto y
borrar el contenido XML actual del archivo. Reemplazar esta contento con el siguiente cdigo XML:
<WebView
android: layout_width = "match_parent"
android: layout_height = "match_parent"
xmlns: android = "http://schemas.android.com/apk/res/android"
android: id = "@ + / Identificacin del website_detail"> </ WebView>
Cambiar a modo de diseo y verificar que el diseo ahora coincide con la muestra en la Figura 26-5:
Figura 26-5
258
com.ebookfrenzy.masterdetailflow paquete;
android.os.Bundle importacin;
android.support.v4.app.Fragment importacin;
android.view.LayoutInflater importacin;
android.view.View importacin;
android.view.ViewGroup importacin;
android.widget.TextView importacin;
com.example.masterdetailflow.dummy.DummyContent importacin;
public class WebsiteDetailFragment extiende Fragmento {
.
.
@ Override
Ver onCreateView pblico (inflado LayoutInflater, contenedor ViewGroup,
Bundle savedInstanceState) {
Ver rootView =
inflater.inflate (R.layout.fragment_website_detail,
contenedor, false);
// Mostrar el contenido de prueba como texto en una TextView.
si (mItem! = null) {
((TextView) rootView.findViewById (R.id.website_detail))
.setText (mItem.content);
}
volver rootView;
}
Con el fin de cargar la pgina web URL correspondiente al elemento seleccionado en la actualidad slo una
lnea de cdigo que hay que cambiar. Una vez que se ha realizado este cambio, el mtodo debe decir lo
siguiente
(nota
tambin
la
incorporacin
de
la
directiva
de
importacin
de
android.webkit.WebView):
com.ebookfrenzy.masterdetailflow paquete;
android.os.Bundle importacin;
android.support.v4.app.Fragment importacin;
android.view.LayoutInflater importacin;
android.view.View importacin;
android.view.ViewGroup importacin;
android.widget.TextView importacin;
android.webkit.WebView importacin;
com.example.masterdetailflow.masterdetailflow.dummy.DummyContent importacin;
public class WebsiteDetailFragment extiende Fragmento {
.
.
.
@ Override
la
biblioteca
259
Todo lo que este cambio hace es encontrar el punto de vista con el ID de website_detail (esto fue
formalmente al TextView, pero ahora es un WebView), extrae la direccin URL del sitio web desde el
elemento seleccionado y encarga al objeto WebView para cargar la pgina.
allowBackup = "true"
icon = "@ estirable / ic_launcher"
label = "@ string / nombre_apl"
theme = "@ style / AppTheme">.
.
.
</ Manifiesto>
Ejecutar la aplicacin
Compila y ejecuta la aplicacin en un emulador configurado adecuadamente o un dispositivo Android
conectado. Dependiendo del tamao de la pantalla, la aplicacin aparecer ya sea en pequea pantalla o el
modo de dos paneles. En cualquier caso, la lista maestra debe aparecer cebado con los nombres de los tres
sitios web definidos en el modelo de contenido. Al seleccionar un elemento debe hacer que el sitio web
correspondient aparezca en el panel de detalles,como se ilustra en el modo de dos paneles en la Figura 26-6:
260
Figura 26-6
Resumen
Una interfaz de usuario maestro / detalle consiste en una lista maestra de artculos que, cuando se
selecciona, muestran informacin adicional acerca de que la seleccin dentro de un panel de detalles. El
Maestro / Detalle de flujo es una plantilla proporcionada con Android Studio que permite una disposicin
maestro / detalle que se crear de forma rpida y con relativa facilidad. Como se ha demostrado en este
captulo, con modificaciones menores a los archivos de plantilla por defecto, una amplia gama de maestro /
detalle funcionalidad basada puede ser implementado con la codificacin mnima y el esfuerzo de diseo.
261
262
Contenido
1 El men de desbordamiento
9 Prueba de la aplicacin
10 Resumen
El men de desbordamiento
El men de desbordamiento (tambin referido como el men de opciones) es un men que es accesible para
el usuario desde la pantalla del dispositivo y permite al desarrollador para incluir otras opciones de aplicacin
ms all de los incluidos en la interfaz de usuario de la aplicacin. La ubicacin del men de desbordamiento
depende de la versin de Android que se ejecuta en el dispositivo. En un dispositivo con Android 2.3.3, por
ejemplo, el men de desbordamiento est representada por el icono del men situado en el centro (entre los
botones de la espalda y de bsqueda) de la barra de herramientas de tecla de funcin inferior como se ilustra
en la Figura 27-1:
Figura 27-1
Con el lanzamiento de Android 4.0 y ms tarde, por el contrario, el botn de men de desbordamiento se
encuentra en la esquina superior derecha (Figura 27-2) en la barra de herramientas de la accin representada
por la pila de tres plazas:
Figura 27-2
263
En el XML anterior, el androide: propiedad orderInCategory dicta el orden en que aparecern los elementos
del men en el men cuando se muestra. El androide: propiedad showAsAction, por otro lado, controla las
condiciones en las que el elemento correspondiente aparece como un elemento dentro de la propia barra de
accin. Si se establece en ifRoom, por ejemplo, el elemento aparecer en la barra de accin si no hay
suficiente espacio. La figura 27-3 muestra el efecto de establecer esta propiedad a ifRoom para ambos
elementos del men:
Figura 27-3
Esta propiedad se debe utilizar con moderacin para evitar el exceso de estorbar la barra de accin.
De forma predeterminada, un archivo XML men es creado por Android Studio cuando se crea un nuevo
proyecto de aplicacin para Android. Este archivo se encuentra en la aplicacin -> res -> carpeta del proyecto
de mens y contiene un elemento de men sencillo titulado "Ajustes":
<Xmlns men: android = "http://schemas.android.com/apk/res/android"
xmlns: app = "http://schemas.android.com/apk/res-auto"
xmlns: Herramientas = "http://schemas.android.com/tools"
264
Este men ya est configurado que se mostrar cuando el usuario selecciona el men de desbordamiento en
la interfaz de usuario cuando la aplicacin se est ejecutando, por lo que simplemente modificar ste para
satisfacer sus necesidades.
Al igual que con el archivo de men XML, Android Estudio ya habr anulado este mtodo en la actividad
principal de un proyecto de aplicacin de Android que acaba de crear. En el caso de que un men de
desbordamiento no es necesario en su actividad, ya sea quitar o comentario a cabo este mtodo.
265
Cuando un grupo de men est configurado para ser comprobable, un pequeo crculo aparece junto al
elemento del men, como se ilustra en la Figura 27-4. Es importante tener en cuenta que la conexin y
desconexin de este indicador no se realiza de forma automtica. Es, por lo tanto, la responsabilidad de la
aplicacin para comprobar y desmarque la opcin de men.
Figura 27-4
Siguiendo con el ejemplo del color utilizado anteriormente en este captulo, esto se llevara a cabo de la
siguiente manera:
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
switch (item.getItemId ()) {
caso R.id.menu_red:
si (item.isChecked ()) item.setChecked (false);
otra cosa item.setChecked (true);
mainLayout.setBackgroundColor (android.graphics.Color.RED);
return true;
266
caso R.id.menu_green:
si (item.isChecked ()) item.setChecked (false);
otra cosa item.setChecked (true);
mainLayout.setBackgroundColor (android.graphics.Color.GREEN);
return true;
por defecto:
volver super.onOptionsItemSelected (punto);
}
}
267
<Item
android: id = "@ + / Identificacin del menu_blue"
android: orderInCategory = "4"
aplicacin: showAsAction = "nunca"
android: title = "@ string / blue_string" />
</ Grupo>
</ Men>
Busque y haga doble clic en la aplicacin -> res -> Valores -> archivo strings.xml. Dentro del archivo, aadir
nuevos recursos de cadena para los nombres de colores segn se menciona por los elementos del men:
<? Xml version =
<recursos>
<String name
<String name
<String name
<String name
<String name
<String name
<String name
</ Recursos>
268
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
RelativeLayout mainLayout =
(RelativeLayout) findViewById (R.id.layoutView);
switch (item.getItemId ()) {
caso R.id.menu_red:
si (item.isChecked ()) item.setChecked (false);
otra cosa item.setChecked (true);
mainLayout.setBackgroundColor (android.graphics.Color.RED);
return true;
caso R.id.menu_green:
si (item.isChecked ()) item.setChecked (false);
otra cosa item.setChecked (true);
mainLayout.setBackgroundColor (android.graphics.Color.GREEN);
return true;
caso R.id.menu_yellow:
si (item.isChecked ()) item.setChecked (false);
otra cosa item.setChecked (true);
mainLayout.setBackgroundColor (android.graphics.Color.YELLOW);
return true;
caso R.id.menu_blue:
si (item.isChecked ()) item.setChecked (false);
otra cosa item.setChecked (true);
mainLayout.setBackgroundColor (android.graphics.Color.BLUE);
return true;
por defecto:
volver super.onOptionsItemSelected (punto);
}
}
.
.
}
Prueba de la aplicacin
Genere y ejecute la aplicacin a ambos un emulador o dispositivo Android fsica. Uso del men de
desbordamiento, elementos de men seleccionar y verificar que el fondo trazado cambios de color
adecuada. Tenga en cuenta que el color seleccionado actualmente se muestra como la opcin marcada en el
men.
269
Figura 27-5
Resumen
En las versiones anteriores de Android, el men de desbordamiento es accesible desde la barra de
herramientas tecla de funcin en la parte inferior de la pantalla. En Android 4.0 y versiones posteriores, se
accede al men de la extrema derecha de las acciones de barra de herramientas en la parte superior de la
pantalla. Este men proporciona una ubicacin para las aplicaciones para proporcionar opciones adicionales
para el usuario.
La estructura del men es ms fcil de definir en un archivo XML y la actividad de la aplicacin recibe
notificaciones de selecciones de elementos de men por razones imperiosas e implementar el mtodo
onOptionsItemSelected ().
270
271
9 Resumen
272
animados para que el botn desaparece de la vista, la diapositiva TextEdit y TextView a las nuevas
ubicaciones y el mapa se desvanece suavemente a la vista.
Las escenas se pueden crear en el cdigo de ViewGroups o implementados en los archivos de recursos de
diseo que se cargan en casos de escena en tiempo de ejecucin de la aplicacin.
Las transiciones tambin se puede implementar dinmicamente desde dentro de cdigo de la aplicacin. Con
este enfoque, las escenas se crean haciendo referencia a las colecciones de vistas de interfaz de usuario en
forma de ViewGroups con transiciones luego ser llevadas a cabo en aquellos elementos que utilizan la clase
TransitionManager, que ofrece una serie de mtodos para activar y gestionar las transiciones entre escenas.
Tal vez la forma ms simple de transicin implica el uso del mtodo beginDelayedTransition () de la clase
TransitionManager. Cuando se llama y aprobado el ViewGroup que representa una escena, cualquier cambio
posterior de los puntos de vista dentro de la escena (como mover, cambiar el tamao, aadir o borrar vistas)
sern animados por el marco de transicin.
La animacin real es manejado por el marco de transicin a travs de las instancias de la clase de
transicin. Casos de transicin son responsables de detectar cambios en el tamao, la posicin y la visibilidad
de los puntos de vista dentro de una escena y animacin de esos cambios en consecuencia.
Por defecto, las transiciones sern animados utilizando un conjunto de criterios definidos por la clase
AutoTransition. Transiciones personalizadas se pueden crear ya sea a travs de ajustes en archivos XML de
transicin o directamente en el cdigo. Mltiples transiciones pueden combinarse juntos en un TransitionSet y
configurados para ser realizado ya sea en paralelo o secuencialmente.
273
ser arrojado hacia adelante en la direccin correcta. La cantidad de fuerza hacia atrs puede ser
controlado a travs de la especificacin de un valor de tensin.
LinearInterpolator - Se utiliza para especificar que la animacin es que se realiza a una velocidad
constante.
Como se demostrar en este y posteriores captulos, interpoladores pueden especificarse tanto en los
archivos de cdigo y XML.
<Botn
android:
android:
android:
android:
android:
android:
android:
<Botn
android: id = "@ + / Identificacin del button3"
android: layout_width = "wrap_content"
274
android:
android:
android:
android:
layout_height = "wrap_content"
layout_centerHorizontal = "true"
layout_centerVertical = "true"
text = "@ string / three_string" />
</ RelativeLayout>
Suponiendo que el diseo anterior reside en un archivo llamado scene1_layout.xml ubicado en la carpeta res /
layout del proyecto, el diseo se puede cargar en una escena utilizando el mtodo getSceneForLayout () de la
clase de escena. Por ejemplo:
Escena scene1 = Scene.getSceneForLayout (rootContainer,
R.layout.scene1_layout, este);
Tenga en cuenta que la llamada al mtodo requiere una referencia al contenedor raz. Esta es la vista en la
parte superior de la jerarqua de la vista en la que la escena se va a mostrar.
Para mostrar una escena para el usuario sin ningn tipo de animacin de transicin, el escriba () mtodo se
llama en la instancia de la escena:
scene1.enter ();
Las transiciones entre dos escenas utilizando la clase AutoTransition por defecto se pueden activar utilizando
el mtodo go () de la clase TransitionManager:
TransitionManager.go (scene2);
Escena casos se pueden crear fcilmente en cdigo agrupando los elementos de la vista en uno o ms
ViewGroups y luego crear una escena de esos grupos. Por ejemplo:
Escena scene1 = Escena (viewGroup1);
Escena scene2 = Escena (viewGroup2, viewGroup3);
275
Esta nueva transicin a continuacin, se puede utilizar cuando se realiza una transicin:
TransitionManager.go (ESCENA2, myChangeBounds);
Mltiples transiciones pueden ser agrupados en una instancia TransitionSet. El siguiente cdigo, por ejemplo,
crea un nuevo objeto TransitionSet consistente en ambos lmites de cambio y efectos de transicin de
fundido:
TransitionSet myTransition = new TransitionSet ();
myTransition.addTransition (nuevos ChangeBounds ());
myTransition.addTransition (nueva Fundido ());
Las transiciones pueden ser configurados para apuntar vistas especficas (referenciados por una vista de
ID). Por ejemplo, el cdigo siguiente configurar la transicin de fundido anterior slo estn dirigidos a la vista
con un ID que coincide myButton1:
TransitionSet myTransition = new TransitionSet ();
myTransition.addTransition (nuevos ChangeBounds ());
Fade Transicin = new Fundido ();
fade.addTarget (R.id.myButton1);
myTransition.addTransition (fade);
Aspectos adicionales de la transicin tambin pueden ser personalizados, tales como la duracin de la
animacin. El cdigo siguiente especifica la duracin sobre las que la animacin se va a realizar:
Transicin changeBounds = new ChangeBounds ();
changeBounds.setDuration (2000);
Como con los casos de transicin, una vez que se ha creado una instancia de TransitionSet, que puede ser
utilizado en una transicin a travs de la clase TransitionManager. Por ejemplo:
TransitionManager.go (scene1, myTransition);
Al igual que con el enfoque basado en cdigo para trabajar con transiciones, cada entrada de transicin en un
archivo de recursos puede ser personalizado. El XML a continuacin, por ejemplo, configura una duracin
para una transicin de cambio de lmites:
276
Transiciones contenidas dentro de un archivo de recursos XML deben guardarse en la carpeta res / transicin
del proyecto en el que estn siendo utilizados y deben ser inflados antes de ser referencia en el cdigo de
una aplicacin. El siguiente cdigo, por ejemplo, infla los recursos de transicin contenidos en un archivo
llamado transition.xml y asigna los resultados a una referencia con nombre myTransition:
Transicin myTransition = TransitionInflater.from (esto)
.inflateTransition (R.transition.transition);
Una vez inflado, la nueva transicin se puede hacer referencia en la forma habitual:
TransitionManager.go (scene1, myTransition);
277
<Desvanecimiento
android: duracin = "2000"
android: fadingMode = "fade_out" />
<changeBounds
android: duracin = "5000">
</ ChangeBounds>
</ TransitionSet>
Cambie el valor de "secuencial" que "juntos" para indicar que las secuencias de animacin se han de realizar
en paralelo.
AccelerateDecelerateInterpolator ()
BounceInterpolator ()
LinearInterpolator ()
Una vez creado, una instancia interpolador se puede conectar a una transicin utilizando el mtodo
setInterpolator () de la clase de transicin. El siguiente cdigo, por ejemplo, agrega un interpolador de rebote
a una transicin de cambio de lmites:
Transicin changeBounds = new ChangeBounds ();
changeBounds.setInterpolator (nueva BounceInterpolator ());
Del mismo modo, el cdigo siguiente aade un interpolador de acelerar a la misma transicin, especificando
un factor de aceleracin de 1,2:
changeBounds.setInterpolator (nueva AccelerateInterpolator (1.2f));
278
En el caso de los recursos de transicin basados en XML, un interpolador defecto se declara con la siguiente
sintaxis:
android: interpolador = "@ android: anim / <interpolator_element>"
En la sintaxis anterior, <interpolator_element> debe ser reemplazado por el ID de recurso del interpolador
correspondiente seleccionado de la lista siguiente:
accelerate_decelerate_interpolator
accelerate_interpolator
anticipate_interpolator
anticipate_overshoot_interpolator
bounce_interpolator
cycle_interpolator
decelerate_interpolator
linear_interpolator
overshoot_interpolator
El siguiente fragmento XML, por ejemplo, agrega un interpolador de rebote a una transicin de cambio de los
lmites que figuran dentro de un conjunto de transicin:
<? Xml version = "1.0" encoding = "UTF-8"?>
<TransitionSet
xmlns: android = "http://schemas.android.com/apk/res/android"
android: transitionOrdering = "secuencial">
<changeBounds
android: interpolador = "@ android: anim / bounce_interpolator"
android: duracin = "2000" />
<Desvanecimiento
android: duracin = "1000"
android: fadingMode = "fade_in" />
</ TransitionSet>
Este enfoque de la adicin de interpoladores a las transiciones dentro de los recursos XML funciona bien
cuando se requiere el comportamiento predeterminado del interpolador. La tarea se vuelve un poco ms
compleja cuando el comportamiento predeterminado de un interpolador necesita ser cambiado. Tomemos,
por el bien de un ejemplo, el interpolador ciclo. El propsito de este interpolador es hacer una animacin o
transicin repiten un nmero de veces especificado. En ausencia de un atributo ciclos ajuste, el interpolador
ciclo realizar un solo ciclo. Desafortunadamente, no hay forma de especificar directamente el nmero de
ciclos (o cualquier otro atributo interpolador para el caso) cuando se aade un interpolador usando la tcnica
anterior. En cambio, un interpolador personalizado debe ser creado y luego hace referencia en el archivo de
la transicin.
279
"http://schemas.android.com/apk/res/android"
En la sintaxis anterior, interpolatorElement debe ser reemplazado por el nombre del elemento del interpolador
requerida seleccionado de la lista siguiente:
accelerateDecelerateInterpolator
accelerateInterpolator
anticipateInterpolator
anticipateOvershootInterpolator
bounceInterpolator
cycleInterpolator
decelerateInterpolator
linearInterpolator
overshootInterpolator
La palabra clave de atributo se sustituye por el atributo de nombre del interpolador cuyo valor se va a cambiar
(por ejemplo, la tensin para cambiar el atributo de la tensin de un interpolador rebasamiento). Por ltimo, el
valor representa el valor que se asignar al atributo especificado. La siguiente XML, por ejemplo, contiene un
interpolador de ciclo personalizado configurado para ciclo de 7 veces:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns cycleInterpolator: android = "http://schemas.android.com/apk/res/android" android:
ciclos = "7" />
Suponiendo que el XML anterior se almacena en un archivo de recursos llamado my_cycle.xml almacenados
en el directorio / carpeta del proyecto anim res, el interpolador costumbre podra aadirse a un archivo de
recursos de transicin con la siguiente sintaxis XML:
<changeBounds
xmlns: android = "http://schemas.android.com/apk/res/android"
android: duracin = "5000"
android: interpolador = "@ anim / my_cycle">
280
Resumen
El Android 4.4 SDK versin KitKat introdujo el Marco de transicin, cuyo objetivo es simplificar la tarea de
agregar animacin a las opiniones que componen la interfaz de usuario de una aplicacin Android. Con una
configuracin sencilla y unas pocas lneas de cdigo, efectos de animacin tales como el movimiento, la
visibilidad y el cambio de tamao de puntos de vista pueden ser animados mediante el uso del marco de
transicin. Un nmero de diferentes enfoques de las transiciones de aplicacin estn disponibles implica una
combinacin de archivos de cdigo y de recursos XML Java. Los efectos de animacin de transiciones
tambin se pueden mejorar mediante el uso de una gama de interpoladores.
Despus de haber cubierto algunos de la teora de las transiciones en Android, los dos captulos siguientes se
ponga en prctica esta teora trabajando a travs de algunas implementaciones de transicin basados
ejemplo Android Studio.
281
4 Personalizacin de la Transicin
5 Resumen
282
Seleccione el objeto TextView que actualmente muestra el mundo Hola! texto y pulse la tecla suprimir del
teclado para eliminarlo de la disposicin. Arrastre un botn de la seccin Widget de la paleta Diseador y
colocarlo en la esquina superior izquierda de la disposicin de la pantalla del dispositivo. Una vez colocado,
haga doble clic en l y especificar un ID de @ + / Identificacin del myButton1.
283
El cdigo anterior simplemente establece un oyente contacto en el recipiente RelativeLayout y lo configura
para llamar a un mtodo llamado handleTouch () cuando se detecta un toque. La siguiente tarea, por lo tanto,
es poner en prctica el mtodo handleTouch () como sigue:
public void handleTouch () {
Ver view = findViewById (R.id.myButton1);
RelativeLayout.LayoutParams
params
=
new
(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
RelativeLayout.LayoutParams
params.addRule (RelativeLayout.ALIGN_PARENT_RIGHT,
RelativeLayout.TRUE);
params.addRule (RelativeLayout.ALIGN_PARENT_BOTTOM,
RelativeLayout.TRUE);
view.setLayoutParams (params);
ViewGroup.LayoutParams lparams = view.getLayoutParams ();
lparams.width = 500;
lparams.height = 350;
view.setLayoutParams (lparams);
}
Este mtodo obtiene una referencia a la opinin de botn en el diseo de interfaz de usuario y crea un nuevo
conjunto de reglas de parmetros de diseo diseados para mover el botn a la esquina inferior derecha de la
disposicin de los padres y para aumentar las dimensiones del botn. Una vez creado, estos nuevos
parmetros se aplican al botn.
Pruebe el cdigo hasta el momento por compilar y ejecutar la aplicacin. Una vez puesto en marcha, toque el
fondo (no el botn) y observe que el botn se mueve y cambia el tamao, como se ilustra en la Figura 29-1:
284
Figura 29-1
Aunque los cambios de diseo entraron en vigor, lo hicieron de forma instantnea y sin ningn tipo de
animacin. Aqu es donde la llamada al mtodo beginDelayedTransition () de la clase TransitionManager
entra. Todo lo que se necesita para agregar animacin a este cambio de diseo es la adicin de una sola
lnea de cdigo antes de que se apliquen los cambios de diseo.Permanecer dentro del archivo
TransitionDemoActivity.java, modifique el cdigo de la siguiente manera:
com.ebookfrenzy.transitiondemo paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.MotionEvent importacin;
android.view.View importacin;
android.view.ViewGroup importacin;
android.widget.RelativeLayout importacin;
android.transition.TransitionManager importacin;
public class TransitionDemoActivity extiende ActionBarActivity {
.
.
.
285
Compile y ejecute la aplicacin una vez ms y tenga en cuenta que la transicin est animado.
Personalizacin de la Transicin
La tarea final en este ejemplo es modificar la transicin changeBounds de modo que se realiza sobre una
duracin ms larga e incorpora un efecto de rebote cuando la vista alcanza su nueva ubicacin de la
pantalla. Esto implica la creacin de una instancia de Transicin con la configuracin del interpolador de
duracin apropiada, que es, a su vez, pasa a travs de un argumento al mtodo beginDelayedTransition ():
com.ebookfrenzy.transitiondemo paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.MotionEvent importacin;
android.view.View importacin;
android.view.ViewGroup importacin;
android.widget.RelativeLayout importacin;
android.transition.TransitionManager importacin;
android.transition.ChangeBounds de importacin;
android.transition.Transition importacin;
android.view.animation.BounceInterpolator importacin;
public class TransitionDemoActivity extiende ActionBarActivity {
.
.
.
public void handleTouch () {
286
Cuando ahora se ejecuta la aplicacin, la animacin ser ms lento para que coincida con la nueva
configuracin de la duracin y el botn rebotar en destino en la esquina inferior derecha de la pantalla.
Resumen
La forma ms bsica de la animacin de transicin implica el uso del mtodo beginDelayedTransition () de la
clase TransitionManager. Una vez llamada, cualquier cambio en el tamao y la posicin de los puntos de vista
en el siguiente fotograma renderizado interfaz de usuario, y dentro de un grupo vista definida, sern animados
usando las transiciones especificadas. En este captulo se ha trabajado a travs de un sencillo ejemplo
Android Studio que muestra el uso de este enfoque a las transiciones de ejecucin.
287
7 Cargando Escena 2
12 Resumen
288
una actividad en blanco denominada SceneTransitionsActivity con archivos de diseo y men nombrados
activity_scene_transitions y menu_scene_transitions correspondiente.
289
Figura 30-1
Arrastre un segundo punto de vista Botn de la paleta y colquelo en la esquina superior derecha de la vista
de diseo de modo que las propiedades alignParentRight y alignParentTop se muestran antes de caer la vista
en su lugar. Repitiendo los pasos para el primer botn, asigne el texto que dice "Dos" al botn y extraer en un
recurso de cadena con nombre y two_string.
Arrastre un tercer punto de vista Button y posicionarlo de manera que se centra tanto en horizontal como en
vertical dentro del diseo, esta vez la configuracin de una llamada three_string recurso de cadena que dice
"Tres". Al completar los pasos anteriores, el diseo de la primera escena debe ser similar a la que se muestra
en la Figura 30-2:
290
Figura 30-2
Cambie la herramienta Diseador de modo de texto para editar directamente los recursos de XML para el
diseo. Verifique que coincida con el XML que se enumeran a continuacin antes de aadir las propiedades
onClick a la primera y segunda botones. Estos mtodos se ejecutarn ms adelante para activar las
transiciones de una escena a otra:
<? Xml version = "1.0" encoding = "UTF-8"?>
291
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / one_string"
id = "@ + / Identificacin del botn"
layout_alignParentTop = "true"
layout_alignParentLeft = "true"
layout_alignParentStart = "true"
onClick = "goToScene2" />
<Botn
android:
android:
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / two_string"
id = "@ + / Identificacin del button2"
layout_alignParentTop = "true"
layout_alignParentRight = "true"
layout_alignParentEnd = "true"
onClick = "goToScene1" />
<Botn
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / three_string"
id = "@ + / Identificacin del button3"
layout_centerVertical = "true"
layout_centerHorizontal = "true" />
</ RelativeLayout>
292
Figura 30-3
Interruptor Designer para el modo de texto y compruebe que coincide con el XML que se enumeran a
continuacin:
<? Xml version = "1.0" encoding = "UTF-8"?>
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
android: layout_width = "match_parent" android: layout_height = "match_parent">
<Botn
293
android:
android:
android:
android:
android:
android:
android:
android:
<Botn
android:
android:
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / one_string"
id = "@ + / Identificacin del botn"
onClick = "goToScene2"
layout_alignParentBottom = "true"
layout_alignParentRight = "true"
layout_alignParentEnd = "true" />
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / two_string"
id = "@ + / Identificacin del button2"
onClick = "goToScene1"
layout_alignParentBottom = "true"
layout_alignParentLeft = "true"
layout_alignParentStart = "true" />
</ RelativeLayout>
294
El cdigo aadido a la clase de actividad declara algunas variables en el que almacenar referencias al
contenedor raz y primera escena y obtiene una referencia a la vista contenedor raz. El mtodo
getSceneForLayout () de la clase de escena se utiliza entonces para crear una escena de la disposicin
contenida en el archivo scene1_layout.xml para convertir ese diseo en una escena. La escena se introduce a
continuacin a travs de la entrar en () llamada al mtodo de manera que se muestra al usuario.
Compilar y ejecutar la aplicacin en este punto y verificar que la escena 1 se muestra despus de la
aplicacin ha puesto en marcha.
Cargando Escena 2
Antes de implementar la transicin entre la primera y segunda escena es primero necesario aadir algo de
cdigo para cargar la disposicin del archivo scene2_layout.xml en un ejemplo de escena.Permanecer en el
archivo SceneTransitionsActivity.java, por lo tanto, agregar el cdigo de la siguiente manera:
public class SceneTransitionsActivity extiende ActionBarActivity {
ViewGroup rootContainer;
Scene1 escena;
Scene2 escena;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_scene_transitions);
rootContainer =
(ViewGroup) findViewById (R.id.rootContainer);
scene1 = Scene.getSceneForLayout (rootContainer,
R.layout.scene1_layout, este);
scene2 = Scene.getSceneForLayout (rootContainer,
R.layout.scene2_layout, este);
scene1.enter ();
}
.
.
}
295
Ejecute la aplicacin y observe que la seleccin de los dos primeros botones hace que la disposicin para
cambiar entre las dos escenas. Dado que todava tenemos que configurar ningn transiciones, estos cambios
de diseo an no estn animados.
296
297
Cuando la aplicacin es ahora ejecutar los dos botones se deslizarn suavemente a sus nuevas posiciones
durante la transicin.
<Desvanecimiento
android: duracin = "2000"
android: fadingMode = "fade_in">
<> objetivos
<Androide objetivo: targetId = "@ id / button3" />
</ objetivos>
</ Fade>
<changeBounds
android: duracin = "2000"
android: interpolador = "@ android: anim / bounce_interpolator">
</ ChangeBounds>
</ TransitionSet>
Botones uno y dos ahora se recuperar al llegar a los destinos finales y el botn de tres se desvanecen
suavemente a la vista durante la transicin a la escena 1 de la escena 2.
Tmese su tiempo para experimentar con diferentes transiciones y interpoladores al hacer cambios en el
archivo transition.xml y volver a ejecutar la aplicacin.
Resumen
Transiciones basadas Escena proporcionan un enfoque flexible para la animacin de los cambios de diseo
de interfaz de usuario dentro de una aplicacin Android. En este captulo se ha demostrado los pasos
implicados en la animacin de la transicin entre las escenas representadas por dos archivos de recursos de
298
diseo. Adems, el ejemplo tambin se utiliza un archivo de recursos XML transicin para configurar los
efectos de animacin de transicin entre las dos escenas.
299
2 Intentos explcitos
4 Intentos implcitos
7 Resumen
300
la pgina web que se mostrar a la segunda actividad. Del mismo modo, la actividad receptora tambin puede
estar configurado para devolver resultados de datos para el envo de la actividad cuando las tareas
necesarias se han completado.
Aunque no cubierta hasta los ltimos captulos, tambin es de destacar el hecho de que, adems de poner en
marcha las actividades, las intenciones tambin se utilizan para poner en marcha y comunicarse con los
servicios y receptores de radiodifusin.
Intenciones se clasifican como sea explcita o implcita.
Intentos explcitos
Una intencin explcita solicita la puesta en marcha de una actividad especfica haciendo referencia al nombre
del componente (que es en realidad el nombre de la clase Java) de la actividad de destino. Este enfoque es
ms comn en el lanzamiento de una actividad que reside en la misma aplicacin que la actividad de envo
(desde que el nombre de la clase Java se sabe que el desarrollador de aplicaciones).
Una intencin explcita es emitida por la creacin de una nueva instancia de la clase Intencin, pasando por el
contexto de actividad y el nombre del componente de la actividad que se lanzar.Luego se hace una llamada
al mtodo startActivity (), pasando por el objeto intencin como argumento. Por ejemplo, el siguiente
fragmento de cdigo emite una intencin para la actividad con el nombre de la clase ActivityB para ser
lanzado:
Intencin i = new Intent (esto, ActivityB.class);
startActivity (i);
Los datos pueden ser transmitidos a la actividad receptora mediante la adicin de al objeto intencin antes de
que se inicia a travs de llamadas al mtodo putExtra () del objeto de la intencin. Los datos deben ser
aadidos en forma de pares clave-valor. El siguiente cdigo se extiende el ejemplo anterior para agregar
valores de cadena y enteros con las teclas "miCadena" y "myInt", respectivamente, a la intencin:
Intencin i = new Intent (esto, ActivityB.class);
i.putExtra ("miCadena", "Este es un mensaje para ActivityB");
i.putExtra ("myInt", 100);
startActivity (i);
Los datos se reciben en la actividad de destino como parte de un objeto Bundle que se puede obtener a
travs de una llamada a getIntent (). GetExtras (). El mtodo getIntent () de la clase Actividad devuelve la
intencin de que comenz la actividad, mientras que los getExtras mtodo () (de la clase Intencin) devuelve
un objeto Bundle para que la intencin que contiene los datos. Por ejemplo, para extraer los valores de los
datos pasados a ActivityB:
Bundle extras = getIntent () getExtras (.);
301
Si (extras! = Null) {
Cadena miCadena = extras.getString ("miCadena");
int myInt = extras.getInt ("myInt");
}
Al utilizar las intenciones de lanzar otras actividades dentro de la misma aplicacin, es esencial que esas
actividades se enumeran en el archivo de manifiesto de aplicacin. Los siguientes contenidos
AndroidManifest.xml estn configurados correctamente para una aplicacin que contiene las actividades
nombradas ActivityA y ActivityB:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.intent1.intent1">
<Application
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl">
<Actividad
android: label = "@ string / nombre_apl"
android: name = "com.ebookfrenzy.intent1.intent1.ActivityA">
<Intencin de filtro>
<Accin android: name = "android.intent.action.MAIN" />
<Categora android: name = "android.intent.category.LAUNCHER" />
</ Intencin de filtro>
</ Actividad>
<Actividad
android: name = "ActivityB"
android: label = "ActivityB">
</ Actividad>
</ Application>
</ Manifiesto>
Con el fin de devolver los datos a la actividad de los padres, la subactividad debe implementar el mtodo de
acabado (), cuyo propsito es crear un nuevo objeto de la intencin que contiene los datos que se devuelve, y
302
luego llamar al mtodo setResult () de la que encierra la actividad, pasando a travs de un cdigo de
resultado y la intencin que contiene los datos de retorno. El cdigo de resultado es tpicamente RESULT_OK
o RESULT_CANCELED, pero tambin puede ser un valor personalizado con sujecin a los requisitos de la
promotora. En el caso de que se bloquea un sub-actividad, la actividad padre recibir un cdigo de resultado
RESULT_CANCELED.
El siguiente cdigo, por ejemplo, ilustra el cdigo de un tpico acabado subactividad () mtodo:
acabado public void () {
Intencin de datos = new Intent ();
data.putExtra ("returnString1", "Mensaje a la actividad principal");
setResult (RESULT_OK, datos);
super.finish ();
}
Con el fin de obtener y extraer los datos devueltos, la actividad de los padres debe implementar el mtodo
onActivityResult (), por ejemplo:
protegida onActivityResult void (int requestCode, int resultCode, datos Intencin)
{
ReturnString String;
si (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
si (data.hasExtra ("returnString1")) {
ReturnString = data.getExtras () getString ("returnString1.");
}
}
}
Tenga en cuenta que el mtodo anterior comprueba el valor de cdigo de peticin de regresar para
asegurarse de que coincide con que pasa a travs con el mtodo () startActivityForResult. Al iniciar mltiples
sub-actividades es especialmente importante utilizar el cdigo de solicitud para rastrear la actividad que
actualmente est volviendo resultados, ya que todo va a llamar al mtodo mismo onActivityResult () en la
salida.
Intentos implcitos
A diferencia de las intenciones explcitas, que hacen referencia al nombre de la clase Java de la actividad que
se lanzarn, las intenciones implcitas identificar la actividad que se lanzar al especificar la accin a realizar
y el tipo de datos que se manejan por la actividad de recepcin. Por ejemplo, un tipo de accin de
ACTION_VIEW acompaado de la URL de una pgina web en la forma de un objeto URI instruir el sistema
Android para buscar, y posteriormente poner en marcha una actividad capaz navegador web. La siguiente
intencin implcita ser, cuando se ejecuta en un dispositivo Android, resultar en la pgina web designada
que aparece en una actividad del navegador web Chrome:
303
Cuando la intencin implcita de arriba es emitida por una actividad, el sistema Android buscar actividades
en el dispositivo que se han registrado la capacidad de manejar las solicitudes ACTION_VIEW sobre los
datos del esquema http utilizando un proceso denominado resolucin intencin. En el caso de que un solo
partido se encuentra, se pondr en marcha esa actividad. Si se encuentra ms de una coincidencia, el usuario
se le pedir que elija entre las opciones de actividades disponibles.
El
archivo
AndroidManifest.xml
siguiente
ilustra
una
configuracin
para
una
actividad
llamada
304
Resumen
Intenciones son el mecanismo de mensajera mediante el cual una actividad Android puede lanzar otro. Una
intencin explcita referencia a una actividad especfica que se lanzar haciendo referencia a la actividad de
recepcin por nombre de la clase. Intentos explcitos son tpicamente, aunque no exclusivamente, utiliza
cuando el lanzamiento de actividades contenidas dentro de la misma aplicacin. Una intencin implcita
especifica la accin a realizar y el tipo de datos para ser manipulados y permite que el tiempo de ejecucin de
Android encontrar una intencin a juego para lanzar. Intenciones implcitas se utilizan generalmente en el
lanzamiento de las actividades que residen en diferentes aplicaciones.
Una actividad puede enviar datos a la actividad de recepcin por la agrupacin de datos en el objeto de la
intencin en forma de pares clave-valor. Los datos slo se puede devolver de una actividad si se inicia como
un sub-actividad de la actividad de envo.
Actividades anuncian capacidades al proceso de resolucin de la intencin de Android a travs de la
especificacin de la intencin de los filtros en el archivo de manifiesto de aplicacin. Ambas actividades que
305
envan y reciben tambin deben solicitar los permisos adecuados para realizar tareas tales como el acceso a
la base de datos de contactos del dispositivo o internet.
Despus de haber cubierto la teora de las intenciones, los prximos captulos trabajarn a travs de la
creacin de algunos ejemplos en Android estudio que ponen las intenciones explcitas e implcitas en accin.
306
6 Creacin de la Intencin
10 Prueba de la aplicacin
11 Resumen
307
layout_width = "wrap_content"
layout_height = "wrap_content"
textAppearance = "android:? attr / textAppearanceLarge"
text = "Texto grande"
id = "@ + / Identificacin del textView1"
layout_centerVertical = "true"
layout_centerHorizontal = "true" />
<EditarTexto
android:
android:
android:
android:
android:
android:
layout_width = "200dp"
layout_height = "wrap_content"
id = "@ + / Identificacin del editText1"
layout_above = "@ + / Identificacin del textView1"
layout_centerHorizontal = "true"
layout_marginBottom = "77dp" />
<Botn
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "Preguntar"
android: id = "@ + / Identificacin del Button1"
android: layout_below = "@ + / Identificacin del textView1"
android: layout_centerHorizontal = "true"
android: onClick = "onClick"
android: layout_marginTop = "56dp" />
</ RelativeLayout>
308
Como cubierto de una visin general y Android Estudio Ejemplo de Manejo Android Evento , el androide:
onClick = "onClick" lnea de recursos en el listado XML anterior utiliza una forma alternativa para manejar
eventos de clic sencillas sin tener que implementar un detector de eventos en el cdigo Java de la
actividad. Al especificar el tipo de evento onClick y el mtodo que se llamar cuando se detecta un evento de
este tipo, es rpido y fcil de cablear bsico clic manejo de eventos en una vista. Una vez que el mtodo
onClick () se ha implementado en el archivo ActivityA.java, ser llamado cada vez que el botn es tocado por
el usuario.
Una vez que el diseo es completa, la interfaz de usuario debe parecerse a la que se ilustra en la Figura 32-1:
Figura 32-1
309
paso, por lo tanto, es crear la segunda actividad. Dentro de la ventana de la herramienta de proyectos, haga
clic en el nombre del paquete com.ebookfrenzy.explicitintent situado en app-> Java y seleccione Nuevo ->
Actividad -> opcin de men Actividad en blanco para mostrar el cuadro de dilogo Nueva actividad en
blanco, como se muestra en la Figura 32 2:
Figura 32-2
Introduzca ActivityB en los campos Nombre y ttulo de la actividad y nombrar los archivos de diseo y men
activity_b y menu_activity_b. Debido a que no se pondr en marcha esta actividad cuando se inicia la
aplicacin (en su lugar se pondr en marcha a travs de un intento por ActivityA cuando se pulsa el botn), es
importante asegurarse de que la opcin Actividad Launcher est desactivado antes de hacer clic en el botn
Finalizar.
310
<TextView
android:
android:
android:
android:
android:
android:
android:
android:
<EditarTexto
android:
android:
android:
android:
android:
android:
android:
android:
</ RelativeLayout>
Si el diseo del trazado con la herramienta de diseo en modo de diseo, tenga en cuenta que la propiedad
onClick en la opinin de botn se ha configurado para llamar a un mtodo llamado onClick (), la anchura de la
vista EditarTexto se ha establecido en 300DP y las vistas se han asignado IDs Button1 TextView1 y
editText1. La disposicin completado debe parecerse a la que se ilustra en la Figura 32-2:
311
Figura 32-3
312
Con la segunda actividad creada y que figuran en el archivo de manifiesto, ahora es tiempo para escribir algo
de cdigo en la clase ActivityA emitir la intencin.
Creacin de la Intencin
El objetivo para ActivityA es para crear e iniciar un intento cuando el usuario toca el botn "Hacer
Pregunta". Como parte del proceso de creacin de la intencin, se agregar la cadena pregunta introducida
por el usuario en la vista EditarTexto al objeto intencin como un par clave-valor. Cuando se cre el diseo de
la interfaz de usuario para ActivityA, el objeto de botn se ha configurado para llamar a un mtodo llamado
onClick () cuando "clic" por el usuario. Este mtodo necesita ahora para ser aadido al archivo de origen
ActivityA.java clase ActivityA como sigue:
com.ebookfrenzy.explicitintent paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.content.Intent importacin;
android.view.View importacin;
android.widget.EditText importacin;
android.widget.TextView importacin;
313
El cdigo para el mtodo onClick () sigue las tcnicas descritas en una visin general de Intenciones
Android. En primer lugar, se crea una nueva instancia de Intencin, pasando por la actividad actual y el
nombre de la clase de ActivityB como argumentos. A continuacin, el texto introducido en el objeto
EditarTexto se aade al objeto intencin como un par clave-valor y la intencin comenz a travs de una
llamada a startActivity (), pasando por el objeto intencin como argumento.
Compila y ejecuta la aplicacin y pulse el botn "Hacer Pregunta" para iniciar ActivityB y el botn Atrs para
volver a ActivityA.
314
Compila y ejecuta la aplicacin, ya sea dentro de un emulador o en un dispositivo Android fsica. Escriba una
pregunta en el cuadro de texto en ActivityA antes de tocar el botn "Hacer Pregunta". La pregunta debera
aparecer ahora en el componente TextView en la interfaz de usuario ActivityB.
315
Cuando las salidas sub-actividad, el mtodo onActivityResult () de la actividad de los padres se llama y se
pasan como argumentos el cdigo de solicitud asociada con la intencin, un cdigo de resultado que indica el
xito o no de la sub-actividad y un objeto que contiene toda la intencin de datos devuelto por la
subactividad. Permanecer en el archivo de origen de clase ActivityA, este mtodo debe aplicarse de la
siguiente manera:
protegida onActivityResult void (int requestCode, int resultCode, datos Intencin) {
if ((requestCode == request_code) &&
(ResultCode == RESULT_OK)) {
TextView textView1 =
(TextView) findViewById (R.id.textView1);
Cadena ReturnString =
data.getExtras () getString ("returnData.");
textView1.setText (ReturnString);
}
}
El cdigo en el mtodo anterior comienza comprobando que el cdigo de solicitud coincide con la utilizada
cuando se emiti la intencin y garantizar que la actividad se ha realizado correctamente.Los datos de
rendimiento se extrae de la intencin y est representada en el objeto TextView.
316
Todo lo que el mtodo de acabado () tiene que hacer es crear un nuevo intento, agregar los datos de retorno
como un par clave-valor y luego llamar al mtodo setResult (), pasando a travs de un cdigo de resultado y
el objeto intencin. El mtodo onClick () simplemente llama al mtodo de acabado ().
Prueba de la aplicacin
Compila y ejecuta la aplicacin, introduzca una pregunta en el campo de texto en ActivityA y toque el botn
"Hacer Pregunta". Cuando aparezca ActivityB, introduzca la respuesta a la pregunta y utilizar el botn Atrs o
el botn "Enviar respuesta" para volver a ActivityA donde la respuesta debe aparecer en el objeto vista de
texto.
Resumen
Despus de haber cubierto los conceptos bsicos de las intenciones en el captulo anterior, el objetivo de este
captulo ha sido la de trabajar a travs de la creacin de un proyecto de aplicacin en Android Estudio
diseado para demostrar el uso de las intenciones explcitas, junto con los conceptos de transferencia de
datos entre una actividad y padres subactividad.
El siguiente captulo trabajar a travs de un ejemplo diseado para demostrar las intenciones implcitas en la
accin.
317
9 Prueba de la aplicacin
10 Resumen
318
</ RelativeLayout>
Figura 33-1
Tenga en cuenta la inclusin de la propiedad onClick que asegurar que un mtodo llamado showWebPage ()
(que an no ha sido implementado) ser llamada cuando el botn est "clic" por el usuario.
319
Las tareas realizadas por este mtodo son realmente muy simple. En primer lugar, se crea un nuevo objeto
de la intencin. En lugar de especificar el nombre de clase de la intencin, sin embargo, el cdigo
simplemente indica la naturaleza de la intencin (para mostrar algo que el usuario) mediante la opcin
ACTION_VIEW. El objeto intencin tambin incluye un URI que contiene la URL que se mostrar. Esto indica
que el sistema de resolucin de intencin Android que la actividad est solicitando que se mostrar una
pgina web. La intencin es emitida entonces a travs de una llamada al mtodo startActivity ().
Compila y ejecuta la aplicacin en ambos un emulador o en un dispositivo Android fsica y, una vez en
funcionamiento, toque el botn Mostrar Pgina Web. Cuando se toca, una vista del navegador web debe
aparecer y cargar la pgina web designada por la URL. Una intencin implcita xito ahora se ha ejecutado.
320
Retorno a la herramienta Diseador de modo y arrastre Diseo y soltar un objeto WebView de la seccin
Widgets de la paleta en la vista RelativeLayout existente. Ajuste la altura de la disposicin y propiedades
width a match_parent usando cualquiera de los botones de la barra de herramientas Diseador o el panel
Propiedades para que el WebView llena todo el rea de visualizacin, como se ilustra en la Figura 33-2:
321
Figura 33-2
322
Obtiene una referencia a la intencin que caus esta actividad que se puso en marcha
La parte de codificacin del proyecto MyWebView ha finalizado. Todo lo que queda es modificar el archivo de
manifiesto.
Adems, una revisin de los contenidos de la seccin de filtro intencin del archivo AndroidManifest.xml para
el proyecto MyWebView revelar la siguiente configuracin:
323
<Intencin de filtro>
<Accin android: name = "android.intent.action.MAIN" />
<Categora android: name = "android.intent.category.LAUNCHER" />
</ Intencin de filtro>
En el XML anterior, la entrada android.intent.action.MAIN indica que esta actividad es el punto de entrada de
la
aplicacin
cuando
se
puso
en
marcha
sin
ninguna
entrada
de
datos. La
directiva
android.intent.category.LAUNCHER, por otra parte, indica que la actividad debe aparecer dentro de la
pantalla del iniciador de la aplicacin del dispositivo.
Debido a que no se requiere la actividad que se lanzar como punto de entrada a una aplicacin, no se puede
ejecutar sin entrada de datos (en este caso una URL) y no est obligado a aparecer en el programa de
lanzamiento, ni las directivas PRINCIPALES ni LANZADOR se requieren en el archivo de manifiesto para esta
actividad.
El filtro de intencin para la actividad MyWebViewActivity hace, sin embargo, necesita ser modificado para
indicar que es capaz de manejar ACTION_VIEW acciones intencin aplicables a los regmenes de datos
http. Android tambin requiere que todas las actividades capaces de manejar las intenciones implcitas que no
incluyen las entradas principales y el lanzador tambin incluyen la denominada categora por defecto en el
filtro de la intencin. La seccin de filtro intencin modificado debe, por lo tanto, que diga lo siguiente:
<Intencin de filtro>
<Accin android: name = "android.intent.action.VIEW" />
<Categora android: name = "android.intent.category.DEFAULT" />
<Androide datos: Esquema = "http" />
</ Intencin de filtro>
Llevar estos requisitos juntos los resultados en el siguiente archivo AndroidManifest.xml completo:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.mywebview">
<Usa-permiso android: name = "android.permission.INTERNET" />
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
<Actividad
android: ". MyWebViewActivity" name =
android: label = "@ string / nombre_apl">
<Intencin de filtro>
<Accin android: name = "android.intent.action.VIEW" />
<Categora
android: name = "android.intent.category.DEFAULT" />
<Androide datos: Esquema = "http" />
</ Intencin de filtro>
324
</ Actividad>
</ Application>
</ Manifiesto>
Cargue el archivo AndroidManifest.xml en el editor de manifiesto haciendo doble clic sobre el nombre del
archivo en la ventana de herramientas del proyecto. Una vez cargado, modificar el XML para que coincida con
los cambios anteriores. Despus de haber hecho las modificaciones pertinentes en el archivo de manifiesto, la
nueva actividad est listo para ser instalado en el dispositivo.
325
Figura 33-3
Dentro de la seccin Actividad del dilogo de configuracin, seleccione la opcin No poner en marcha la
actividad de manera que se ha instalado la actividad, pero no se puso en marcha y hacer clic en el botn
Ejecutar. La instalacin correcta del paquete se informar en la ventana de herramientas Android Estudio
Run:
Instalacin com.ebookfrenzy.mywebview
326
DISPOSITIVO
shell
de
comandos:
"/data/local/tmp/com.ebookfrenzy.mywebview.mywebview"
pkg: /data/local/tmp/com.ebookfrenzy.mywebview
xito
pm
instalar
-r
Una vez completada la instalacin, la actividad est listo para ser incluido en el proceso de resolucin de la
intencin del marco Android.
Prueba de la aplicacin
Con el fin de probar MyWebView, simplemente vuelva a iniciar la aplicacin ImplicitIntent creado
anteriormente en este captulo y toque el botn Mostrar Pgina Web. Esta vez, sin embargo, el proceso de
resolucin de la intencin encontrar dos actividades con filtros intencin que concuerden con la intencin
implcita. Como tal, el sistema mostrar un cuadro de dilogo (Figura 33-4) proporcionar al usuario la eleccin
de la actividad para lanzar.
Figura 33-4
Al seleccionar la opcin MyWebView seguido del botn Slo una vez debera hacer que la intencin de ser
manejado por nuestro nuevo MyWebViewActivity, que posteriormente aparecer y mostrar la pgina Web
designado.
Si la pgina web se carga en el navegador Chrome sin el dilogo de seleccin que aparece ms arriba, puede
ser que Chrome se ha configurado como el navegador por defecto en el dispositivo.Esto se puede cambiar
por ir a Ajustes -> Aplicaciones en el dispositivo y elegir la categora TODOS. Desplcese por la lista de
aplicaciones y seleccione Chrome. En la pantalla de informacin de aplicaciones Chrome, toque el botn
Borrar valores predeterminados.
Resumen
Intenciones implcitas proporcionan un mecanismo por el cual una actividad se puede solicitar el servicio de
otro simplemente especificando un tipo de accin y, opcionalmente, los datos en que esa accin se va a
realizar. Con el fin de ser elegible como candidato blanco de una intencin implcita, sin embargo, una
327
actividad debe estar configurado para extraer los datos correspondientes del objeto intencin entrante y se
incluirn en un fichero de manifiesto configurado correctamente, incluyendo los permisos adecuados y filtros
intencin. Cuando se encuentra ms de una actividad a juego para una intencin implcita durante una
bsqueda resolucin intencin, se solicita al usuario que tomar una decisin en cuanto a cul usar.
Dentro de este captulo un ejemplo ha sido creado para demostrar tanto la emisin de una intencin implcita,
y la creacin de una actividad ejemplo capaz de manejar esa intencin.
328
12 Resumen
329
La cadena de accin, que identifica el evento de difusin, debe ser nico y por lo general utiliza la sintaxis de
Java nombre del paquete de la aplicacin. Por ejemplo, el siguiente fragmento de cdigo crea y enva una
intencin de difusin que incluye una cadena de accin nico y los datos:
Intencin Intencin = new Intent ();
intent.setAction ("com.example.Broadcast");
intent.putExtra ("MyData", 1000);
sendBroadcast (intencin);
El cdigo anterior sera lanzar con xito el receptor de difusin correspondiente en un dispositivo que ejecuta
una versin anterior de Android de 3,0. En las versiones ms recientes de Android, sin embargo, la intencin
no sera recibida por el receptor de radiodifusin. Esto se debe a Android 3.0 introdujo una medida de
seguridad de control de lanzamiento que impide que los componentes de las aplicaciones dejado de ser
puesto en marcha a travs de una intencin. Una aplicacin se considera que est en un estado detenido si la
solicitud ha sido o bien simplemente se instala y no lanzado previamente, o ha detenido manualmente por el
usuario mediante el gestor de aplicaciones en el dispositivo. Para evitar esto, sin embargo, una bandera se
puede aadir a la intencin antes de que se enva para indicar que la intencin es que se le permita iniciar un
componente de una aplicacin detenido. Esta bandera es FLAG_INCLUDE_STOPPED_PACKAGES y se
utilizara como se indica en la siguiente adaptacin del fragmento de cdigo anterior:
Intencin Intencin = new Intent ();
intent.addFlags (Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.setAction ("com.example.Broadcast");
intent.putExtra ("MyData", 1000);
sendBroadcast (intencin);
330
android.content.BroadcastReceiver importacin;
android.content.Context importacin;
android.content.Intent importacin;
public class MyReceiver extiende BroadcastReceiver {
MyReceiver pblico () {
}
@ Override
public void OnReceive (contexto Contexto, la intencin Intencin) {
// Implementar cdigo aqu a realizar cuando
// Se detecta emisin
}
}
Al registrar un receptor de radiodifusin dentro de un archivo de manifiesto, hay que aadir un <Receptor>
entrada que contenga uno o ms filtros de intencin, cada uno que contiene la cadena de accin de la
intencin de difusin para las que se requiere el receptor para escuchar.
El siguiente archivo de manifiesto ejemplo registra el receptor ejemplo emisin de arriba para escuchar los
intentos de transmisin que contengan una cadena de accin de com.example.Broadcast:
El mismo efecto se puede lograr mediante el registro de la receptor de radiodifusin en el cdigo utilizando el
mtodo registerReceiver () de la clase Actividad junto con un objeto IntentFilter configurado apropiadamente:
331
unregisterReceiver (receptor);
Es importante tener en cuenta que algunos intentos de difusin del sistema slo pueden ser detectadas por
un receptor de difusin si se ha registrado en el cdigo en lugar de en el archivo de manifiesto. Compruebe la
documentacin de la clase Intencin Android para obtener una descripcin detallada de los intentos de
difusin del sistema y los requisitos correspondientes en lnea en:
http://developer.android.com/reference/android/content/Intent.html
332
transmisiones del sistema Android son pegajoso, un buen ejemplo siendo esas emisiones relacionadas con el
estado de nivel de batera.
Una emisin persistente puede ser removido en cualquier momento por medio de una llamada al mtodo
removeStickyBroadcast (), pasando por como argumento una referencia a la intencin de difusin a ser
removido.
vez
que
el
nuevo
proyecto
se
ha
creado,
localizar
cargar
el
archivo
de
diseo
333
Tenga
en
cuenta
que,
en
este
caso,
la
cadena
de
accin
para
la
intencin
es
334
Como puede verse en el cdigo, Android Estudio ha generado una plantilla para la nueva clase y generado un
stub para el mtodo OnReceive (). Ahora deben hacerse a la clase para implementar el comportamiento
requerido una serie de cambios. Permanecer en el archivo MyReceiver.java, por lo tanto, modificar el cdigo
para que se lea de la siguiente manera:
com.ebookfrenzy.broadcastreceiver paquete;
android.content.BroadcastReceiver importacin;
android.content.Context importacin;
android.content.Intent importacin;
android.widget.Toast importacin;
public class MyReceiver extiende BroadcastReceiver {
MyReceiver pblico () {
335
}
@ Override
public void OnReceive (contexto Contexto, la intencin Intencin) {
Toast.makeText (contexto, "Broadcast Intencin detectado.",
Toast.LENGTH_LONG) .Show ();
}
}
Con el archivo de manifiesto completado, el ejemplo de difusin est listo para ser probado.
336
Una vez instalado el receptor, ejecute la aplicacin SendBroadcast en el mismo dispositivo o AVD y esperar a
que aparezca en la pantalla. Una vez en funcionamiento, toque el botn, momento en el que el mensaje de la
tostada de leer "Intencin Broadcast detectado." Debera aparecer durante unos segundos antes de
desaparecer.
En el caso de que no aparezca el mensaje tostadas, vuelva a comprobar que la aplicacin BroadcastReceiver
instalado correctamente y que el filtro de la intencin en el archivo de manifiesto coincide con la cadena de
accin se utiliza cuando se transmiti la intencin.
que
el
receptor
tiene
que
estar
escuchando
en
este
contexto
es
337
Dado que el mtodo OnReceive () ahora va a estar escuchando para dos tipos de intencin de difusin, vale
la pena modificar el cdigo para que la cadena de accin de la intencin actual tambin se visualiza en el
mensaje de brindis. Esta cadena se puede obtener a travs de una llamada al mtodo getAction () del objeto
intencin pasado como argumento al mtodo OnReceive ():
public void OnReceive (contexto Contexto, la intencin Intencin) {
Cadena mensaje = "intencin Broadcast detect"
+ Intent.getAction ();
Toast.makeText (contexto, mensaje,
Toast.LENGTH_LONG) .Show ();
}
A continuacin, retire el conector USB que se est suministrando energa al dispositivo Android, momento en
el que el receptor debe informar lo siguiente en el mensaje brindis: Broadcast intencin detecta
android.intent.action.ACTION_POWER_DISCONNECTED
Resumen
Intentos de difusin son un mecanismo por el cual la intencin puede ser emitido para el consumo de
mltiples componentes en un sistema Android. Las transmisiones son detectados por el registro de un
338
receptor de radiodifusin, que, a su vez, est configurado para escuchar las intenciones que responden a
determinadas secuencias de accin. En general, los receptores de radiodifusin permanecen latentes hasta
despertado por el sistema cuando se detecta un intento juego. Intentos de difusin tambin son utilizados por
el sistema Android para emitir notificaciones de eventos tales como una advertencia de batera baja o la
conexin o desconexin de la alimentacin externa al dispositivo.
Adems de proporcionar una visin general de los intentos y receptores de radiodifusin, en este captulo
tambin ha trabajado a travs de un ejemplo de envo de intentos de transmisin y la implementacin de un
receptor de radiodifusin para escuchar para ambos intentos de transmisin personalizados y del sistema.
339
Contenido
3 Manipuladores Thread
8 Resumen
en
el
sistema
operativo
que
muestra
una
"aplicacin
no
responde" advertencia
al
340
usuario. Claramente, esto est lejos de ser el comportamiento deseado para cualquier aplicacin. En tal
situacin, esto puede evitarse simplemente con el lanzamiento de la tarea a realizar en un hilo separado,
permitiendo que el hilo principal para continuar sin obstculos con otras tareas.
Manejadores de rosca
Es evidente que una de las reglas fundamentales del desarrollo de Android no es para realizar operaciones
que consumen mucho tiempo en el hilo principal de la aplicacin. La segunda regla, igualmente importante es
que el cdigo dentro de un subproceso independiente debe nunca, bajo ninguna circunstancia, actualizar
directamente cualquier aspecto de la interfaz de usuario. Cualquier cambio en la interfaz de usuario siempre
deben realizarse desde dentro del hilo principal. La razn de esto es que el conjunto de herramientas de
interfaz de usuario de Android no es seguro para subprocesos. Los intentos de trabajar con cdigo no seguro
para subprocesos desde dentro mltiples hilos tpicamente resultar en problemas intermitentes y
comportamiento de la aplicacin impredecible.
En el caso de que el cdigo que se ejecuta en un hilo necesita interactuar con la interfaz de usuario, debe
hacerlo mediante la sincronizacin con el hilo principal de la interfaz de usuario. Esto se consigue mediante la
creacin de un controlador dentro de la rosca principal, que, a su vez, recibe mensajes desde otro hilo y
actualiza la interfaz de usuario en consecuencia.
341
Figura 35-1
Doble click en la vista botn y cambiar el texto a "Presione Me". Extracto de la cadena en un recurso
denominado button_text. Con todava seleccionada la vista botn en el diseo, busque la propiedad onClick
en el panel Propiedades y escriba buttonClick como el nombre del mtodo.
Una vez completado, el contenido del archivo XML debe ser similar a la siguiente lista:
342
android:
android:
android:
android:
android:
<Botn
android:
android:
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
layout_centerVertical = "true"
layout_centerHorizontal = "true"
id = "@ + / Identificacin del myTextView" />
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / button_string"
id = "@ + / Identificacin del botn"
layout_below = "@ + / Identificacin del myTextView"
layout_centerHorizontal = "true"
layout_marginTop = "45dp"
onClick = "buttonClick" />
</ RelativeLayout>
com.ebookfrenzy.threadexample paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.View importacin;
android.widget.TextView importacin;
public class ThreadExampleActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_thread_example);
}
public void buttonClick (Ver vista)
{
larga endTime = System.currentTimeMillis () + 20 * 1000;
while (System.currentTimeMillis () <endTime) {
sincronizado (este) {
tratar {
esperar (endTime - System.currentTimeMillis ());
343
} Catch (Exception e) {
}
}
}
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText ("botn presionado");
}
.
.
.
}
Con el cdigo cambia, ejecute la aplicacin ya sea en un dispositivo fsico o un emulador. Una vez que la
aplicacin se est ejecutando, toque el botn, momento en el que aparecer la aplicacin para
congelar. Ser, por ejemplo, que no sea posible tocar el botn una segunda vez y en algunos casos el
sistema operativo, como se demuestra en la Figura 35-2, reportar la aplicacin como responde:
Figura 35-2
Claramente, cualquier cosa que se va a tomar tiempo para completar dentro del mtodo buttonClick () debe
realizarse dentro de un hilo separado.
344
Cuando la aplicacin es ahora dirigido, tocando el botn hace que el retraso que se realicen en un nuevo hilo
dejando el hilo principal para continuar el manejo de la interfaz de usuario, incluyendo la respuesta a las
pulsaciones de botn adicionales. De hecho, cada vez que se toca el botn, se crear un nuevo hilo,
permitiendo que la tarea que se realiza varias veces al mismo tiempo.
Un cierre para la inspeccin de la cdigo actualizado para el mtodo buttonClick () revelar que el cdigo para
actualizar la TextView se ha eliminado. Como se dijo anteriormente, la actualizacin de un elemento de la
interfaz de usuario desde un subproceso distinto del hilo principal viola una regla fundamental de desarrollo
de Android. Con el fin de actualizar la interfaz de usuario, por lo tanto, ser necesario implementar un
controlador para el hilo.
345
com.ebookfrenzy.threadexample paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.View importacin;
android.widget.TextView importacin;
android.os.Handler importacin;
android.os.Message importacin;
public class ThreadExampleActivity extiende ActionBarActivity {
Manejador Handler = new Handler () {
@ Override
public void handleMessage (msg Mensaje) {
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText ("botn presionado");
}
};
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_thread_example);
}
.
.
.
}
Los cambios en el cdigo anteriores han declarado un manejador y aplicado dentro de ese manejador de la
devolucin de llamada handleMessage () que se llamar cuando el hilo enva al controlador de un
mensaje. En este caso, el cdigo simplemente muestra una cadena en el objeto TextView en la interfaz de
usuario. Todo lo que queda ahora es modificar el hilo creada en el mtodo buttonClick () para enviar un
mensaje al controlador cuando el retraso se ha completado:
public void buttonClick (Ver vista)
{
Ejecutable ejecutable = new Ejecutable () {
public void run () {
larga endTime = System.currentTimeMillis () +
20 * 1000;
while (System.currentTimeMillis () <endTime) {
sincronizado (este) {
tratar {
espere (endTime System.currentTimeMillis ());
346
} Catch (Exception e) {}
}
}
handler.sendEmptyMessage (0);
}
};
MyThread Tema = new Thread (ejecutable);
mythread.start ();
}
Tenga en cuenta que el nico cambio que se ha hecho es hacer una llamada al mtodo sendEmptyMessage
() del manejador. Desde el controlador actualmente no hace nada con el contenido de los mensajes que
recibe no es necesario para crear y enviar un objeto de mensaje al controlador.
Compilar y ejecutar la aplicacin y, una vez que la ejecucin, toque el botn. Despus de un retraso de 20
segundos, el nuevo texto aparecer en el objeto TextView en la interfaz de usuario.
347
.
public void buttonClick (Ver vista)
{
Ejecutable ejecutable = new Ejecutable () {
public void run () {
Msg Mensaje = handler.obtainMessage ();
Haz Bundle = new Bundle ();
SimpleDateFormat dateformat =
nueva SimpleDateFormat ("HH: mm: ss MM / dd / aaaa",
Locale.US);
Cadena DateString =
dateformat.format (new Date ());
bundle.putString ("myKey", DateString);
msg.setData (paquete);
handler.sendMessage (msg);
}
};
MyThread Tema = new Thread (ejecutable);
mythread.start ();
}
.
.
.
}
A continuacin, actualizar el mtodo handleMessage () del manejador para extraer la cadena de fecha y hora
del objeto de lote en el mensaje y mostrarlo en el objeto TextView:
Manejador Handler = new Handler () {
@ Override
public void handleMessage (msg Mensaje) {
Haz Bundle = msg.getData ();
Cadena String = bundle.getString ("myKey");
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText (cadena);
}
};
Por ltimo, compilar y ejecutar la aplicacin y probar que tocar el botn ahora hace que la fecha y hora
actuales a aparecer en el objeto TextView.
Resumen
El objetivo de este captulo ha sido proporcionar una visin general de roscado dentro de las aplicaciones de
Android. Cuando una aplicacin se lanz por primera vez en un proceso, el sistema de ejecucin crea un hilo
conductor en el que todos los componentes de la aplicacin posteriormente lanzados ejecutan de forma
348
predeterminada. La funcin principal del hilo principal es manejar la interfaz de usuario, por lo que las tareas
que consumen tiempo realizados en ese hilo dar la apariencia de que la aplicacin se ha bloqueado. Es
esencial, por tanto, que las tareas que puedan tener tiempo para completar iniciarse en un hilo separado.
Debido a que el conjunto de herramientas de interfaz de usuario de Android no es seguro para subprocesos,
no se deben hacer cambios en la interfaz de usuario en cualquier tema que no sea el hilo principal. Cambios
en la interfaz de usuario se pueden implementar mediante la creacin de un controlador en el hilo principal
para que los mensajes pueden ser enviados desde otros no principales hilos.
349
1 Servicios Comenzado
2 Servicio de Intencin
3 Servicio Bound
4 La Anatoma de un servicio
8 Resumen
Servicios empezados
Servicios iniciados son lanzados por otros componentes de la aplicacin (por ejemplo, una actividad o incluso
un receptor de radiodifusin) y potencialmente ejecutar indefinidamente en el fondo hasta que se detiene el
servicio, o se destruye por el sistema de ejecucin de Android con el fin de liberar recursos. Un servicio
continuar funcionando si la aplicacin que se inici ya no est en primer plano, e incluso en el caso de que el
componente que originalmente comenz el servicio se destruye.
Por defecto, un servicio se ejecutar en el mismo hilo principal como el proceso de solicitud de la que se puso
en marcha (referido como un servicio local). Es importante, por tanto, que las tareas intensivas de la CPU
pueden realizar en un nuevo hilo en el servicio. Instruir a un servicio para funcionar dentro de un proceso
separado (y por lo tanto conocido como un servicio a distancia) requiere un cambio de configuracin en el
archivo de manifiesto.
A menos que un servicio est configurado especficamente para ser privada (una vez ms a travs de un
ajuste en el archivo de manifiesto), que el servicio puede ser iniciado por otros componentes en el mismo
350
dispositivo Android. Esto se logra utilizando el mecanismo de Intencin de la misma manera que una actividad
puede lanzar otro como se describe en los captulos anteriores.
Servicios iniciados se ponen en marcha a travs de una llamada al mtodo StartService (), pasando por como
argumento un objeto Intencin que identifica el servicio se inicie. Cuando un servicio comenzado ha
completado sus tareas, debe pararse a travs de una llamada a stopSelf (). Alternativamente, un servicio en
ejecucin puede ser detenido por otro componente a travs de una llamada al mtodo stopService (),
pasando por como argumento la Intencin a juego para que el servicio se detuvo.
Los servicios se les da una alta prioridad por el sistema Android y suelen ser los ltimos en ser terminado a fin
de liberar recursos.
Servicio de Intencin
Como se ha sealado anteriormente, los servicios se ejecutan de forma predeterminada en el mismo hilo
principal como el componente de los que se ponen en marcha. Como tal, cualquier tarea de CPU intensiva
que deben ser realizadas por el servicio debe tener lugar dentro de un nuevo tema, evitando as afectar el
rendimiento de la aplicacin de llamada.
La clase IntentService es una clase de conveniencia (subclase de la clase de servicio) que configura un
subproceso de trabajo para el manejo de tareas en segundo plano y se ocupa de cada solicitud de forma
asncrona. Una vez que el servicio ha atendido todas las solicitudes en cola, simplemente se sale. Todo lo
que se requiere cuando se utiliza la clase IntentService es que se implementar el mtodo onHandleIntent ()
que contiene el cdigo que se ejecutar para cada solicitud.
Para los servicios que no requieren procesamiento sncrono de solicitudes, IntentService es la opcin
recomendada. Servicios que requieren un manejo sincrnico de las solicitudes sern, sin embargo, la
necesidad de una subclase de la clase de servicio y manual de implementar y administrar rosca para manejar
las tareas intensivas de la CPU de manera eficiente.
Servicio Bound
Un servicio de cota es similar a un servicio comenz con la excepcin de que un servicio iniciado por lo
general no devuelve resultados o permitir la interaccin con el componente que lo lanz. Un servicio de
encuadernado, por otro lado, permite que el componente de lanzamiento para interactuar con, y recibir los
resultados de, el servicio. A travs de la implementacin de la comunicacin entre procesos (IPC), esta
interaccin tambin puede tener lugar a travs de lmites de proceso. Una actividad puede, por ejemplo,
iniciar un servicio para manejar la reproduccin de audio. La actividad ser, con toda probabilidad, incluyen
una interfaz de usuario que proporciona controles para el usuario con el fin de hacer una pausa la
reproduccin o saltar a la siguiente pista. Del mismo modo, el servicio ser muy probable que tenga que
comunicar la informacin a la actividad de llamadas para indicar que la pista de audio actual se ha
completado y proporcionar detalles de la prxima pista que est a punto de empezar a jugar.
351
Un componente (tambin denominado en este contexto como un cliente) se inicia y se une a un servicio unido
a travs de una llamada al mtodo bindService () y mltiples componentes puede unirse a un servicio de
forma simultnea. Cuando el servicio de la unin ya no es necesario por un cliente, se debe hacer una
llamada al mtodo unbindService (). Cuando el ltimo cliente cota desenlaza de un servicio, el servicio se
dar por terminado por el sistema de ejecucin de Android. Es importante tener en cuenta que un servicio
consolidado tambin se puede iniciar a travs de llamada a StartService (). Una vez iniciado, los
componentes pueden entonces unirse a ella a travs bindService () llama. Cuando se puso en marcha un
servicio unido a travs de una llamada a StartService () seguir funcionando incluso despus de que el ltimo
cliente desvincula de ella.
Un servicio unido debe incluir una implementacin del mtodo onBind () que se llama tanto cuando se crea
inicialmente el servicio y cuando otros clientes posteriormente se unen a la servicio en ejecucin. El propsito
de este mtodo es devolver a la unin clientes un objeto de tipo IBinder que contiene la informacin que
necesita el cliente para comunicarse con el servicio.
En trminos de la aplicacin de la comunicacin entre un cliente y un servicio de encuadernado, la tcnica
recomendada depende de si el cliente y el servicio residen en el mismo o diferentes procesos y si es o no el
servicio es privado para el cliente. Comunicacin local se puede lograr mediante la extensin de la clase
Binder y devolver un ejemplo del mtodo onBind (). La comunicacin entre procesos, por el contrario, requiere
la aplicacin Messenger y Handler. Los detalles de estos dos enfoques se tratarn en captulos posteriores.
La anatoma de un Servicio
Un servicio debe, como ya se ha mencionado, se crear como una subclase de la clase de servicio de
Android
(ms
especficamente
android.app.Service)
una
sub-clase
de
la
misma
(como
android.app.IntentService). Como parte del procedimiento de subclases, uno o ms de los siguientes mtodos
de devolucin de llamada superclase debe ser anulado, dependiendo de la naturaleza exacta del servicio que
se est creando:
onStartCommand () - Este es el mtodo que se llama cuando el servicio se inicia por otro componente a
travs de una llamada al mtodo StartService (). Este mtodo no necesita ser ejecutado por los servicios
consolidados.
onBind () - Se llama cuando un componente se une al servicio a travs de una llamada al mtodo
bindService (). Al implementar un servicio de encuadernado, este mtodo debe devolver un objeto IBinder
facilitar la comunicacin con el cliente. En el caso de los servicios iniciados, este mtodo debe ser
implementado para devolver un valor NULL.
onCreate () - Concebido como un lugar para llevar a cabo tareas de inicializacin, este mtodo se llama
inmediatamente antes de la llamada a cualquiera onStartCommand () o la primera llamada al mtodo
onBind ().
onHandleIntent () - Slo se aplica a las subclases IntentService. Este mtodo se llama para manejar el
procesamiento por el servicio. Se ejecuta en un hilo separado de la aplicacin principal.
352
Tenga en cuenta que la clase IntentService incluye sus propias implementaciones de los onStartCommand ()
y onBind () los mtodos de devolucin de llamada por lo que estos no necesitan ser implementado en
subclases.
START_NOT_STICKY - Indica al sistema que el servicio no debe reiniciarse en caso de que se destruye
a menos que existan intenciones pendientes en espera de la entrega.
START_STICKY - Indica que el servicio debe reiniciarse tan pronto como sea posible despus de que
haya sido destruida si la destruccin se produjo despus de que el mtodo onStartCommand ()
devuelve. En el caso de que no hay intenciones pendientes estn esperando a ser entregado, el mtodo
de devolucin de llamada onStartCommand () se llama con un valor NULL intencin. La intencin est
procesando en el momento en que el servicio fue destruido se descarta.
START_REDELIVER_INTENT - Indica que, si el servicio fue destruido despus de regresar del mtodo
de devolucin de llamada onStartCommand (), el servicio debe reiniciarse con la intencin actual
entregado de nuevo al mtodo onStartCommand () seguido de cualquier intenciones pendientes.
353
De forma predeterminada, los servicios son declarados como pblicos, en cuanto a que se puede acceder a
los componentes fuera del paquete de aplicaciones en el que residen. Con el fin de hacer un servicio privado,
el androide: propiedad exportada se debe declarar como falso dentro del elemento <service> del archivo de
manifiesto. Por ejemplo:
<Androide servicio: name = "MyService"
android: exportado = "false">
</ Service>
Como se discuti previamente, los servicios se ejecutan dentro del mismo proceso como el componente de
llamada por defecto. Con el fin de obligar a un servicio para funcionar dentro de su propio proceso, agregue
un androide: Vivienda de proceso para el elemento <service>, declarando un nombre para el proceso con el
prefijo dos puntos (:):
<Androide servicio: name = "MyService"
android: exportado = "false"
android: proceso = ": myprocess">
</ Service>
El prefijo de colon indica que el nuevo proceso es privado para la aplicacin local. Si el nombre del proceso
comienza con una letra minscula en lugar de los dos puntos, sin embargo, el proceso ser global y
disponible para su uso por otros componentes.
Por ltimo, utilizando los mismos mecanismos de filtro intencin esbozados para las actividades, un servicio
puede tambin anunciar capacidades a otras aplicaciones que se ejecutan en el dispositivo. Para ms
detalles sobre Intencin Filtros, consulte el captulo titulado Una visin general de Intenciones Android.
con
un
filtro
intencin
configurado
para
escuchar
para
el
sistema
Resumen
Servicios de Android son un poderoso mecanismo que permite a las aplicaciones para realizar tareas en
segundo plano. Un servicio, una vez puesto en marcha, continuar funcionando independientemente de si la
aplicacin de llamada ya no es la tarea de primer plano y, incluso en el caso de que el componente que inicia
el servicio se destruye.
354
Los servicios son subclases de la clase de servicio de Android y entran en la categora de cualquiera de los
servicios iniciadas o servicios consolidados. Servicios iniciados correr hasta que se detienen o se destruyen y
no
proporcionan
por
un
mecanismo
de
interaccin
intercambio
de
datos
con
otros
componentes. Servicios Bound, por otro lado, proporcionan una interfaz de comunicacin con otros
componentes de cliente y, en general, corren hasta que el ltimo cliente desenlaza del servicio.
De forma predeterminada, los servicios se ejecutan localmente en el mismo proceso y el hilo principal como la
aplicacin de llamada. Un nuevo hilo debe, por lo tanto, se crear dentro del servicio con el fin de manejar las
tareas intensivas de la CPU. Servicios remotos pueden comenzar dentro de un proceso separado al hacer un
cambio de configuracin de menor importancia en el correspondiente <service> entrada en el archivo de
manifiesto de aplicacin.
La clase IntentService (en s misma una subclase de la clase de servicio de Android) proporciona un
mecanismo conveniente para el manejo de solicitudes de servicios asncronos dentro de un subproceso de
trabajo independiente.
355
9 Ejecucin de la aplicacin
11 Resumen
356
una
nueva
clase
al proyecto
haciendo
clic
derecho
sobre
el
nombre
del
paquete
La clase necesita ser modificado para que las subclases de la clase IntentService. Cuando una subclase de la
clase IntentService, hay dos reglas que se deben seguir. En primer lugar, un constructor de la clase debe
implementar el cual llama al constructor de la superclase, que pasa por el nombre de la clase del servicio. En
segundo lugar, la clase debe reemplazar el mtodo onHandleIntent ().Modifique el cdigo en el archivo
MyIntentService.java, por lo tanto, para que se lea de la siguiente manera:
com.ebookfrenzy.serviceexample paquete;
android.app.IntentService importacin;
android.content.Intent importacin;
public class MyIntentService extiende IntentService {
@ Override
protegida onHandleIntent void (arg0 Intencin) {
}
MyIntentService pblico () {
super ("MyIntentService");
}
}
357
Todo lo que queda en este punto es implementar un cdigo dentro del mtodo onHandleIntent () para que el
servicio realmente hace algo cuando se invoca. Normalmente esto implicara la realizacin de una tarea que
toma algn tiempo para completar, como la descarga de un archivo de gran tamao o la reproduccin de
audio. Para los fines de este ejemplo, sin embargo, el manejador de salida simplemente un mensaje al panel
Android Estudio LogCat:
com.ebookfrenzy.serviceexample paquete;
android.app.IntentService importacin;
android.content.Intent importacin;
android.util.Log importacin;
public class MyIntentService extiende IntentService {
esttica TAG final String privada =
"Com.ebookfrenzy.serviceexample";
@ Override
protegida onHandleIntent void (arg0 Intencin) {
Log.i (TAG, "Servicio de Intencin comenz");
}
MyIntentService pblico () {
super ("MyIntentService");
}
}
358
Todo lo que el cdigo aadido tiene que hacer es crear un nuevo objeto Intencin cebado con el nombre de
clase de servicio para comenzar y luego utilizarlo como argumento para el mtodo StartService ().
359
herramienta, asegrese de que los dispositivos | pestaa Logcat se selecciona antes de acceder al men de
la esquina superior derecha del panel (que probablemente leer Actualmente Sin filtros). Desde este men,
seleccione la opcin de men Configuracin Editar filtro.
En Crear nuevo Logcat Filtra nombre dilogo ServiceExample filtro y, en el campo por Tag Log (regex),
introduzca el valor TAG declarada en ServiceExampleActivity.java (en el ejemplo de cdigo anterior se trataba
de com.ebookfrenzy.serviceexample pero es posible que haya cambiado esto refleja la URL de su empresa).
Cuando los cambios se hayan completado, haga clic en el botn Aceptar para crear el filtro y cerrar el
dilogo. En vez de enumerar Sin filtros, el filtro recin creado ahora debe ser seleccionado en la ventana de
herramientas Android. Con el filtro configurado, ejecutar la aplicacin en un dispositivo o emulador AVD
sesin fsica y tenga en cuenta que el "Servicio Intencin Started" aparece en el panel LogCat (tenga en
cuenta que puede ser necesario cambiar la configuracin de nuevo a ServiceExample despus de la
aplicacin de men filtro ha puesto en marcha):
5 al 20 09: 38: 50,953 10961 a 10996 / com.ebookfrenzy.serviceexample
com.example.serviceexample: Servicio Intencin empez
El servicio haba sido encargado de una actividad a largo plazo, el servicio habra continuado ejecutndose en
segundo plano en un hilo separado hasta que se complet la tarea, lo que permite la aplicacin siga
funcionando y respondiendo al usuario. Dado que todo nuestro servicio hizo fue ingrese un mensaje, se habr
parado simplemente al finalizar.
360
ejemplo, el mtodo onStartCommand () ser de bucle tres veces la realizacin de una espera de 10 segundos
en cada bucle. Para mayor abundamiento, las versiones de cdigo auxiliar del onCreate () y OnDestroy ()
mtodos tambin se llevarn a cabo en el nuevo archivo MyService.java de la siguiente manera:
com.ebookfrenzy.serviceexample paquete;
android.app.Service importacin;
android.content.Intent importacin;
android.os.IBinder importacin;
android.util.Log importacin;
public class MyService extiende Servicio {
MyService pblico () {
}
esttica TAG final String privada =
"Com.ebookfrenzy.serviceexample";
@ Override
public void onCreate () {
Log.i (TAG, "Servicio onCreate");
}
@ Override
public int onStartCommand (intencin Intencin, int banderas, int startID) {
Log.i (TAG, "Servicio onStartCommand");
for (int i = 0; i <3; i ++) {
larga endTime = System.currentTimeMillis () +
10 * 1000;
while (System.currentTimeMillis () <endTime) {
sincronizado (este) {
tratar {
esperar (endTime - System.currentTimeMillis ());
} Catch (Exception e) {
}
}
}
Log.i (TAG, "Servicio de funcionamiento");
}
volver Service.START_STICKY;
}
@ Override
pblica IBinder onBind (arg0 Intencin) {
Log.i (TAG, "Servicio onBind");
devolver null;
}
@ Override
pblica OnDestroy void () {
Log.i (TAG, "OnDestroy Servicio");
361
}
}
Con el servicio implementado, cargar el archivo AndroidManifest.xml en el editor y verifique que Android
Studio ha aadido una entrada apropiada para el nuevo servicio, que queda redactado como sigue:
<Servicio
android: ". MyService" name =
android: enabled = "true"
android: exportado = "true">
</ Service>
362
A continuacin, edite el archivo ServiceExampleActivity.java aadir el mtodo buttonClick () y eliminar el
cdigo del mtodo onCreate () que se ha aadido previamente para lanzar el servicio MyIntentService:
com.ebookfrenzy.serviceexample paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.content.Intent importacin;
android.view.View importacin;
public class ServiceExampleActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_service_example);
}
public void buttonClick (Ver vista)
{
Intencin Intencin = new Intent (esto, MyService.class);
StartService (intencin);
}
}
Todo lo que el mtodo buttonClick () hace es crear un objeto intencin para el nuevo servicio e inicie
funcionando.
Ejecutar la aplicacin
Ejecutar la aplicacin y, una vez cargado, toque el botn Iniciar servicio. Dentro de la ventana LogCat
(utilizando el filtro ServiceExample creado previamente) los mensajes de registro aparecer indicando que se
ha llamado el mtodo onCreate () y que el bucle en el onStartCommand () mtodo se est ejecutando.
Antes de que aparezca el mensaje de bucle final, tratar de tocar el botn Inicio Servicio por segunda
vez. Tenga en cuenta que el botn no responde. Despus de unos 20 segundos, el sistema puede mostrar un
dilogo de advertencia que contiene el mensaje "ServiceExample no responde". La razn de esto es que el
hilo principal de la aplicacin se encuentra detenido por el servicio mientras se realiza la tarea de bucle. Esto
no slo impide la aplicacin de responder al usuario, sino tambin para el sistema, que eventualmente supone
que la aplicacin se ha bloqueado de alguna manera.
Claramente, el cdigo para el servicio necesita ser modificado para realizar tareas en un hilo separado desde
el hilo principal.
363
de la aplicacin se ejecutar de forma predeterminada. Este hilo se conoce generalmente como el hilo
principal. La funcin principal del hilo principal es manejar la interfaz de usuario en trminos de manejo de
eventos y la interaccin con vistas en la interfaz de usuario. Cualquier componente adicional que se inician
dentro de la aplicacin, por defecto, tambin se ejecutar en el hilo principal.
Como se ha demostrado en el apartado anterior, cualquier componente que lleva a cabo una operacin de
tiempo en el hilo principal har que la aplicacin deje de responder hasta que la tarea se ha completado. No
es de extraar, por tanto, que Android ofrece una API que permite a las aplicaciones crean y utilizan hilos
adicionales. Cualquier tareas realizadas en un hilo separado desde el hilo principal se realizan esencialmente
en el fondo. Tales discusiones se refieren tpicamente como hilos de fondo o de los trabajadores.
Una solucin muy simple a este problema consiste en la realizacin de la misin de servicio dentro de un
nuevo hilo. El mtodo siguiente onStartCommand () del archivo MyService.java, por ejemplo, ha sido
modificado para poner en marcha la tarea dentro de un nuevo hilo con el ms bsico de los ejemplos de
manipulacin de hilo:
@ Override
public int onStartCommand (intencin Intencin, int banderas, int startID) {
Log.i (TAG, "Servicio onStartCommand" + startID);
ltima int currentId = startID;
R = new Ejecutable Ejecutable () {
public void run () {
for (int i = 0; i <3; i ++)
{
larga endTime = System.currentTimeMillis () +
10 * 1000;
while (System.currentTimeMillis () <endTime) {
sincronizado (este) {
tratar {
espere (endTime System.currentTimeMillis ());
} Catch (Exception e) {
}
}
}
Log.i (TAG, "Servicio de funcionamiento" + currentId);
}
stopSelf ();
}
};
T = new Thread Thread (r);
t.Start ();
volver Service.START_STICKY;
}
364
Cuando la aplicacin es ahora dirigido, debe ser posible tocar el botn Iniciar servicio varias veces. Cada vez
que un nuevo hilo ser creado por el servicio para procesar la tarea. La salida LogCat ahora tambin incluir
un nmero de referencia a la startID de cada solicitud de servicio.
Con el servicio ahora tramitar las solicitudes fuera del hilo principal, la aplicacin sigue siendo sensible tanto
para el usuario y el sistema Android.
Resumen
En este captulo se ha trabajado a travs de un ejemplo de implementacin de un servicio de Android
empezado a utilizar las clases IntentService y Servicio. El ejemplo tambin demuestra el uso de hilos dentro
de un servicio para evitar que el hilo principal de la aplicacin que no responde.
365
5 Aplicacin de la Carpeta
8 Prueba de la aplicacin
9 Resumen
implementar
una
subclase
ServiceConnection
contiene
onServiceConnected
()
onServiceDisconnected () mtodos que se llamar una vez que la conexin cliente-servidor se ha establecido
o desconectado, respectivamente. En el caso del mtodo de onServiceConnected (), este se pas un objeto
IBinder que contiene la informacin necesaria por el cliente para interactuar con el servicio.
366
aplicacin que el componente de cliente (en otras palabras que se ejecuta dentro del mismo proceso y no
est disponible para componentes en otras aplicaciones), el mecanismo recomendado es crear una subclase
de la clase Binder y extenderlo para proporcionar una interfaz para el servicio. Una instancia de este objeto
Carpeta se devuelve mediante el mtodo onBind () y posteriormente utilizado por el componente de cliente
para acceder directamente a los mtodos y datos contenidos en el servicio.
En situaciones donde el servicio lmite no es local a la aplicacin (en otras palabras, se est ejecutando en un
proceso diferente de la componente de cliente), la interaccin se logra mejor usando una implementacin del
mensajero / Handler.
En el resto de este captulo, un ejemplo se crea con el objetivo de demostrar los pasos implicados en la
creacin, puesta en marcha y la interaccin con un servicio consolidado privado local.
367
La aplicacin de la Carpeta
Como se ha sealado anteriormente, los servicios ligados locales pueden comunicarse con los clientes
ligados al pasar un objeto Carpeta configurado adecuadamente para el cliente. Esto se logra mediante la
creacin de una subclase carpeta dentro de la clase de servicio consolidado y que se extiende por la adicin
de uno o ms nuevos mtodos que pueden ser llamados por el cliente. En la mayora de los casos, esto
simplemente implica la implementacin de un mtodo que devuelve una referencia a la instancia de servicio
enlazado. Con referencia a la presente instancia, el cliente puede entonces acceder a los datos y los mtodos
de llamada dentro del servicio ligada directamente.
Para los fines de este ejemplo, por lo tanto, son necesarios algunos cambios a la clase de plantilla
BoundService creado en la seccin anterior. En el primer caso, una subclase carpeta debe ser
declarado. Esta clase contendr un nico mtodo denominado a getService () que devuelva una referencia a
la instancia del objeto de servicio actual (representada por la palabra clave this). Con estos requisitos en
mente, edite el archivo BoundService.java y modificarlo de la siguiente manera:
com.ebookfrenzy.localbound paquete;
android.app.Service importacin;
android.content.Intent importacin;
android.os.IBinder importacin;
android.os.Binder importacin;
public class BoundService extiende Servicio {
ltima IBinder MyBinder = new MyLocalBinder privada ();
BoundService pblico () {
}
@ Override
pblica IBinder onBind (intencin Intencin) {
// TODO: Devolver el canal de comunicacin con el servicio.
throw new UnsupportedOperationException ("Todava no implementado");
}
public class MyLocalBinder extiende Carpeta {
BoundService a getService () {
368
volver BoundService.this;
}
}
}
Despus de haber realizado los cambios a la clase, vale la pena tomar un momento para recapitular los pasos
realizados aqu. En primer lugar, se declara una nueva subclase de Carpeta (llamado MyLocalBinder). Esta
clase contiene un nico mtodo para el nico propsito de devolver una referencia a la instancia actual de la
clase BoundService. Se crea una nueva instancia de la clase MyLocalBinder y asignado a la referencia
MyBinder IBinder (desde la carpeta es una subclase de IBinder no hay coincidencia de tipos en esta tarea).
A continuacin, el onBind () mtodo necesita ser modificado para devolver una referencia al objeto MyBinder
y un nuevo mtodo pblico implementado para devolver la hora actual cuando llama por cualquier cliente que
se unen al servicio:
com.ebookfrenzy.localbound paquete;
java.text.SimpleDateFormat importacin;
java.util.Date importacin;
java.util.Locale importacin;
android.app.Service importacin;
android.content.Intent importacin;
android.os.IBinder importacin;
android.os.Binder importacin;
public class BoundService extiende Servicio {
ltima IBinder MyBinder = new MyLocalBinder privada ();
BoundService pblico () {
}
@ Override
pblica IBinder onBind (intencin Intencin) {
volver MyBinder;
}
public String GetCurrentTime () {
SimpleDateFormat dateformat =
nueva SimpleDateFormat ("HH: mm: ss MM / dd / aaaa",
Locale.US);
retorno (dateformat.format (new Date ()));
}
public class MyLocalBinder extiende Carpeta {
BoundService a getService () {
volver BoundService.this;
}
}
}
369
En este punto, el servicio lmite es completa y est listo para ser agregado al archivo de manifiesto de
proyecto. Localice y haga doble clic en el archivo AndroidManifest.xml para el proyecto LocalBound en la
ventana de herramientas del proyecto y, una vez cargado en el Editor de manifiesto, compruebe que Android
estudio ya ha aadido un elemento <service> entrada para el servicio de la siguiente manera:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.localbound.localbound">
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
<Actividad
android: name = ". LocalBoundActivity"
android: label = "@ string / nombre_apl">
<Intencin de filtro>
<Accin android: name = "android.intent.action.MAIN" />
<Categora android: name = "android.intent.category.LAUNCHER" />
</ Intencin de filtro>
</ Actividad>
<Servicio
android: name = ". BoundService"
android: enabled = "true"
android: exportado = "true">
</ Service>
</ Application>
</ Manifiesto>
La siguiente fase es poner en prctica el cdigo necesario dentro de la actividad de unirse al servicio y llamar
al mtodo GetCurrentTime ().
370
android.content.Context importacin;
android.content.Intent importacin;
android.content.ComponentName importacin;
android.content.ServiceConnection importacin;
com.ebookfrenzy.localbound.BoundService.MyLocalBinder importacin;
public class LocalBoundActivity extiende ActionBarActivity {
BoundService myService;
boolean isBound = false;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_local_bound);
}
myConnection ServiceConnection privada = new ServiceConnection ()
{
public void onServiceConnected (ComponentName className,
IBinder servicio) {
MyLocalBinder ligante = servicio (MyLocalBinder);
myService = binder.getService ();
isBound = true;
}
public void onServiceDisconnected (arg0 ComponentName) {
isBound = false;
}
};
}
El mtodo onServiceConnected () ser llamada cuando el cliente se une con xito para el servicio. El mtodo
se pasa como argumento el objeto IBinder devuelto por el mtodo onBind () del servicio.Este argumento se
echa a un objeto de tipo MyLocalBinder y luego se llama al mtodo a getService () del objeto aglutinante para
obtener una referencia a la instancia de servicio, que, a su vez, se asigna a myService. Una bandera
booleana se utiliza para indicar que la conexin se ha establecido con xito.
El mtodo onServiceDisconnected () se llama cuando la conexin termina y simplemente establece el
indicador booleano false.
Despus de haber establecido la conexin, el siguiente paso es para modificar la actividad para unirse al
servicio. Esto implica la creacin de una intencin y una llamada al mtodo bindService (), que se puede
realizar en el mtodo onCreate () de la actividad:
@ Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_local_bound);
Intencin Intencin = new Intent (esto, BoundService.class);
bindService (intencin, myConnection, Context.BIND_AUTO_CREATE);
371
Completando el Ejemplo
Todo lo que queda es implementar un mecanismo para llamar al mtodo GetCurrentTime () y mostrar el
resultado al usuario. Como ya es habitual, Android Estudio habr creado un archivo activity_local_bound.xml
plantilla para la actividad que contiene slo un TextView. Cargue este archivo en la herramienta Diseador
utilizando el modo de diseo, haga doble clic en el componente TextView y cambiar el ID de @ + /
Identificacin del myTextView. Mueva el TextView al centro del lienzo pantalla, aadir un botn de vista
debajo de la TextView y cambiar el texto en el botn para leer "Show Time", extraer el texto a un recurso de
cadena llamado button_string. Al trmino de estos cambios, el diseo debe ser similar a la ilustrada en la
Figura 38-1:
Figura 38-1
A continuacin, cambiar Diseador en modo texto y modificar el elemento de botn para declarar una
propiedad onClick configurado para llamar a un mtodo llamado showTime:
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: paddingLeft = "@ dimen / activity_horizontal_margin"
android: paddingRight = "@ dimen / activity_horizontal_margin"
android: paddingTop = "@ dimen / activity_vertical_margin"
android: paddingBottom = "@ dimen / activity_vertical_margin"
herramientas: context = ". LocalBoundActivity">
<TextView
android:
android:
android:
android:
android:
372
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / button_string"
id = "@ + / Identificacin del botn"
layout_below = "@ + / Identificacin del myTextView"
layout_centerHorizontal = "true"
onClick = "Showtime"
layout_marginTop = "44dp" />
</ RelativeLayout>
Por ltimo, edite el cdigo en el archivo LocalBoundActivity.java para implementar el mtodo showTime
(). Este mtodo simplemente llama al mtodo GetCurrentTime () del servicio (que, gracias al mtodo
onServiceConnected (), ya est disponible desde dentro de la actividad a travs de la referencia myService) y
asigna la cadena resultante a la TextView:
com.ebookfrenzy.localbound paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.os.IBinder importacin;
android.content.Context importacin;
android.content.Intent importacin;
android.content.ComponentName importacin;
android.content.ServiceConnection importacin;
com.ebookfrenzy.localbound.BoundService.MyLocalBinder importacin;
android.view.View importacin;
android.widget.TextView importacin;
public class LocalBoundActivity extiende ActionBarActivity {
BoundService myService;
boolean isBound = false;
public void showTime (Ver vista)
{
Cadena horaActual = myService.getCurrentTime ();
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText (horaActual);
}
.
.
.
}
373
Prueba de la aplicacin
Con el cdigo cambia completa, realice una prueba de funcionamiento de la aplicacin. Una vez visible, toque
el botn y tenga en cuenta que la vista cambia el texto para mostrar la fecha y la hora actual. El ejemplo se ha
iniciado satisfactoriamente y con destino a un servicio y, a continuacin llamado un mtodo de ese servicio
para causar una tarea a realizar y los resultados regres a la actividad.
Resumen
Cuando un servicio con destino es local y privado a una aplicacin, los componentes dentro de esa aplicacin
puede interactuar con el servicio sin la necesidad de recurrir a la comunicacin entre procesos (IPC). En
trminos generales, el mtodo de servicio onBind () devuelve un objeto IBinder que contiene una referencia a
la instancia del servicio en ejecucin. El componente de cliente implementa una subclase ServiceConnection
contiene mtodos de devolucin de llamada que se llaman cuando el servicio est conectado y
desconectado. El primer mtodo se pasa el objeto IBinder devuelto por el mtodo onBind () que permite
mtodos pblicos en el servicio a ser llamados.
Despus de haber cubierto la implementacin de servicios con destino local, el siguiente captulo se centrar
en el uso de IPC para interactuar con los servicios con destino remoto.
374
Contenido
1 Cliente de Comunicacin Servicio Remoto
8 Resumen
375
<Botn
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / button_string"
android: id = "@ + / Identificacin del botn"
android: layout_centerVertical = "true"
android: layout_centerHorizontal = "true"
android: onClick = "sendMessage" />
</ RelativeLayout>
376
la ventana de herramientas del proyecto y seleccione Nuevo -> Servicio -> Servicio opcin del
men. Especifique RemoteService como el nombre de clase y asegrese de que tanto las opciones
exportados y habilitados son seleccionados antes de hacer clic en Finalizar para crear la clase.
El siguiente paso es la implementacin de la clase controlador para el nuevo servicio. Esto se logra mediante
la ampliacin de la clase Handler y la realizacin del procedimiento handleMessage ().Este mtodo se llama
cuando se recibe un mensaje desde el cliente. Se pasa como argumento un objeto de mensaje que contiene
los datos que el cliente necesita para pasar al servicio. En este caso, esto ser un objeto de paquete que
contiene una cadena que se mostrar al usuario. La clase modificada en el archivo RemoteService.java debe
decir lo siguiente una vez que esta se ha implementado:
com.ebookfrenzy.remotebound paquete;
android.app.Service importacin;
android.content.Intent importacin;
android.os.IBinder importacin;
android.os.Bundle importacin;
android.os.Handler importacin;
android.os.Message importacin;
android.widget.Toast importacin;
android.os.Messenger importacin;
public class RemoteService extiende Servicio {
RemoteService pblico () {
}
clase IncomingHandler extiende Handler {
@ Override
public void handleMessage (msg Mensaje) {
Datos Bundle = msg.getData ();
Cadena dataString = data.getString ("MiCadena");
Toast.makeText (getApplicationContext (),
dataString, Toast.LENGTH_SHORT) .Show ();
}
}
@ Override
pblica IBinder onBind (intencin Intencin) {
// TODO: Devolver el canal de comunicacin con el servicio.
throw new UnsupportedOperationException ("Todava no implementado");
}
}
Con el controlador implementado, la tarea que queda en trminos del cdigo de servicio es modificar el
mtodo onBind () tal que devuelve un objeto que contiene un objeto IBinder Mensajero, que, a su vez,
contiene una referencia al controlador:
Mensajero final myMessenger = nuevo Messenger (nueva IncomingHandler ());
377
@ Override
pblica IBinder onBind (intencin Intencin) {
volver myMessenger.getBinder ();
}
La primera lnea del fragmento de cdigo anterior crea una nueva instancia de nuestra clase controlador y
pasa a travs de al constructor de un nuevo objeto Messenger. Dentro del mtodo onBind (), el mtodo
getBinder () del objeto mensajero se llama a regresar objeto IBinder del mensajero.
RemoteService"
enabled = "true"
exportado = "true"
proceso = ": my_process">
378
com.ebookfrenzy.remotebound paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.os.IBinder importacin;
android.os.Message importacin;
android.os.Messenger importacin;
android.os.RemoteException importacin;
android.content.ComponentName importacin;
android.content.Context importacin;
android.content.Intent importacin;
android.content.ServiceConnection importacin;
android.view.View importacin;
public class RemoteBoundActivity extiende ActionBarActivity {
Mensajero myService = null;
isBound boolean;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_remote_bound);
}
ServiceConnection privada myConnection =
nueva ServiceConnection () {
public void onServiceConnected (ComponentName className,
IBinder servicio) {
myService = nuevo Messenger (servicio);
isBound = true;
}
public void onServiceDisconnected (ComponentName className) {
myService = null;
isBound = false;
379
}
};
.
.
.
}
A continuacin, algo de cdigo necesita ser aadido para unirse al servicio remoto. Esto implica la creacin
de una intencin que coincida con el filtro de intencin para el servicio como se declara en el archivo de
manifiesto y luego hacer una llamada al mtodo bindService (), proporcionando la intencin y una referencia a
la instancia ServiceConnection como argumentos. Para los fines de este ejemplo, este cdigo se ejecutar en
el mtodo onCreate de la actividad ():
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_remote_bound);
Intencin Intencin = new Intent (getApplicationContext (),
RemoteService.class);
bindService (intencin, myConnection, Context.BIND_AUTO_CREATE);
}
380
e.printStackTrace ();
}
}
Con el cdigo cambia completo, compilar y ejecutar la aplicacin. Una vez cargado, toque el botn en la
interfaz de usuario, y en ese momento un mensaje Brindis debera aparecer que dice "mensaje recibido".
Resumen
Con el fin de poner en prctica la interaccin entre un cliente y un servicio con destino a distancia, es
necesario implementar un marco de comunicacin controlador / mensaje. Los conceptos bsicos detrs de
esta tcnica han sido cubiertos en este captulo junto con la implementacin de una aplicacin de ejemplo
diseado para demostrar la comunicacin entre un cliente y un servicio de encuadernado, cada uno que se
ejecuta en un proceso independiente.
381
Contenido
1 Tablas de base de datos Comprensin
6 Qu es SQLite?
9.1 Cursor
9.2 SQLiteDatabase
9.3 SQLiteOpenHelper
9.4 ContentValues
10 Resumen
382
383
crea una nueva fila y los datos para ese cliente almacenado en las columnas correspondientes de la nueva
fila.
Las filas se denominan tambin como registros o entradas y estos trminos generalmente se pueden utilizar
indistintamente a veces.
Qu es SQLite?
SQLite es una incorporado, sistema de gestin de bases de datos relacionales (RDBMS). La mayora de las
bases de datos relacionales (Oracle y MySQL son los principales ejemplos) son procesos de servidor
independientes que se ejecutan de forma independiente, y en cooperacin con las aplicaciones que requieren
acceso de base de datos. SQLite es referido como embebido, ya que se proporciona en la forma de una
biblioteca que est vinculado en las aplicaciones. Como tal, no hay un servidor de base de datos
independiente que se ejecuta en segundo plano. Todas las operaciones de base de datos se manejan
internamente dentro de la aplicacin a travs de las llamadas a funciones contenidas en la biblioteca SQLite.
Los desarrolladores de SQLite han puesto la tecnologa en el dominio pblico con el resultado de que ahora
es una solucin de base de datos ampliamente desplegado.
SQLite est escrito en el lenguaje de programacin C y, como tal, el SDK de Android proporciona una basada
"envoltorio" Java alrededor de la interfaz de base de datos subyacente. Consiste esencialmente en un
384
conjunto de clases que se pueden utilizar en el cdigo Java de una aplicacin para crear y administrar bases
de datos SQLite base.
Para obtener informacin adicional acerca de SQLite consulte http://www.sqlite.org .
creacin
de
una
aplicacin
para
Android
que
utiliza
SQLite
puede
parecer
un
poco
intimidante. Afortunadamente, Android se enva con preinstalado SQLite, incluyendo un entorno interactivo
para emitir comandos SQL desde una sesin adb shell conectado a una instancia de emulador de Android
AVD correr. Esto es tanto una manera til de aprender sobre SQLite y SQL, as como una valiosa herramienta
para la identificacin de problemas con las bases de datos creadas por las aplicaciones que se ejecutan en
un emulador.
Para iniciar una sesin interactiva SQLite, comience ejecutando una sesin de AVD. Esto puede lograrse
desde dentro Android Estudio lanzando el Android Device Manager Virtual (Herramientas -> Android ->
Administrador de AVD), la seleccin de una AVD configurado previamente y haciendo clic en Inicio.
Una vez que la AVD est en funcionamiento, abra una ventana de terminal o Comando Prompt y conectar con
el emulador utilizando la herramienta de lnea de comandos adb de la siguiente manera (tenga en cuenta que
la bandera -e dirige la herramienta para buscar un emulador con el que conectar, en lugar de un dispositivo
fsico):
shell -e adb
385
Una vez conectado, el entorno de shell proporcionar un smbolo del sistema en el que los comandos podrn
introducirse:
root @ android: / #
Los datos almacenados en bases de datos SQLite se almacenan realmente en los archivos de base de datos
en el sistema de archivos del dispositivo Android en el que se ejecuta la aplicacin. De forma predeterminada,
la ruta del sistema de archivos para estos archivos de base de datos es el siguiente:
/ Data / / <nombre del paquete> datos / bases de datos / <nombre del archivo de base de
datos> .db
Por ejemplo, si una aplicacin con el nombre del paquete com.example.MyDBApp crea una base de datos
llamada mydatabase.db, la ruta del archivo en el dispositivo sera el siguiente:
/data/data/com.example.MyDBApp/databases/mydatabase.db
A los efectos de este ejercicio, por lo tanto, cambie el directorio a / data / datos dentro del adb shell y crear
una jerarqua subdirectorio adecuado para un poco de experimentacin SQLite:
cd / datos / datos
mkdir com.example.dbexample
com.example.dbexample cd
bases de datos mkdir
bases de datos de cd
Con una ubicacin adecuada creado para el archivo de base de datos, inicie la herramienta de SQLite
interactivo de la siguiente manera:
root @ android: / datos / datos / bases de datos # sqlite3 ./mydatabase.db
sqlite3 ./mydatabase.db
SQLite versin 3.7.4
Enter ".help" para obtener instrucciones
Introduzca sentencias SQL terminados con un ";"
sqlite>
Al sqlite> y comandos se pueden introducir para realizar tareas tales como la creacin de tablas e insertar y
recuperar datos. Por ejemplo, para crear una nueva tabla en la base de datos con los campos para contener
la identificacin, nombre, direccin y nmero de telfono campos se requiere la siguiente declaracin:
crear contactos de mesa (autoincrement _id
direccin de texto, texto del telfono);
entero
clave
primaria, de
texto nombre,
Tenga en cuenta que cada fila de una tabla debe tener una clave principal que es nico para esa fila. En el
ejemplo anterior, hemos designado el campo ID como clave principal, declarado como de tipo entero y pidi
386
SQLite para incrementar el nmero automticamente cada vez que se agrega una fila. Esta es una manera
comn para asegurarse de que cada fila tiene una clave principal nica.En la mayora de las otras
plataformas, la eleccin del nombre para la clave principal es arbitraria. En el caso de Android, sin embargo,
es esencial que la clave ser nombrado _id para que la base de datos para ser totalmente accesible utilizando
todas las clases relacionadas base de datos Android. Los campos restantes son cada declarados como de
tipo texto.
Para una lista de las tablas en la base de datos seleccionada, utilice la sentencia .tables:
sqlite> .tables
contactos
Cuando se ejecuta una aplicacin Android en el entorno emulador, los archivos de bases de datos se pueden
crear en el sistema de archivos del emulador utilizando la convencin ruta discutido previamente. Esto tiene la
ventaja de que se puede conectar con adb, navegue hasta la ubicacin del archivo de base de datos, cargarlo
en la herramienta interactiva sqlite3 y realizar tareas en los datos para identificar posibles problemas que
ocurren en el cdigo de la aplicacin.
Tambin es importante sealar que, si bien es posible conectar con un adb shell a un dispositivo Android
fsica, la cscara no se concede privilegios suficientes por defecto para crear y gestionar bases de datos
SQLite. Depuracin de los problemas de base de datos es, por lo tanto, realiza mejor utilizando una sesin de
AVD.
387
Cursor
Una clase proporcionada especficamente para facilitar el acceso a los resultados de una consulta de base de
datos. Por ejemplo, una operacin de SQL SELECT se realiza en una base de datos potencialmente volver
mltiples filas coincidentes de la base de datos. Un ejemplo Cursor se puede utilizar para pasar a travs de
estos resultados, que pueden entonces accederse desde dentro del cdigo de la aplicacin utilizando una
variedad de mtodos. Algunos mtodos clave de esta clase son como sigue:
mover () - Se mueve por un desplazamiento especificado desde la posicin actual del conjunto de
resultados.
SQLiteDatabase
Esta clase proporciona la interfaz principal entre el cdigo de la aplicacin y bases de datos SQLite
subyacentes incluyendo la capacidad de crear, eliminar y realizar operaciones basadas en SQL en bases de
datos. Algunos mtodos clave de esta clase son como sigue:
query () - Realiza una consulta de base de datos especificada y devuelve resultados que emparejan a
travs de un objeto Cursor.
execSQL () - Ejecuta una nica sentencia SQL que no devuelve datos de resultados.
388
rawQuery () - Ejecuta una sentencia de consulta SQL y devuelve resultados coincidentes en la forma de
un objeto Cursor.
SQLiteOpenHelper
Una clase de ayuda diseado para que sea ms fcil para crear y actualizar bases de datos. Esta clase debe
tener subclases dentro del cdigo de la aplicacin que solicite el acceso de base de datos y los siguientes
mtodos de devolucin de llamada implementados dentro de esa subclase:
onCreate () - Se llama cuando se crea la base de datos por primera vez. Este mtodo se pasa como
argumento el objeto SQLiteDatabase de la base de datos recin creada. Este es el lugar ideal para
inicializar la base de datos en cuanto a la creacin de una tabla e insertar las filas de datos iniciales.
ONUPGRADE () - Llamado en el caso de que el cdigo de la aplicacin contiene una versin de base de
datos de referencia nmero ms reciente. Esto se utiliza normalmente cuando una aplicacin se actualiza
en el dispositivo y requiere que el esquema de base de datos tambin se actualizar para manejar el
almacenamiento de datos adicionales.
Adems de los mtodos de devolucin de llamada obligatorios anteriormente, el mtodo onOpen (), llamada
cuando se abre la base de datos, tambin puede implementarse dentro de la subclase.
El constructor de la subclase tambin debe ser implementado para llamar a la super clase, pasando por el
contexto de aplicacin, el nombre de la base de datos y la versin de la base de datos.
Mtodos notables de la clase SQLiteOpenHelper incluyen:
getWritableDatabase () - Abre o crea una base de datos para la lectura y la escritura. Devuelve una
referencia a la base de datos en la forma de un objeto SQLiteDatabase.
getReadableDatabase () - Crea o abre una base de datos para la lectura solamente. Devuelve una
referencia a la base de datos en la forma de un objeto SQLiteDatabase.
ContentValues
ContentValues es una clase de conveniencia que permite a los pares clave / valor para declararse que
consiste en la tabla de identificadores de columna y los valores que se almacena en cada columna. Esta clase
es de uso particular al insertar o actualizar las entradas en una tabla de base de datos.
Resumen
SQLite es un sistema ligero, incrustado relacional de gestin de base de datos que se incluye como parte del
marco de Android y proporciona un mecanismo para la aplicacin de almacenamiento de datos persistente
organizada para aplicaciones de Android. Adems de la base de datos SQLite, el marco de Android tambin
incluye una serie de clases de Java que se pueden utilizar para crear y gestionar bases de datos y tablas
basadas SQLite.
389
El objetivo de este captulo ha sido proporcionar una visin general de las bases de datos en general y SQLite
en particular en el contexto del desarrollo de aplicaciones para Android. Los prximos captulos trabajarn a
travs de la creacin de una aplicacin de ejemplo la intencin de poner en prctica esta teora en la forma de
un tutorial paso a paso. Desde la interfaz de usuario para la aplicacin de ejemplo requerir un diseo basado
en las formas, el primer captulo, titulado Un TableLayout y TableRow Tutorial Android Estudio , ser
desviarse ligeramente del tema central mediante la introduccin de los conceptos bsicos de las vistas
TableLayout y TableRow.
390
Contenido
7 Resumen
391
Figura 41-1
Desde el aspecto visual de la disposicin, es difcil identificar la estructura TableLayout utilizado para disear
la interfaz. El rbol jerrquico ilustrado en la Figura 41-2, sin embargo, hace que la estructura un poco ms
fcil de entender:
Figura 41-2
Claramente, el diseo consiste en una vista LinearLayout padre con TableLayout y LinearLayout nios. El
392
TableLayout contiene tres hijos TableRow representan tres filas de la tabla. Los filastabla contienen dos
puntos de vista del nio, con cada nio representa el contenido de una celda de la columna. El punto de vista
del nio LinearLayout contiene tres hijos Button.
El diseo se muestra en la Figura 41-2 es la disposicin exacta que se requiere para el ejemplo de base de
datos que se completar en el prximo captulo. El resto de este captulo, por lo tanto, se puede utilizar para
trabajar paso a paso en el diseo de esta interfaz de usuario con la funcin Android Studio Designer.
</ LinearLayout>
Cambiar al modo de diseo y, en referencia a la seccin Layouts de la Paleta, arrastre y suelte una vista
TableLayout manera que se coloca en la parte superior del rea de lienzo LinearLayout como se ilustra en la
Figura 41-3:
393
Figura 41-3
Una vez que estos pasos iniciales estn completos, el rbol de componentes para el diseo debe parecerse a
la que se muestra en la Figura 41-4:
Figura 41-4
Figura 41-5
Desde dentro de la seccin Widgets de la paleta, arrastre y suelte dos grandes objetos de texto TextView en
la entrada TableRow superior en el rbol de componentes (Figura 41-6):
394
Figura 41-6
Haga doble clic en el ms TextView izquierda dentro del diseo de la pantalla y, en el panel de configuracin
de propiedades rpida, cambie la propiedad de texto a "Identificacin del producto".Repita este paso para el
derecho ms TextView, cambiando esta vez el texto a "No asignado" y especificando un valor id de @ + /
Identificacin del productID. Extrae el texto de cada TextView a nuevos recursos de cadena utilizando la
bombilla icono aparece cuando se selecciona la vista.
Arrastre y suelte otra vista de texto grande y un texto Editar vista Slo texto de la seccin de campos de texto
de la paleta en la segunda entrada TableRow en el rbol de componentes. Cambie el texto en el TextView a
Nombre del producto y el ID del objeto EditarTexto a @ + / Identificacin del productName.
Arrastre y suelte otra vista Texto sin formato y un Nmero (Decimal) Campo de texto en el tercer
TableRow. Cambie el texto en el TextView al Producto Cantidad y el ID del objeto de campo de texto para @
+ / Identificacin del productQuantity. Antes de continuar, asegrese de extraer todas las propiedades de
texto aadido en los pasos anteriores a recursos de cadena.
395
Figura 41-7
Figura 41-8
396
Figura 41-9
Con mrgenes establecidos en los cuatro lados de los tres filastabla, la interfaz de usuario debera aparecer
como se ilustra en la Figura 41-1. En aras de la exhaustividad, y para fines de comparacin en el caso de que
su diseo no coincide con el de la figura 41-1, la estructura activity_database.xml completa para este diseo
se describe a continuacin.
<LinearLayout
android: orientacin = "vertical"
android: layout_width = "fill_parent"
android: layout_height = "fill_parent"
xmlns: android = "http://schemas.android.com/apk/res/android">
<TableLayout
android: layout_width = "match_parent"
android: layout_height = "wrap_content"
android: layout_gravity = "center_horizontal">
<TableRow
android: layout_width = "fill_parent"
android: layout_height = "fill_parent"
android: layout_margin = "10DP">
<TextView
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: textAppearance = "android:? attr / textAppearanceLarge"
397
layout_width = "wrap_content"
layout_height = "wrap_content"
InputType = "numberDecimal"
ems = "10"
id = "@ + / Identificacin del productQuantity" />
<LinearLayout
android: orientacin = "horizontal"
android: layout_width = "wrap_content"
android: layout_height = "fill_parent"
android: layout_gravity = "center_horizontal"
398
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / add_string"
id = "/ botn @ + id" />
<Botn
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / find_string"
id = "@ + / Identificacin del button2" />
<Botn
android:
android:
android:
android:
</ LinearLayout>
</ LinearLayout>
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / delete_string"
id = "@ + / Identificacin del button3" />
Resumen
La vista contenedor Android TableLayout proporciona una manera de organizar visin componentes en una
configuracin de filas y columnas. Mientras que la vista TableLayout proporciona el contenedor general, cada
fila, y las clulas contenidas en el mismo, se implementan a travs de las instancias de la vista TableRow. En
este captulo, una interfaz de usuario ha sido diseado en Android Studio usando los contenedores
TableLayout y TableRow. El siguiente captulo se sumar la funcionalidad detrs de esta interfaz de usuario
para implementar las capacidades de base de datos SQLite.
399
400
Contenido
5 Prueba de la aplicacin
6 Resumen
los
nombres
de
columna
de
"ProductID",
"productname"
"productquantity"
respectivamente. La columna ProductID actuar como clave principal y ser asignado e incrementado
automticamente por el sistema de gestin de base de datos.
El esquema de base de datos para la tabla de productos se describe en la Tabla 42-1:
Columna
Tipo De Datos
401
ID del Producto
Texto
Tabla 42-1
402
this._productname = productname;
this._quantity = cantidad;
}
public void SETID (int id) {
this._id = Identificacin;
}
public int getID () {
volver this._id;
}
public void setProductName (String productname) {
this._productname = productname;
}
public String getProductName () {
volver this._productname;
}
public void setQuantity (int cantidad) {
this._quantity = cantidad;
}
public int getQuantity () {
volver this._quantity;
}
}
La clase completado contiene miembros de datos privados para el almacenamiento interno de las columnas
de datos de las entradas de base de datos y un conjunto de mtodos para obtener y establecer los valores.
403
Despus de haber pre-poblado ahora el archivo de origen con onCreate () y ONUPGRADE () mtodos
plantilla la prxima tarea es agregar un mtodo constructor. Modifique el cdigo para declarar constantes para
el nombre de base de datos, nombre de la tabla, las columnas de la tabla y la versin de base de datos y
aadir el mtodo constructor de la siguiente manera:
com.ebookfrenzy.database paquete;
android.database.sqlite.SQLiteDatabase importacin;
android.database.sqlite.SQLiteOpenHelper importacin;
android.content.Context importacin;
android.content.ContentValues de importacin;
android.database.Cursor importacin;
public class MyDBHandler extiende SQLiteOpenHelper {
private static int DATABASE_VERSION final = 1;
esttica DATABASE_NAME final String privada = "productDB.db";
estticas TABLE_PRODUCTS Cuerda final privado = "productos";
public static final de cadena column_id = "_id";
public static final String COLUMN_PRODUCTNAME = "productname";
public static final String COLUMN_QUANTITY = "cantidad";
MyDBHandler (contexto Contexto pblica, String nombre,
Fbrica SQLiteDatabase.CursorFactory, int versin) {
super (contexto, DATABASE_NAME, fbrica, DATABASE_VERSION);
}
@ Override
public void onCreate (db SQLiteDatabase) {
}
@ Override
public void ONUPGRADE (SQLiteDatabase db, int OldVersion,
int newVersion) {
}
404
A continuacin, el mtodo onCreate () debe aplicarse de manera que se crea la tabla productos cuando la
base de datos se inicializa primero. Esto implica la construccin de una sentencia CREATE SQL que contiene
las instrucciones para crear una nueva tabla con las columnas correspondientes y luego pasa que a travs del
mtodo execSQL () del objeto SQLiteDatabase pasado como argumento para onCreate ():
@ Override
public void onCreate (db SQLiteDatabase) {
Cadena CREATE_PRODUCTS_TABLE = "CREATE TABLE" +
TABLE_PRODUCTS + "("
+ Column_id + "INTEGER PRIMARY KEY," + COLUMN_PRODUCTNAME
+ "TEXTO" + COLUMN_QUANTITY + "INTEGER" + ")";
db.execSQL (CREATE_PRODUCTS_TABLE);
}
El mtodo ONUPGRADE () se llama cuando el controlador se invoca con un mayor nmero de versin de
base de datos de la utilizada anteriormente. Los pasos exactos que se deben realizar en este caso ser de
aplicacin especfica, por lo que para los efectos de este ejemplo, simplemente se retire la antigua base de
datos y crear una nueva:
@ Override
public void ONUPGRADE (SQLiteDatabase db, int OldVersion,
int newVersion) {
db.execSQL ("DROP TABLE IF EXISTS" + TABLE_PRODUCTS);
onCreate (db);
}
Todo lo que ahora queda implementado en la clase de manejador MyDBHandler.java son los mtodos para
aadir, de consulta y eliminar entradas de la tabla de base de datos.
405
406
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / add_string"
id = "@ + / Identificacin del botn"
onClick = "NEWPRODUCT" />
<Botn
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / find_string"
id = "@ + / Identificacin del button2"
onClick = "lookupProduct" />
<Botn
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / delete_string"
id = "@ + / Identificacin del button3"
onClick = "removeProduct" />
Cargue el archivo de origen DatabaseActivity.java en el editor e implementar el cdigo para identificar los
puntos de vista de la interfaz de usuario y para aplicar los tres mtodos objetivo "onClick":
407
com.ebookfrenzy.database paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.view.View importacin;
android.widget.EditText importacin;
android.widget.TextView importacin;
public class DatabaseActivity extiende ActionBarActivity {
TextView IDView;
EditarTexto ProductBox;
EditarTexto quantityBox;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_database);
IDView = (TextView) findViewById (R.id.productID);
ProductBox = (EditarTexto) findViewById (R.id.productName);
quantityBox =
(EditarTexto) findViewById (R.id.productQuantity);
}
public void NEWPRODUCT (Ver vista) {
MyDBHandler dbHandler = new MyDBHandler (esto, null, null, 1);
int cantidad =
Integer.parseInt (. QuantityBox.getText toString () ());
Producto =
nuevo producto (productBox.getText toString () (), la cantidad.);
dbHandler.addProduct (producto);
productBox.setText ("");
quantityBox.setText ("");
}
public void lookupProduct (Ver vista) {
MyDBHandler dbHandler = new MyDBHandler (esto, null, null, 1);
Producto =
dbHandler.findProduct (. productBox.getText toString () ());
si (producto! = null) {
idView.setText (String.valueOf (product.getID ()));
quantityBox.setText (String.valueOf (product.getQuantity ()));
} Else {
idView.setText ("No Match Found");
}
}
408
Prueba de la aplicacin
Con los cambios de codificacin completados, compilar y ejecutar la aplicacin, ya sea en una sesin de AVD
o en un dispositivo Android fsica. Una vez que la aplicacin se est ejecutando, escriba el nombre del
producto y el valor de la cantidad en el formulario de interfaz de usuario y pulse el botn Agregar. Una vez
que se ha aadido el registro los cuadros de texto se borrar. Repita estos pasos para agregar un segundo
producto a la base de datos. A continuacin, introduzca el nombre de uno de los productos que acaba de
agregar en el campo de nombre del producto y tocar el botn Buscar. El formulario debe actualizar con el ID
de producto y cantidad para el producto seleccionado. Toque el botn Eliminar para eliminar el registro
seleccionado. Una bsqueda posterior por nombre de producto debe indicar que el registro ya no existe.
Resumen
El propsito de este captulo ha sido trabajar paso a paso a travs de una aplicacin prctica de
almacenamiento de base de datos SQLite basada en las aplicaciones de Android. Como ejercicio para
desarrollar su habilidad nueva base de datos establece adems, considerar extender el ejemplo para incluir la
posibilidad de actualizar los registros existentes en la tabla de base de datos.
409
Contenido
1 Qu es un Proveedor de Contenido?
2 El Proveedor de Contenidos
o
2.1 onCreate ()
2.2 query ()
2.3 insert ()
2.4 update ()
2.5 delete ()
2.6 getType ()
3 El URI contenido
6 Resumen
Qu es un Proveedor de Contenido?
Un proveedor de contenido proporciona acceso a los datos estructurados entre diferentes aplicaciones de
Android. Estos datos se expone a las aplicaciones ya sea como tablas de datos (en mucho la misma manera
que una base de datos SQLite) o como un identificador para un archivo. Esto implica esencialmente la
aplicacin de una disposicin cliente / servidor con lo que la aplicacin solicite el acceso a los datos es el
cliente y el proveedor de contenido es el servidor, realizar acciones y devolver los resultados en nombre del
cliente.
410
Una implementacin exitosa proveedor de contenido consiste en una serie de diferentes elementos, cada uno
de los cuales se tratarn en detalle en el resto de este captulo.
El proveedor de contenidos
Un proveedor de contenido se crea como una subclase de la clase android.content.ContentProvider. Por lo
general, la aplicacin responsable de la gestin de los datos para ser compartida implementar un proveedor
de contenidos para facilitar el intercambio de esos datos con otras aplicaciones.
La creacin de un proveedor de contenido consiste en la implementacin de un conjunto de mtodos para
gestionar los datos en nombre de otras aplicaciones, los clientes. Estos mtodos son los siguientes:
onCreate ()
Este mtodo se llama cuando se crea primero el proveedor de contenido y debe ser utilizado para realizar las
tareas de inicializacin requeridos por el proveedor de contenido.
consulta ()
Este mtodo se llama cuando un cliente solicita que los datos se obtienen del proveedor de contenido. Es la
responsabilidad de este mtodo para identificar los datos que se recuperan (ya sean individuales o mltiples
filas), realice la extraccin de datos y devolver los resultados envueltas en un objeto Cursor.
insert ()
Este mtodo se llama cuando una nueva fila necesita ser insertado en la base de datos del proveedor. Este
mtodo debe identificar el destino de los datos, realizar la insercin y devolver la URI completa de la fila que
acaba de agregar.
update ()
El mtodo se llama cuando las filas existentes deben actualizarse en nombre del cliente. El mtodo utiliza los
argumentos que se pasan a travs de actualizar las filas de la tabla apropiados y devolver el nmero de filas
actualizadas como resultado de la operacin.
delete ()
Se llama cuando las filas se van a eliminar de una tabla. Este mtodo elimina las filas designadas y devuelve
un recuento del nmero de registros borrados.
getType ()
Devuelve el tipo MIME de los datos almacenados por el proveedor de contenido.
Es importante en la aplicacin de estos mtodos en un proveedor de contenidos a tener en cuenta que, con la
excepcin del mtodo onCreate (), que se pueden llamar desde muchos procesos simultneamente y deben,
por lo tanto, ser seguro para subprocesos.
Una vez que un proveedor de contenido se ha implementado, la cuestin que se plantea es cmo se identifica
el proveedor en el sistema Android. Aqu es donde el contenido URI entra en juego.
411
El URI contenido
Un dispositivo Android potencialmente contener un nmero de proveedores de contenido. El sistema debe,
por lo tanto, proporcionar alguna forma de identificar un proveedor de otro. Del mismo modo, un nico
proveedor de contenido puede proporcionar acceso a mltiples formas de contenido (por lo general en forma
de tablas de bases de datos). Las aplicaciones de cliente, por lo tanto, necesitan una forma de especificar los
datos subyacentes para las que se requiere el acceso. Esto se logra mediante el uso de URIs de contenido.
El URI contenido se utiliza esencialmente para identificar los datos especficos dentro de un proveedor de
contenido especfico. La seccin de Autoridad de la URI identifica el proveedor de contenidos y por lo general
toma la forma del nombre del paquete del proveedor de contenido. Por ejemplo:
com.example.mydbapp.myprovider
Una tabla de base de datos especfica dentro de la estructura de datos de proveedor puede ser referenciado
aadiendo el nombre de la tabla a la autoridad. Por ejemplo, el siguiente URI hace referencia a una tabla
denominada productos dentro del proveedor de contenido:
com.example.mydbapp.myprovider / productos
Del mismo modo, una fila especfica dentro de la tabla especificada puede ser referenciado por anexar el ID
de fila a la URI. La siguiente URI, por ejemplo, hace referencia a la fila de la tabla productos en los que el
valor almacenado en la columna _ID es igual a 3:
com.example.mydbapp.myprovider / productos / 3
412
objetos de proveedores de contenido a continuacin, se comunican para realizar la tarea solicitada en nombre
de la aplicacin.
android:
autoridad - La
autoridad
URI
completa
del
proveedor
de
contenido. Por
ejemplo
com.example.mydbapp.mydbapp.myprovider.
Del mismo modo, el <proveedor> elemento puede utilizarse para definir los permisos que deben ser retenidos
por las aplicaciones cliente con el fin de calificar para el acceso a los datos subyacentes.Si se declaran sin
permisos, el comportamiento predeterminado es el permiso que se le permitiera a todas las aplicaciones. Los
permisos se pueden configurar para cubrir la totalidad del proveedor de contenido, o limitados a tablas y
registros especficos.
Resumen
Los datos pertenecen a una aplicacin suele ser privado a la aplicacin e inaccesible para otras
aplicaciones. En situaciones en que los datos deben ser compartidos, es necesario establecer un proveedor
de contenido. Este captulo ha cubierto los elementos bsicos que se combinan para permitir el intercambio
de datos entre aplicaciones y esboz los conceptos del proveedor de contenido, contenido de URI y el
contenido de resolucin.
En el prximo captulo, la aplicacin de ejemplo de base de datos para Android Estudio creado previamente
se ampliar para que los datos subyacentes de productos disponibles a travs de un proveedor de contenido.
413
Contenido
13 Resumen
414
Dentro de la pantalla de bienvenida Android Studio, seleccione la opcin Abrir proyecto Android Estudio
existente de la lista de inicio rpido y vaya a, y seleccione el proyecto de base de datos original para que se
carga en la ventana principal.
El nuevo paquete de ahora debe aparecer dentro de la ventana de herramientas del proyecto, como se ilustra
en la Figura 44-1:
Figura 44-1
415
com.ebookfrenzy.database.provider.MyContentProvider
Asegrese de que la nueva clase de proveedor de contenidos es a la vez exporta y habilitado antes de hacer
clic en Finalizar para crear la nueva clase.
Una vez que la nueva clase se ha creado, el archivo MyContentProvider.java debe aparecer debajo del
paquete de proveedor en la ventana de herramientas del proyecto y automticamente se carga en el editor en
el que debera aparecer como se indica en el siguiente listado:
com.ebookfrenzy.database.provider paquete;
android.content.ContentProvider importacin;
android.content.ContentValues de importacin;
android.database.Cursor importacin;
android.net.Uri importacin;
public class MyContentProvider extiende ContentProvider {
MyContentProvider pblico () {
}
@ Override
int borrado pblicos (uri uri, seleccin de cadena, String []) {selectionArgs
// Implementar este para manejar las peticiones para eliminar una o ms filas.
throw new UnsupportedOperationException ("Todava no implementado");
}
@ Override
public String getType (Uri uri) {
// TODO: Implementar este para manejar las solicitudes para el tipo MIME de los
datos
// Al URI dado.
throw new UnsupportedOperationException ("Todava no implementado");
}
@ Override
Uri pblica inserte (uri uri, valores ContentValues) {
// TODO: Implementar este para manejar las solicitudes de insertar una nueva
fila.
throw new UnsupportedOperationException ("Todava no implementado");
}
@ Override
public boolean onCreate () {
// TODO: Implementar este inicializar el proveedor de contenido en el arranque.
return false;
}
@ Override
Cursor consulta pblica (Uri uri, String [] de proyeccin, la seleccin de cuerdas,
String [] selectionArgs, Cadena sortOrder) {
// TODO: Implementar este para manejar las solicitudes de consulta de los
clientes.
throw new UnsupportedOperationException ("Todava no implementado");
416
}
@ Override
public int actualizacin (Uri uri, valores ContentValues, seleccin de cadena,
String [] selectionArgs) {
// TODO: Implementar este para manejar las peticiones para actualizar una o ms
filas.
throw new UnsupportedOperationException ("Todava no implementado");
}
}
Como se desprende de una revisin rpida del cdigo en este archivo, Android estudio ya ha poblado la clase
con los talones para cada uno de los mtodos que se requiere una subclase de ContentProvider de
implementar. Pronto ser necesario comenzar a aplicar estos mtodos, pero primero algunas constantes
relacionados con autoridad el contenido del proveedor y URI que ser declarado.
la
propia
clase
proveedor
de
contenido,
en
este
caso
417
Las declaraciones anteriores comienzan creando un nuevo objeto String llamado PODER y la asignacin de
la cadena de autoridad para ello. Del mismo modo, un segundo objeto String llamado PRODUCTS_TABLE se
crea y se inicializa con el nombre de nuestra tabla de base de datos (productos).
Por ltimo, estos dos elementos de cadena se combinan, el prefijo contenido: // y se convierte en un objeto
Uri utilizando el mtodo parse () de la clase Uri. El resultado se asigna a una variable denominada
CONTENT_URI.
Con las variables de tipo Uri declaradas, ahora es el momento de aadir cdigo para crear una instancia
UriMatcher y configurarlo para devolver las variables apropiadas:
public class MyContentProvider extiende ContentProvider {
418
La instancia UriMatcher (llamado sURIMatcher) est ahora preparado para devolver el valor de los productos
cuando se acaba la tabla productos se hace referencia en un URI y products_id cuando el URI incluye el
identificador de una fila especfica en la tabla.
419
Pas como argumentos para el mtodo son un URI que especifica el destino de la insercin y un
ContentValues objeto que contiene los datos a insertar.
Este mtodo ahora necesita ser modificado para realizar las siguientes tareas:
Obtener una referencia a una instancia modificable de la base de datos SQLite subyacente.
Realizar una operacin de insercin SQL para insertar los datos en la tabla de base de datos.
Llevar estos requisitos juntos los resultados en un mtodo de insercin modificado (), que dice lo siguiente:
@ Override
Uri pblica inserte (uri uri, valores ContentValues) {
int uriType = sURIMatcher.match (uri);
SQLiteDatabase SQLdb = myDB.getWritableDatabase ();
larga id = 0;
switch (uriType) {
420
PRODUCTOS casos:
id = sqlDB.insert (MyDBHandler.TABLE_PRODUCTS,
nula, valores);
descanso;
por defecto:
throw new IllegalArgumentException ("Desconocido URI:"
+ Uri);
}
getContext () getContentResolver () NotifyChange (uri, null)..;
volver Uri.parse (PRODUCTS_TABLE + "/" + id);
}
URI - El URI especificando la fuente de datos en los que la consulta se va a realizar. Esto puede tomar la
forma de una consulta general con mltiples resultados, o una consulta concreta para la identificacin de
una fila de tabla nica.
Proyeccin - Una fila dentro de una tabla de base de datos puede comprender mltiples columnas de
datos. En el caso de esta aplicacin, por ejemplo, estos corresponden a la ID, el nombre del producto y la
cantidad del producto. El argumento de proyeccin es simplemente una matriz String que contiene el
nombre de cada una de las columnas que ha de ser devuelto en el conjunto de datos del resultado.
Seleccin - El ", donde" elemento de la seleccin se realiza como parte de la consulta. Este argumento
controla qu filas se seleccionan de la base de datos especificada. Por ejemplo, si se requiere la consulta
para seleccionar slo los productos denominados "La comida del gato", entonces la cadena de seleccin
pasa al mtodo query () leera productname = "La comida del gato".
Args Seleccin - Cualquier argumentos adicionales que necesitan ser pasado a la operacin de consulta
SQL para realizar la seleccin.
Cuando se llama, se requiere el mtodo query () para realizar las siguientes operaciones:
Construir una consulta SQL sobre la base de los criterios que se pasan al mtodo. Por conveniencia, la
clase SQLiteQueryBuilder se puede utilizar en la construccin de la consulta.
Con estos requisitos en mente, el cdigo para el mtodo query () en el archivo MyContentProvider.java ahora
debe leer como se indica en el siguiente listado:
421
@ Override
Cursor consulta pblica (Uri uri, String [] de proyeccin, la seleccin de cuerdas,
String [] selectionArgs, Cadena sortOrder) {
SQLiteQueryBuilder QueryBuilder = new SQLiteQueryBuilder ();
queryBuilder.setTables (MyDBHandler.TABLE_PRODUCTS);
int uriType = sURIMatcher.match (uri);
switch (uriType) {
caso products_id:
queryBuilder.appendWhere (MyDBHandler.COLUMN_ID + "="
+ Uri.getLastPathSegment ());
descanso;
PRODUCTOS casos:
descanso;
por defecto:
throw new IllegalArgumentException ("Desconocido URI");
}
Cursor cursor = queryBuilder.query (myDB.getReadableDatabase (),
proyeccin, seleccin, selectionArgs, null, null,
sortOrder);
cursor.setNotificationUri (getContext (). getContentResolver (),
uri);
volver cursor;
}
Obtener una referencia a una instancia modificable de la base de datos SQLite subyacente.
Devolucin de un recuento del nmero de filas que se han cambiado como resultado de la operacin de
actualizacin.
Una actualizacin de propsito general () mtodo, y la que vamos a utilizar para este proyecto, sera el
siguiente:
422
@ Override
public int actualizacin (Uri uri, valores ContentValues, seleccin de cadena,
String [] selectionArgs) {
int uriType = sURIMatcher.match (uri);
SQLiteDatabase SQLdb = myDB.getWritableDatabase ();
int rowsUpdated = 0;
switch (uriType) {
PRODUCTOS casos:
rowsUpdated =
sqlDB.update (MyDBHandler.TABLE_PRODUCTS,
valores,
seleccin,
selectionArgs);
descanso;
caso products_id:
String id = uri.getLastPathSegment ();
si (TextUtils.isEmpty (seleccin)) {
rowsUpdated =
sqlDB.update (MyDBHandler.TABLE_PRODUCTS,
valores,
MyDBHandler.COLUMN_ID + "=" + Identificacin,
nulo);
} Else {
rowsUpdated =
sqlDB.update (MyDBHandler.TABLE_PRODUCTS,
valores,
MyDBHandler.COLUMN_ID + "=" + Identificacin
+ "Y"
+ Seleccin,
selectionArgs);
}
descanso;
por defecto:
throw new IllegalArgumentException ("Desconocido URI:" +
uri);
}
getContext (). getContentResolver (). NotifyChange (uri,
nulo);
volver rowsUpdated;
}
423
Obtener una referencia a una instancia modificable de la base de datos SQLite subyacente.
Realice la operacin de eliminacin apropiada en la base de datos en funcin de los criterios de seleccin
y el tipo de Uri.
Un mtodo tpico delete () es, en muchos sentidos, muy similar al mtodo update () y puede ser aplicado de la
siguiente manera:
@ Override
int borrado pblicos (uri uri, seleccin de cadena, String []) {selectionArgs
int uriType = sURIMatcher.match (uri);
SQLiteDatabase SQLdb = myDB.getWritableDatabase ();
int rowsDeleted = 0;
switch (uriType) {
PRODUCTOS casos:
rowsDeleted = sqlDB.delete (MyDBHandler.TABLE_PRODUCTS,
seleccin,
selectionArgs);
descanso;
caso products_id:
String id = uri.getLastPathSegment ();
si (TextUtils.isEmpty (seleccin)) {
rowsDeleted = sqlDB.delete (MyDBHandler.TABLE_PRODUCTS,
MyDBHandler.COLUMN_ID + "=" + Identificacin,
nulo);
} Else {
rowsDeleted = sqlDB.delete (MyDBHandler.TABLE_PRODUCTS,
MyDBHandler.COLUMN_ID + "=" + Identificacin
+ "Y" + seleccin,
selectionArgs);
}
descanso;
por defecto:
throw new IllegalArgumentException ("Desconocido URI:" + uri);
}
getContext () getContentResolver () NotifyChange (uri, null)..;
volver rowsDeleted;
}
Con estos mtodos implementados, la clase proveedor de contenido, en cuanto a los requisitos para este
ejemplo, al menos, se ha completado. El siguiente paso es asegurarse de que el proveedor de contenidos se
declara en el archivo de manifiesto del proyecto para que sea visible para cualquier resolucin de con tenido
que buscan acceso a la misma.
424
Todo lo que queda antes de probar la aplicacin es modificar la clase de manejador de base de datos para
utilizar el proveedor de contenido en lugar de acceder directamente a la base de datos.
425
aplicado, el controlador de base de datos necesita ser modificado de modo que todas las operaciones de
base de datos se realizaron con el proveedor de contenido a travs de un dispositivo de resolucin de
contenido.
El primer paso es modificar la clase MyDBHandler.java de modo que obtiene una referencia a una instancia
de ContentResolver. Esto se puede lograr en el mtodo constructor de la clase:
com.ebookfrenzy.database paquete;
com.ebookfrenzy.database.provider.MyContentProvider importacin;
android.database.sqlite.SQLiteDatabase importacin;
android.database.sqlite.SQLiteOpenHelper importacin;
android.content.Context importacin;
android.content.ContentValues de importacin;
android.database.Cursor importacin;
android.content.ContentResolver importacin;
public class MyDBHandler extiende SQLiteOpenHelper {
privada myCR ContentResolver;
private static int DATABASE_VERSION final = 1;
esttica DATABASE_NAME final String privada = "productDB.db";
estticas TABLE_PRODUCTS cadena final pblicas = "productos";
public static final de cadena column_id = "_id";
public static final String COLUMN_PRODUCTNAME = "productname";
public static final String COLUMN_QUANTITY = "cantidad";
MyDBHandler (contexto Contexto pblica, String nombre,
Fbrica SQLiteDatabase.CursorFactory, int versin) {
super (contexto, DATABASE_NAME, fbrica, DATABASE_VERSION);
myCR = context.getContentResolver ();
}
.
.
.
}
A continuacin, los mtodos de la addProduct (), findProduct () y removeProduct () necesitan ser re-escrita
para utilizar el sistema de resolucin contenido y proveedor de contenido para fines de gestin de datos:
public void addProduct (producto) {
Valores ContentValues = new ContentValues ();
values.put (COLUMN_PRODUCTNAME, product.getProductName ());
values.put (COLUMN_QUANTITY, product.getQuantity ());
myCR.insert (MyContentProvider.CONTENT_URI, valores);
}
findProduct pblica Producto (String productname) {
String [] = {proyeccin column_id,
426
COLUMN_PRODUCTNAME, COLUMN_QUANTITY};
Seleccin String = "productname = \" "+ productname +" \ "";
Cursor cursor = myCR.query (MyContentProvider.CONTENT_URI,
proyeccin, seleccin, nula,
nulo);
Producto = nuevo producto ();
si (cursor.moveToFirst ()) {
cursor.moveToFirst ();
product.setID (Integer.parseInt (cursor.getString (0)));
product.setProductName (cursor.getString (1));
product.setQuantity (Integer.parseInt (cursor.getString (2)));
cursor.close ();
} Else {
producto = null;
}
producto de regresar;
}
deleteProduct public boolean (String productname) {
resultado booleano = false;
Seleccin String = "productname = \" "+ productname +" \ "";
int rowsDeleted = myCR.delete (MyContentProvider.CONTENT_URI,
seleccin, null);
si (rowsDeleted> 0)
resultado = true;
resultado regresar;
}
Con la clase de controlador de base de datos actualizado para utilizar una resolucin de contenido y el
proveedor de contenido, la aplicacin ya est listo para ser probado. Compila y ejecuta la aplicacin y realizar
algunas operaciones para agregar, encontrar y eliminar entradas de productos. En cuanto a la operacin y
funcionalidad, la aplicacin debe comportarse exactamente como lo hizo cuando se accede directamente a la
base de datos, excepto que ahora est utilizando el proveedor de contenidos. Con el proveedor de contenido
ahora implementado y declarada en el archivo de manifiesto, otras aplicaciones potencialmente pueden
acceder a esos datos (ya que fueron declaradas no hay permisos de acceso completa por defecto es en
efecto). La nica informacin que las otras aplicaciones necesitan saber para poder acceder es el contenido
URI y los nombres de las columnas en la tabla productos.
427
Resumen
El objetivo de este captulo ha sido la de proporcionar una visin ms detallada de los pasos exactos
involucrados en la implementacin de un proveedor de contenido de Android con un nfasis particular en la
estructura y la ejecucin de la consulta, insertar, eliminar y mtodos de la clase proveedor de contenido de
actualizacin. Uso prctico de la clase de contenido de resolucin para acceder a datos en el proveedor de
contenido tambin estaba cubierto, y el proyecto de base de datos creada en el tutorial SQLite modificado
para utilizar tanto un proveedor de contenidos y la resolucin de contenido.
428
Contenido
7 Eliminacin de un archivo
9 Resumen
429
proveedores de documentos seleccionados.Figura 45-1, por ejemplo, muestra la interfaz de usuario selector
en la accin que muestra una coleccin de archivos alojados por un proveedor de servicio de documento:
Figura 45-1
En cuanto a los proveedores de documentos, stos pueden variar desde los servicios basados en la nube
para proveedores de documentos locales que se ejecutan en el mismo dispositivo que la aplicacin
cliente. En el momento de la escritura, los proveedores de documentos ms destacados compatibles con el
Marco para un acceso de almacenamiento son la caja y, como era de esperar, Google Drive. Es muy
probable que otros proveedores de almacenamiento en la nube y los desarrolladores de aplicaciones que
pronto tambin proporcionar servicios que cumplan con el almacenamiento de Acceso Marco Android. Figura
45-2, por ejemplo, ilustra algunas opciones de proveedores de documentos listados por la interfaz de selector:
430
Figura 45-2
431
Los intentos de almacenamiento de acceso Framework se pueden resumir de la siguiente manera:
Cuando se ejecuta, el cdigo anterior har que la interfaz de usuario selector que se mostrar, que permite al
usuario buscar y seleccionar los archivos alojados por proveedores de documentos disponibles. Una vez que
el archivo ha sido seleccionada por el usuario, se proporcionar una referencia a ese archivo a la aplicacin
en la forma de un objeto Uri. La aplicacin puede abrir el archivo usando el mtodo openFileDescriptor (Uri,
String). Existe un cierto riesgo, sin embargo, que no todos los archivos que aparecen por un proveedor de
documento se puede abrir de esta manera. La exclusin de tales archivos dentro del selector se puede lograr
mediante la modificacin de la intencin utilizando la opcin CATEGORY_OPENABLE. Por ejemplo:
private static int OPEN_REQUEST_CODE final = 41;
Intencin Intencin = new Intent (Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory (Intent.CATEGORY_OPENABLE);
startActivityForResult (intencin, OPEN_REQUEST_CODE);
Cuando se muestra ahora el selector, los archivos que no se pueden abrir utilizando el mtodo
openFileDescriptor () sern listados pero no seleccionable por el usuario.
Otro enfoque til para el filtrado permite que los archivos disponibles para la seleccin a ser restringidos por
tipo de archivo. Esto implica especificar los tipos de los archivos de la aplicacin es capaz de manejar. Una
aplicacin de edicin de imgenes podra, por ejemplo, slo quiere proporcionar al usuario la opcin de
seleccionar los archivos de imagen de los proveedores de documentos. Esto se logra mediante la
configuracin del objeto intencin con los tipos MIME de los archivos que se van a ser seleccionable por el
usuario. El siguiente cdigo, por ejemplo, especifica que slo los archivos de imagen son adecuados para la
seleccin en el selector:
432
Esto podra ser refinado an ms para limitar la seleccin de las imgenes JPEG:
intent.setType ("image / jpeg");
Alternativamente, una aplicacin de reproductor de audio solamente podra ser capaz de manejar archivos de
audio:
intent.setType ("audio / *");
La aplicacin de audio puede limitarse an ms slo en el apoyo a la reproduccin de archivos de audio MP4
en base:
intent.setType ("audio / mp4");
Una amplia gama de ajustes de tipo MIME estn disponibles para su uso cuando se trabaja con el Marco para
un acceso de almacenamiento, ms comn de lo que se puede encontrar en la lista en lnea en:
http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types
433
}
}
}
El mtodo anterior comprueba que la intencin fue exitosa, comprueba que el cdigo de solicitud coincide con
una solicitud de apertura de archivos y luego extrae el Uri partir de los datos de intencin. El URI puede
entonces ser utilizado para leer el contenido del archivo.
Tenga en cuenta que el descriptor de archivo se abre en modo "r". Esto indica que el archivo se ha de abrir
para la lectura. Otras opciones son "w" para acceso de escritura y "rwt" para lectura y escritura en el
contenido existente en el archivo se trunca por el nuevo contenido.
Leer el contenido de un archivo de texto requiere ligeramente ms trabajo y el uso de un objeto InputStream. .
El siguiente cdigo, por ejemplo, lee las lneas de un archivo de texto: InputStream f lujoEntrada =
getContentResolver () openInputStream (uri);
BufferedReader lector = new BufferedReader (nueva InputStreamReader (
flujoEntrada));
Readline String;
while ((readline = reader.readLine ())! = null) {
// Hacer algo con cada lnea en el archivo
}
inputStream.close ();
434
En primer lugar, el descriptor de archivo se extrae de la Uri, esta vez solicitando permiso de escritura en el
archivo de destino. El descriptor de archivo se utiliza posteriormente para obtener una referencia a la corriente
de salida del archivo. El contenido (en este ejemplo un poco de texto) se escribe en el flujo de salida antes de
que el descriptor de archivo y flujo de salida estn cerrados.
Eliminacin de un archivo
Si un archivo se puede eliminar de almacenamiento depende de si o no el proveedor de documentos del
archivo apoya la eliminacin del archivo. Suponiendo que se permite la eliminacin, se puede llevar a cabo en
un Uri designado como sigue:
si (DocumentsContract.deleteDocument (getContentResolver (), uri))
// Supresin fue exitosa
ms
// Supresin fracas
435
para el Uri. El siguiente cdigo, por ejemplo, persiste leer y permisos para el archivo referenciado por la
instancia fileURI Uri escribir:
ltima int takeFlags = intent.getFlags ()
Y (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
. getContentResolver () takePersistableUriPermission (fileURI, takeFlags);
Una vez que los permisos para el archivo se han tomado por la aplicacin, y suponiendo que el Uri se ha
salvado por la aplicacin, el usuario debe ser capaz de continuar accediendo al archivo despus de un
reinicio del dispositivo sin que el usuario tenga que volver a seleccionar el archivo desde la interfaz selector .
Si, en cualquier momento, los permisos persistentes ya no son necesarios, pueden ser liberados a travs de
una llamada al mtodo releasePersistableUriPermission () de la resolucin de contenido:
ltima int releaseFlags = intent.getFlags ()
Y (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
. getContentResolver () releasePersistableUriPermission (fileURI, releaseFlags);
Resumen
Es interesante considerar cmo las percepciones de almacenamiento han cambiado en los ltimos aos. Una
vez sinnimo de unidades de disco duro internas de alta capacidad, el trmino "almacenamiento" ahora es
igual de probable que se refieren a espacio de almacenamiento alojado remotamente en la nube y se accede
a travs de una conexin a Internet. Esto es cada vez ms el caso de la adopcin generalizada de recursos
limitados, "siempre conectado" los dispositivos mviles con una mnima capacidad de almacenamiento
interno.
El almacenamiento de Acceso Marco Android proporciona un mecanismo sencillo para los usuarios y los
desarrolladores de aplicaciones para ganar sin problemas de acceso a los archivos almacenados en la
nube. Mediante el uso de un conjunto de intenciones introducidos en Android 4.4 y una interfaz integrada de
usuario para seleccionar proveedores de documentos y archivos, almacenamiento basado en la nube
completa ahora se puede integrar en las aplicaciones de Android con una cantidad mnima de codificacin.
Ahora que los conceptos de almacenamiento en la nube han sido cubiertos, el captulo siguiente ( Un Marco
para un acceso Ejemplo Android Estudio Almacenamiento ) trabajar a travs de la creacin de un proyecto
de ejemplo de aplicacin Android Studio.
436
Contenido
6 El onActivityResult (Mtodo)
10 Resumen
437
Vuelva al modo Diseo y arrastrar y soltar tres objetos Button en el lienzo de diseo. Coloque el punto de
vista del botn y cambiar las propiedades de texto a "Nuevo", "Abrir" y "Guardar" para que el diseo de la
interfaz de usuario coincide con la muestra en la Figura 47-1:
Figura 47-1
438
Cambie de nuevo a modo de texto y modificar directamente el diseo para agregar controladores onClick a
los botones y una vista EditarTexto multilnea con desplazamiento vertical permitido:
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
herramientas: context = ". StorageDemoActivity">
<Botn
android:
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / nueva_cadena"
id = "@ + / Identificacin del botn"
layout_alignParentTop = "true"
layout_alignParentStart = "true"
onClick = "newFile" />
<Botn
android:
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / open_string"
id = "@ + / Identificacin del button2"
layout_alignBottom = "@ + / Identificacin del botn"
layout_toRightOf = "@ + / Identificacin del botn"
onClick = "abrirArchivo" />
<Botn
android:
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / save_string"
id = "@ + / Identificacin del button3"
layout_alignParentTop = "true"
layout_toRightOf = "@ + / Identificacin del button2"
onClick = "saveFile" />
<EditarTexto
android:
android:
android:
android:
android:
android:
android:
</ RelativeLayout>
439
trabajo de la intencin es completa, la aplicacin ser notificado por una llamada a un mtodo llamado
onActivityResult ().
Dado que todos los intentos de una sola actividad se traducir en una llamada al mtodo mismo
onActivityResult (), se requiere un mecanismo para identificar las que la intencin desencaden la
llamada. Esto se puede lograr mediante el paso a travs de un cdigo de solicitud a la intencin cuando sea
lanzado. A continuacin, se pasa este cdigo en el mtodo onActivityResult () por las intenciones que
permitan el mtodo para identificar qu accin ha sido solicitada por el usuario. Antes de implementar los
manejadores onClick para crear, guardar y abrir archivos, el primer paso es declarar algunos cdigos de
peticin de estas tres acciones.
Localice y cargue el archivo StorageDemoActivity.java en el editor y declarar valores constantes para las tres
acciones a realizar por la aplicacin. Tambin aadir algo de cdigo para obtener una referencia al objeto
EditarTexto multilnea que se hace referencia en los mtodos posteriores:
com.ebookfrenzy.storagedemo paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.EditText importacin;
public class StorageDemoActivity extiende Actividad {
privada esttica TextView EditarTexto;
private static int CREATE_REQUEST_CODE final = 40;
private static int OPEN_REQUEST_CODE final = 41;
private static int SAVE_REQUEST_CODE final = 42;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_storage_demo);
TextView = (EditarTexto) findViewById (R.id.fileText);
}
.
.
.
}
440
com.ebookfrenzy.storagedemo paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.EditText importacin;
android.content.Intent importacin;
android.view.View importacin;
public class StorageDemoActivity extiende Actividad {
privada esttica TextView EditarTexto;
private static int CREATE_REQUEST_CODE final = 40;
private static int OPEN_REQUEST_CODE final = 41;
private static int SAVE_REQUEST_CODE final = 42;
.
.
.
public void newFile (Ver vista)
{
Intencin Intencin = new Intent (Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory (Intent.CATEGORY_OPENABLE);
intent.setType ("text / plain");
intent.putExtra (Intent.EXTRA_TITLE "newfile.txt");
startActivityForResult (intencin, CREATE_REQUEST_CODE);
}
.
.
}
Este cdigo crea un nuevo objeto ACTION_CREATE_INTENT Intencin. Esta intencin se configura de
manera que slo los archivos que se pueden abrir con un descriptor de archivo se devuelven (a travs de la
configuracin de la categora Intent.CATEGORY_OPENABLE).
A continuacin, el cdigo especifica que el archivo se abra es tener se proporciona un tipo MIME de texto sin
formato y un nombre de archivo de marcador de posicin (que se puede cambiar por el usuario en la interfaz
de selector). Finalmente, se inicia la intencin, que pasa a travs de la CREATE_REQUEST_CODE
declarado previamente.
Cuando se ejecuta este mtodo y la intencin se ha completado la tarea asignada, se har un llamado a
onActivityResult de la aplicacin () mtodo y aprob, entre otros argumentos, el URI del documento recin
creado y el cdigo de solicitud que se utiliz cuando la intencin empez. Ahora es una oportunidad ideal
para comenzar a poner en prctica este mtodo.
441
El onActivityResult (Mtodo)
El mtodo onActivityResult () ser compartido por todas las intenciones que sern llamados durante el ciclo
de vida de la aplicacin. En cada caso el mtodo se aprob un cdigo de solicitud, un cdigo de resultado y
un conjunto de datos resultante que contiene el URI del archivo de almacenamiento. Necesitar el mtodo a
implementar tal que comprueba el xito o no de la accin intencin, identifica el tipo de accin realizada y
extrae el archivo Uri partir de los datos de resultados. En este punto en el tutorial, el mtodo slo tiene que
manejar la creacin de un nuevo archivo en el proveedor de documento seleccionado, por lo que modificar el
archivo StorageDemoActivity.java aadir este mtodo como sigue:
public void onActivityResult (int requestCode, int resultCode,
ResultData Intencin) {
si (resultCode == Activity.RESULT_OK)
{
si (requestCode == CREATE_REQUEST_CODE)
{
si (resultData! = null) {
textView.setText ("");
}
}
}
}
El cdigo en este mtodo es en gran medida sencilla. El resultado de la actividad se comprueba y, si tiene
xito, el cdigo de solicitud se compara con el valor CREATE_REQUEST_CODE para verificar que el usuario
est creando un nuevo archivo. Siendo ese el caso, la vista de edicin de texto se borra de cualquier texto
anterior para significar la creacin de un nuevo archivo.
Compilar y ejecutar la aplicacin y seleccione el botn Nuevo. El Marco para un acceso de almacenamiento
debe mostrar posteriormente el "Guardar en" interfaz de usuario selector de almacenamiento como se ilustra
en la Figura 47-2.
442
Figura 47-2
Desde este men seleccione la opcin Drive seguido de Mi Drive y vaya a un lugar adecuado en el
443
almacenamiento de Google Drive en la que desea guardar el archivo. En el campo de texto en la parte inferior
de la interfaz de selector de cambiar el nombre de "newfile.txt" a un nombre adecuado (pero manteniendo la
extensin .txt) antes de seleccionar la opcin Guardar.
Una vez que el nuevo archivo ha sido creado, la aplicacin debe volver a la actividad principal y una
notificacin aparecer en el panel de notificaciones que dice "1 archivo subido":
Figura 47-3
En este punto, debera ser posible iniciar sesin en tu cuenta de Google Drive en una ventana del navegador
y busque el archivo que acaba de crear en la ubicacin solicitada (en el caso de que el archivo no existe,
asegrese de que el dispositivo Android en el que se ejecuta la aplicacin tiene una conexin activa a
Internet). El acceso a Google Drive en el dispositivo tambin puede ser verificada mediante la ejecucin de la
aplicacin Google Drive, que se instala por defecto en muchos dispositivos y disponible para su descarga
desde el Android Google Play Store.
444
Desde el SAVE_REQUEST_CODE se pas a travs de la intencin, el mtodo onActivityResult () ahora debe
extenderse para manejar salvar acciones:
com.ebookfrenzy.storagedemo paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.EditText importacin;
android.content.Intent importacin;
android.view.View importacin;
android.net.Uri importacin;
public class StorageDemoActivity extiende Actividad {
.
.
public void onActivityResult (int requestCode, int resultCode,
ResultData Intencin) {
Uri currentUri = null;
si (resultCode == Activity.RESULT_OK)
{
si (requestCode == CREATE_REQUEST_CODE)
{
si (resultData! = null) {
textView.setText ("");
}
} Else if (requestCode == SAVE_REQUEST_CODE) {
si (resultData! = null) {
currentUri = resultData.getData ();
writeFileContent (currentUri);
}
}
}
}
.
.
}
El mtodo ahora comprueba el cdigo de peticin de salvar, extrae el Uri del archivo seleccionado por el
usuario en el selector de almacenamiento y llama a un mtodo llamado writeFileContent (), pasando por el
URI del archivo en el que el texto se va a escribir. Permanecer en el archivo StorageDemoActivity.java,
implementar este mtodo ahora para que se lea de la siguiente manera:
com.ebookfrenzy.storagedemo paquete;
java.io.FileNotFoundException importacin;
java.io.FileOutputStream importacin;
java.io.IOException importacin;
445
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.EditText importacin;
android.content.Intent importacin;
android.view.View importacin;
android.net.Uri importacin;
android.os.ParcelFileDescriptor importacin;
public class StorageDemoActivity extiende Actividad {
.
.
void writeFileContent privada (Uri uri)
{
tratar {
ParcelFileDescriptor dfp =
this.getContentResolver ().
openFileDescriptor (uri, "w");
FileOutputStream FileOutputStream =
nueva FileOutputStream (pfd.getFileDescriptor ());
Cadena textContent =
textView.getText toString () ().;
fileOutputStream.write (textContent.getBytes ());
fileOutputStream.close ();
pfd.close ();
} Catch (FileNotFoundException e) {
e.printStackTrace ();
} Catch (IOException e) {
e.printStackTrace ();
}
}
.
.
}
El mtodo comienza por la obtencin y abrir el descriptor de archivo desde el URI del archivo seleccionado
por el usuario. Dado que el cdigo tendr que escribir en el fichero, el descriptor se abre en modo de escritura
("w"). El descriptor de archivo se utiliza como base para la creacin de un flujo de salida que permita la
aplicacin para escribir en el archivo.
El texto introducido por el usuario se extrae del objeto de edicin de texto y se escribe en el flujo de salida
antes de que ambos el descriptor de archivo y flujo estn cerrados. Tambin se aade Cdigo para manejar
las excepciones IO encontradas durante el proceso de escritura de archivos.
Con el nuevo mtodo aadi, compilar y ejecutar la aplicacin, introduzca algn texto en el rea de texto y
seleccione el botn Guardar. Desde la interfaz de selector, busque el archivo creado previamente desde el
almacenamiento de Google Drive para guardar el texto para ese archivo. Vuelve a tu cuenta de Google Drive
446
en una ventana del navegador y seleccione el archivo de texto para mostrar el contenido. El archivo debe
contener ahora el texto introducido dentro de la aplicacin StorageDemo en el dispositivo Android.
En este cdigo, la intencin est configurado para filtrar la seleccin de los archivos que se pueden abrir por
la aplicacin. Cuando se inicia la actividad se pasa el cdigo de solicitud de apertura constante que ahora
tendr que ser tratada en el mtodo onActivityResult ():
public void onActivityResult (int requestCode, int resultCode,
ResultData Intencin) {
Uri currentUri = null;
si (resultCode == Activity.RESULT_OK)
{
si (requestCode == CREATE_REQUEST_CODE)
{
si (resultData! = null) {
textView.setText ("");
}
} Else if (requestCode == SAVE_REQUEST_CODE) {
si (resultData! = null) {
currentUri = resultData.getData ();
writeFileContent (currentUri);
}
} Else if (requestCode == OPEN_REQUEST_CODE) {
si (resultData! = null) {
currentUri = resultData.getData ();
tratar {
Contenido String =
readFileContent (currentUri);
textView.setText (contenido);
} Catch (IOException e) {
// Error Mango aqu
}
}
447
}
}
}
El nuevo cdigo aadido arriba para manejar la peticin abierta obtiene el URI del archivo seleccionado por el
usuario desde la interfaz de usuario picker y se lo pasa a travs de un mtodo llamado readFileContent (),
que se espera que regrese el contenido del archivo seleccionado en forma de un objeto String. La cadena
resultante se asigna a la propiedad text de la vista de edicin de texto.Claramente, la siguiente tarea es poner
en prctica el mtodo readFileContent ():
com.ebookfrenzy.storagedemo paquete;
java.io.FileNotFoundException importacin;
java.io.FileOutputStream importacin;
java.io.IOException importacin;
java.io.BufferedReader importacin;
java.io.InputStream importacin;
java.io.InputStreamReader importacin;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.EditText importacin;
android.content.Intent importacin;
android.view.View importacin;
android.net.Uri importacin;
android.os.ParcelFileDescriptor importacin;
public class StorageDemoActivity extiende Actividad {.
.
.
readFileContent private String (Uri uri) throws IOException {
InputStream flujoEntrada =
. getContentResolver () openInputStream (uri);
BufferedReader lector =
nuevo BufferedReader (nueva InputStreamReader (
flujoEntrada));
StringBuilder StringBuilder = new StringBuilder ();
Currentline String;
while ((currentline = reader.readLine ())! = null) {
stringBuilder.append (currentline + "\ n");
}
inputStream.close ();
volver stringBuilder.toString ();
}
.
.
}
448
Este mtodo comienza extrayendo el descriptor de archivo para el archivo de texto seleccionado y abrirlo por
la lectura. El flujo de entrada asociado con el Uri se abre entonces y se utiliza como la fuente de entrada para
una instancia de BufferedReader. Cada lnea en el archivo se lee y se almacena en un objeto StringBuilder
entonces. Una vez que todas las lneas han sido ledos, el flujo de entrada y el descriptor de archivo son a la
vez cerrado y el contenido del archivo se devuelve como un objeto String.
Resumen
En este captulo se ha trabajado a travs de la creacin de un ejemplo de aplicacin Android Estudio en forma
de un editor de texto muy rudimentario diseado para utilizar el almacenamiento basado en la nube para
crear, guardar y abrir archivos con Almacenamiento de Acceso Marco Android.
449
Contenido
10 Resumen
H.263
H.264 AVC
MPEG-4 SP
VP8
La clase VideoView tiene una amplia gama de mtodos que pueden ser llamados con el fin de gestionar la
reproduccin de video. Algunos de los mtodos ms comnmente utilizados son los siguientes:
450
setVideoPath (String path) - Especifica la ruta (como una cadena) de los medios de comunicacin de
vdeo que desea reproducir. Esto puede ser o bien la URL de un archivo de vdeo a distancia o un archivo
de vdeo local en el dispositivo.
setVideoUri (Uri uri) - Realiza la misma tarea que el mtodo setVideoPath (), pero toma un objeto Uri
como argumento en lugar de una cadena.
getDuration () - Devuelve la duracin del video. Se suelen devolver -1 menos que se llama desde dentro
del mtodo de devolucin de llamada OnPreparedListener ().
setAnchorView (Ver vista) - Designa el fin de que el controlador debe ser anclado. Esto controla la
ubicacin de los controles de la pantalla.
espectculo (int timeout) - Los controles se muestran para la duracin sealado (en milisegundos).
451
isShowing () - Devuelve un valor booleano que indica si los controles son actualmente visibles para el
usuario.
Cambie de nuevo a modo de diseo y, desde la seccin de Contenedores de la paleta del panel, arrastre y
suelte una instancia VideoView en el punto central de la disposicin para que la interfaz de usuario similar a la
de la Figura 47-1:
452
Figura 47-1
Haga doble clic en la instancia VideoView en el diseo de la pantalla del dispositivo y cambiar el ID del
componente a videoView1. Por ltimo, ya sea editar el XML o utilizar los botones de la barra de herramientas
Diseador de cambiar el layout_width y propiedades layout_height para la instancia VideoView a
match_parent.
453
com.ebookfrenzy.videoplayer paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.VideoView importacin;
public class VideoPlayerActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_video_player);
ltima VideoView VideoView =
(VideoView) findViewById (R.id.videoView1);
videoView.setVideoPath (
"Http://www.ebookfrenzy.com/android_book/movie.mp4");
videoView.start ();
}
.
.
.
}
Todo lo que este cdigo hace es obtener una referencia a la instancia VideoView en el diseo, establecer la
ruta de vdeo en ella para que apunte a un archivo MPEG-4 alojado en un sitio web y luego iniciar la
reproduccin de vdeo.
454
</ Manifiesto>
Pruebe la aplicacin ejecutando en un dispositivo Android fsica. Despus inicia la aplicacin puede haber un
pequeo retraso mientras que el contenido de vdeo se almacena temporalmente antes de la reproduccin
comienza (Figura 47-2).
Figura 47-2
Esto proporciona una indicacin de lo fcil que puede ser integrar la reproduccin de vdeo en una aplicacin
Android. Todo lo que va de este ejemplo se ha logrado mediante una instancia VideoView y tres lneas de
cdigo.
455
Cuando la aplicacin se inicia con estos cambios implementados, aparecern los controles de los medios de
comunicacin sobre la reproduccin de vdeo durante unos segundos en el inicio de la reproduccin. Estos
controles deben incluir una barra de bsqueda, control de volumen y un botn de reproduccin /
pausa. Despus de que los controles se alejan de la vista, pueden ser restaurados con un toque en el lienzo
VideoView. Con slo tres ms lneas de cdigo, nuestra aplicacin de reproduccin de vdeo ahora tiene
controles de medios, como se muestra en la Figura 47-3:
456
Figura 47-3
457
}
});
videoView.start ();
}
.
.
.
}
Ahora justo antes de que comience la reproduccin de vdeo, aparecer un mensaje en el panel de Android
Estudio LogCat que lee a lo largo de las lneas de:
05-30 13: 13: 33,955 30044-30044 / com.ebookfrenzy.videoplayer.videoplayer
com.example.videoplayer.videoplayer: Duracin = 6874
Resumen
Dispositivos Android Tablet basado excelentes plataformas para la entrega de contenido a los usuarios, sobre
todo en forma de medios de comunicacin de vdeo. Como se ha sealado en este captulo, el SDK de
Android proporciona dos clases, a saber VideoView y MediaController, que se combinan para hacer que la
integracin de la reproduccin de vdeo en las aplicaciones Android rpidas y fciles, a menudo involucran
slo unas pocas lneas de cdigo Java.
458
Contenido
6 Comprobacin de la cmara
9 Prueba de la aplicacin
10 Resumen
para
comprobar
la
presencia
de
la
caracterstica
459
La presencia de una cmara de espaldas a la pantalla del dispositivo puede ser verificada de manera similar
utilizando la constante PackageManager.FEATURE_CAMERA. Una prueba para si un dispositivo tiene
cualquier cmara puede realizarse haciendo referencia a PackageManager.FEATURE_CAMERA_ANY.
Cuando se invoca de esta manera, la intencin colocar el vdeo grabado en un archivo usando una ubicacin
predeterminada y el nombre de archivo. Una ubicacin especfica para el archivo de los medios de
comunicacin se puede especificar utilizando el mtodo putExtra () de la intencin, haciendo referencia a la
constante fundamental MediaStore.EXTRA_OUTPUT que pasar por la meta valor URI. El siguiente cdigo,
por ejemplo, especifica que el video debe ser almacenado en la tarjeta SD en un archivo llamado
myvideo.mp4:
Archivo MediaFile =
nuevo archivo (Environment.getExternalStorageDirectory (). getAbsolutePath ()
+ "/myvideo.mp4");
Intencin Intencin = new Intent (MediaStore.ACTION_VIDEO_CAPTURE);
Uri videoUri = Uri.fromFile (MediaFile);
intent.putExtra (MediaStore.EXTRA_OUTPUT, videoUri);
startActivityForResult (intencin, VIDEO_CAPTURE);
Cuando el usuario, ya sea completa o cancela la sesin de grabacin de vdeo, se llama al mtodo
onActivityResult () de la actividad de llamadas. Este mtodo tiene que comprobar que el cdigo de solicitud
pasa a travs de un argumento coincide con el especificado cuando se lanz la intencin, verificar que la
sesin de grabacin se ha realizado correctamente y se extrae la ruta del archivo de los medios de
460
comunicacin de vdeo. El mtodo onActivityResult correspondiente () para el cdigo de lanzamiento
intencin anterior podra, por lo tanto, se aplicar de la siguiente manera:
protegida onActivityResult void (int requestCode, int resultCode, datos Intencin) {
si (requestCode == VIDEO_CAPTURE) {
si (resultCode == RESULT_OK) {
Toast.makeText (this, "El video se guarda en: \ n" +
data.getData (), Toast.LENGTH_LONG) .Show ();
} Else if (resultCode == RESULT_CANCELED) {
Toast.makeText (this, "La grabacin de vdeo cancelada.",
Toast.LENGTH_LONG) .Show ();
} Else {
Toast.makeText (this, "No se ha podido grabar vdeo",
Toast.LENGTH_LONG) .Show ();
}
}
}
El ejemplo de cdigo anterior simplemente muestra un mensaje que indica la tostada el xito o fracaso de la
sesin de grabacin intencin. En el caso de una grabacin exitosa, se muestra la ruta de acceso al archivo
de vdeo almacenado.
Cuando se ejecuta, el intento de captura de vdeo (Figura 48-1) pondr en marcha y proporcionar al usuario la
oportunidad de grabar vdeo.
Figura 48-1
461
de
usar
la
cmara
incorporada. Este
intento
se
inicia
haciendo
referencia
MediaStore.ACTION_IMAGE_CAPTURE:
private static int IMAGE_CAPTURE final = 102;
Intencin Intencin = new Intent (MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult (intencin, IMAGE_CAPTURE);
Al igual que con la captura de vdeo, la intencin se puede pasar el nombre de ubicacin y archivo en el que
la imagen se va a guardar, o se deja de utilizar la ubicacin predeterminada y convencin de nomenclatura.
462
Figura 48-2
Por ltimo, haga doble clic en el botn y cambiar el ID de recordButton. El XML correspondiente en el archivo
activity_camera_app.xml debe parecerse a aproximadamente la siguiente lista:
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: paddingLeft = "@ dimen / activity_horizontal_margin"
android: paddingRight = "@ dimen / activity_horizontal_margin"
android: paddingTop = "@ dimen / activity_vertical_margin"
android: paddingBottom = "@ dimen / activity_vertical_margin"
herramientas: context = ". CameraAppActivity">
<Botn
android: layout_width = "wrap_content"
463
android:
android:
android:
android:
android:
android:
layout_height = "wrap_content"
text = "@ string / record_string"
id = "@ + / Identificacin del recordButton"
layout_centerVertical = "true"
layout_centerHorizontal = "true"
onClick = "startRecording" />
</ RelativeLayout>
Comprobacin de la cmara
Antes de intentar iniciar la intencin de captura de vdeo, la aplicacin primero tiene que verificar que el
dispositivo en el que se est ejecutando en realidad tiene una cmara. Para los fines de este ejemplo, vamos
a simplemente hacer uso del mtodo hasCamera previamente descrito (), esta vez la comprobacin de
cualquier tipo de cmara. En el caso de que una cmara no est presente, se desactivar el botn de
grabacin de vdeo.
Edite el archivo CameraAppActivity.java y modificarlo de la siguiente manera:
com.ebookfrenzy.cameraapp paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.content.pm.PackageManager importacin;
android.widget.Button importacin;
public class CameraAppActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_camera_app);
Botn recordButton =
(Button) findViewById (R.id.recordButton);
if (! hasCamera ())
recordButton.setEnabled (false);
}
hasCamera private boolean () {
si (getPackageManager (). hasSystemFeature (
PackageManager.FEATURE_CAMERA_ANY)) {
return true;
} Else {
return false;
}
}
464
.
.
.
}
465
466
Prueba de la aplicacin
Compila y ejecuta la aplicacin en un dispositivo Android fsica, toque el botn de grabacin y utilizar el
intento de captura de vdeo para grabar un video. Una vez completado, detener la grabacin de
vdeo. Reproduzca la grabacin seleccionando el botn de reproduccin en la pantalla. Por ltimo, toque el
botn Done (a veces representado por una marca de verificacin) en la pantalla para volver a la aplicacin
CameraApp. Al volver, debera aparecer un mensaje que indica que la tostada el video se ha almacenado en
una ubicacin especfica en el dispositivo (la ubicacin exacta variar de un tipo de dispositivo a otro).
Desde la pantalla de bienvenida Android de estudio, ubicar el proyecto VideoPlayer creado en el captulo
anterior, vaya al archivo VideoPlayerActivity.java y modificar el setVideoPath () llamada al mtodo para hacer
referencia a la ruta del archivo de vdeo que acaba de grabar.
Ejecucin de la aplicacin VideoPlayer modificado en el dispositivo Android debe resultar en el video
previamente grabado que se est reproduciendo.
Resumen
La mayora de los dispositivos de tableta y telfonos inteligentes Android incluyen una cmara que se puede
acceder por las aplicaciones. Aunque hay un nmero de diferentes enfoques para aadir soporte de la
cmara a las aplicaciones, los intentos de video y captura de imgenes de Android ofrecen una solucin
sencilla y fcil de capturar vdeo e imgenes.
467
Contenido
1 Reproduccin de audio
12 Prueba de la aplicacin
13 Resumen
Reproduccin de audio
En cuanto a la reproduccin de audio, la mayora de las implementaciones de apoyo Android AAC LC / LTP,
HE-AACv1 (AAC +), HE-AACv2 (mejorado AAC +), AMR-NB, AMR-WB, MP3, MIDI, Ogg Vorbis, y PCM /
WAVE formatos.
La reproduccin de audio se puede realizar utilizando el MediaPlayer o las clases Audiotrack. AudioTrack es
una opcin ms avanzada que utiliza la transmisin de buffers de audio y proporciona un mayor control sobre
el audio. La clase MediaPlayer, por otro lado, proporciona una interfaz de programacin ms fcil para la
aplicacin de reproduccin de audio y satisfacer las necesidades de la mayora de los requisitos de audio.
468
La clase MediaPlayer ha asociado a l una serie de mtodos que pueden ser llamados por una aplicacin
para realizar ciertas tareas. Un subconjunto de algunos de los mtodos principales de esta clase es el
siguiente:
create () - Llamado para crear una nueva instancia de la clase, pasando por el Uri del audio que desea
reproducir.
pausa () - Hace una pausa en la reproduccin. La reproduccin puede reanudarse a travs de una
llamada al mtodo resume ().
setVolume () - Toma dos argumentos de coma flotante que especifican el volumen de reproduccin
de los canales izquierdo y derecho.
liberacin () - Para ser llamada cuando ya no es necesaria la instancia del reproductor. Este mtodo
garantiza que todos los recursos en poder del jugador son liberados.
En una implementacin tpica, una aplicacin ser crear una instancia de la clase MediaPlayer, establezca la
fuente de audio a reproducir y luego llamar a preparar () seguido de inicio (). Por ejemplo:
MediaPlayer mediaPlayer = new MediaPlayer ();
mediaPlayer.setDataSource ("http://www.ebookfrenzy.com/myaudio.mp3");
mediaPlayer.prepare ();
mediaPlayer.start ();
setAudioSource () - Especifica la fuente del sonido que desea grabar (que normalmente ser
MediaRecorder.AudioSource.MIC para el micrfono del dispositivo).
setVideoSource
() Especifica
el
MediaRecorder.VideoSource.CAMERA).
setOutputFormat () - Especifica el formato en el que el audio o vdeo grabado es para ser almacenados
(por ejemplo MediaRecorder.OutputFormat.AAC_ADTS).
setAudioEncoder () - Especifica el codificador de audio para ser utilizado para el audio grabado (por
ejemplo MediaRecorder.AudioEncoder.AAC).
origen
del
video
grabar
(por
ejemplo
469
stop () - Detiene el proceso de grabacin. Una vez que una grabadora se ha detenido, que tendr que ser
completamente reconfigurado y preparados antes de ser reiniciado.
reset () - Restablece la grabadora. Tendr que ser completamente reconfigurado y preparados antes de
ser reiniciado la instancia.
liberacin () - Debera ser llamada cuando ya no es necesaria la instancia grabadora. Este mtodo
garantiza que todos los recursos en poder de la instancia se liberan.
Una aplicacin tpica usando esta clase fijar el archivo de origen, la produccin y la codificacin y el formato
de salida. A continuacin, se hicieron llamadas a los mtodos de preparar () y start (). El mtodo stop () luego
ser llamado cuando se graba es acabar seguido por el mtodo reset (). Cuando la aplicacin ya no necesita
la instancia grabadora de una llamada a la liberacin () mtodo se recomienda:
MediaRecorder MediaRecorder = new MediaRecorder ();
mediaRecorder.setAudioSource (MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat (MediaRecorder.OutputFormat.AAC_ADTS);
mediaRecorder.setAudioEncoder (MediaRecorder.AudioEncoder.AAC);
mediaRecorder.setOutputFile (audioFilePath);
mediaRecorder.prepare ();
mediaRecorder.start ();
.
.
.
mediaRecorder.stop ()
mediaRecorder.reset ()
mediaRecorder.release ()
manifiesto
de
la
aplicacin
debe
incluir
el
permiso
470
Una vez completado, esta aplicacin proporcionar una interfaz muy sencilla destinada a permitir al usuario
grabar y reproducir audio. Tendr que ser almacenada en un archivo de audio en el dispositivo El audio
grabado. Siendo ese el caso, este tutorial tambin explorar brevemente el mecanismo para el uso de
almacenamiento de la tarjeta SD.
471
Figura 49-1
Seleccione el botn de reproduccin y, en el panel Propiedades, configure la propiedad OnClick para llamar a
un mtodo llamado playaudio cuando est seleccionado por el usuario. Repita estos pasos para configurar los
botones restantes para llamar a mtodos denominados recordAudio y stopAudio respectivamente.
472
A los efectos de este ejemplo, vamos a crear un hasMicrophone llamado mtodo () que puede ser llamado
para comprobar la presencia de un micrfono. Dentro de la ventana de herramientas del proyecto, busque y
haga doble clic en el archivo AudioAppActivity.java y modificarlo para agregar este mtodo:
com.ebookfrenzy.audioapp paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.content.pm.PackageManager importacin;
public class AudioAppActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_audio_app);
}
hasMicrophone boolean protegida () {
PackageManager PManager = this.getPackageManager ();
volver pmanager.hasSystemFeature (
PackageManager.FEATURE_MICROPHONE);
}
.
.
}
473
El cdigo agregado comienza mediante la obtencin de referencias a los tres puntos de vista de los botones
en la interfaz de usuario. A continuacin, el mtodo hasMicrophone implementado previamente () es llamado
para determinar si el dispositivo incluye un micrfono. Si no es as, todos los botones estn desactivados, de
lo contrario slo el Stop and Jugar botones estn desactivados.
La siguiente lnea de cdigo necesita un poco ms de explicacin:
audioFilePath =
Environment.getExternalStorageDirectory (). GetAbsolutePath ()
+ "/myaudio.3gp";
474
Cuando se trabaja con una memoria externa, es importante tener en cuenta que dicha actividad por una
aplicacin requiere permiso para ser solicitada en el archivo de manifiesto de aplicacin. Por ejemplo:
<Usa-permiso android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
475
mediaRecorder.stop ();
mediaRecorder.release ();
MediaRecorder = null;
isRecording = false;
} Else {
mediaPlayer.release ();
mediaPlayer = null;
recordButton.setEnabled (true);
}
}
476
Prueba de la aplicacin
Compila y ejecuta la aplicacin en un dispositivo Android que contiene un micrfono y tocar el botn de
grabacin. Despus de la grabacin, pulse Detener seguido por el juego, momento en el que el audio grabado
se reproducir a travs de los altavoces del dispositivo.
Resumen
El SDK de Android proporciona una serie de mecanismos para la aplicacin de la grabacin y reproduccin
de audio. En este captulo se ha analizado dos de ellos en la forma de las clases MediaPlayer y
MediaRecorder. Despus de haber cubierto la teora del uso de estas tcnicas, en este captulo trabaj a
travs de la creacin de una aplicacin de ejemplo diseada para grabar y luego reproducir audio. En el curso
de trabajar con audio en Android, este captulo tambin examin los pasos necesarios para asegurar que el
dispositivo en el que se ejecuta la aplicacin cuenta con un micrfono antes de intentar grabar audio. El uso
de almacenamiento externo en la forma de una tarjeta SD tambin estaba cubierto.
477
4 Prueba de la aplicacin
13 Resumen
Este captulo tiene por objeto proporcionar una visin general del sistema de Google Maps y Google Maps
para Android API. El captulo ofrecer una visin general de los diferentes elementos que componen la API,
detalle los pasos necesarios para configurar un entorno de desarrollo para trabajar con Google Maps y luego
478
trabajar a travs de algunos ejemplos de cdigo que demuestran algunos de los conceptos bsicos de la
integracin de Google Maps para Android.
GoogleMap - La clase principal de la API de Google Maps para Android. Esta clase es responsable de la
descarga y visualizacin de mosaicos de mapas y para visualizar y responder a mapear los controles. El
objeto GoogleMap no se crea directamente por la aplicacin sino que se crea cuando se crean instancias
MapView o objeto MapFragment. Una referencia al objeto GoogleMap se puede obtener en cdigo de la
aplicacin a travs de una llamada al mtodo getMap () de un MapView, objeto MapFragment o instancia
SupportMapFragment.
MapView - Una subclase de la clase View, esta clase proporciona la lona vista sobre la que el mapa se
dibuja por el objeto GoogleMap, permitiendo un mapa para ser colocado en el diseo de la interfaz de
usuario de una actividad.
SupportFragmentMap - Una subclase de la clase Fragmento, esta clase permite que un mapa para ser
colocado dentro de un fragmento en una disposicin Android.
Marcador - El propsito de la clase Marker es permitir ubicaciones para ser marcados en un mapa. Los
marcadores se aaden a un mapa mediante la obtencin de una referencia al objeto GoogleMap asociado
con un mapa y luego hacer una llamada al mtodo de esa instancia de objeto addMarker (). La posicin
de un marcador se define por medio de longitud y latitud. Los marcadores se pueden configurar en un
nmero de maneras, incluyendo la especificacin de un ttulo, texto y un icono. Los marcadores tambin
pueden ser hechas para ser "arrastrarse", lo que permite al usuario mover el marcador a diferentes
posiciones en un mapa.
Formas - El dibujo de lneas y formas en un mapa se logra mediante el uso de las clases de polilnea,
polgono y Circle.
UiSettings - La clase UiSettings proporciona un nivel de control desde una aplicacin de controles de
interfaz de usuario que aparecen en el mapa. El uso de esta clase, por ejemplo, la aplicacin puede
controlar si o no el zoom, ubicacin y comps controles actuales aparecen en un mapa. Esta clase
tambin se puede utilizar para configurar qu toque gestos pantalla son reconocidos por el mapa.
Mi ubicacin Capa - Cuando est activada, la capa de Mi ubicacin muestra un botn en el mapa que,
cuando est seleccionado por el usuario, centra el mapa en la actual ubicacin geogrfica del usuario. Si
el usuario es estacionario, esta ubicacin est representado en el mapa por un marcador azul. Si el
usuario est en movimiento la ubicacin est representado por un galn que indica la direccin del usuario
de los viajes.
La mejor manera de familiarizarse con la API de Google Maps para Android es trabajar a travs de un
ejemplo. El resto de este captulo se va a crear una sencilla aplicacin Google Maps en base al tiempo que
destac las reas clave de la API.
479
Maps Actividad
llamado
MapDemoActivity con
una disposicin
correspondiente
llamado
activity_map_demo.
Figura 50-1
Cambie la configuracin del men Seleccionar un proyecto para crear un nuevo proyecto antes de hacer clic
en el botn Continuar. Despus de un breve retraso, el nuevo proyecto se crear y un panel aparecer
(Figura 50 2) proporcionar la opcin de crear una clave de Android para la aplicacin.
480
Figura 50-2
Compruebe que la huella digital y el paquete de solicitud de nombre de SHA-1 coincide con los que figuran en
el archivo google_maps_api.xml y haga clic en el botn Crear para generar la clave de API para su aplicacin.
El Google Developer Console actualizar y mostrar la pantalla de Verificacin de Poderes, incluyendo una
clave titulado seccin de aplicaciones de Android. Dentro de esta seccin de la pgina, resalte y copie el valor
CLAVE API como se muestra en la Figura 50-3:
481
Figura 50-3
Regresar a Android Studio y pegue la clave de API a la seccin YOUR_KEY_HERE del archivo:
<String name = "google_maps_key" templateMergeStrategy = "preservar"> YOUR_KEY_HERE </
string>
Prueba de la aplicacin
Realizar una prueba de funcionamiento de la aplicacin para comprobar que la clave de la API est
configurada correctamente. Suponiendo que la configuracin es correcta, la aplicacin se ejecutar y
mostrar un mapa en la pantalla.
En el caso de que un mapa no aparece, compruebe las siguientes reas:
Si se ejecuta la aplicacin en un emulador, asegrese de que el emulador est ejecutando una versin de
Android que incluye las API de Google. El sistema operativo actual se puede cambiar para una
configuracin AVD al seleccionar Herramientas -> Android -> opcin de men Administrador de AVD, al
hacer clic en el icono de lpiz en la columna Acciones de la AVD seguido por el botn Cambiar ... junto a
la versin de Android actual. Dentro del dilogo de imagen del sistema, seleccione un objetivo que incluye
las API de Google.
Compruebe la salida LogCat de las reas relacionadas con problemas de autenticacin con respecto a la
API de Google Maps. Esto generalmente significa que la clave de la API se ha introducido de forma
incorrecta o que el nombre del paquete de la aplicacin no coincide con la especificada cuando se gener
la clave de API.
Verifique en la Consola de API de Google que la API de Google Maps para Android se ha habilitado en el
panel Servicios.
482
imposible
hablar
de
mapas
ubicaciones
geogrficas
sin
cubrir
primero
el
tema
de
Tenga en cuenta que el valor de 1 se pasa a travs como segundo argumento al mtodo
getFromLocationName (). Esto simplemente le dice al Geocoder para devolver slo uno de los resultados de
la matriz. Teniendo en cuenta la naturaleza especfica de la direccin proporcionada, slo debe haber un
partido potencial. Para nombres de ubicacin ms vagas, sin embargo, puede ser necesario solicitar ms
partidos posibles y permitir al usuario elegir la correcta.
483
El cdigo anterior es un ejemplo de visin de geocodificacin en que las coordenadas se calculan sobre la
base de una descripcin de ubicacin de texto. Reverse-geocodificacin, como su nombre indica, consiste en
la
traduccin
de
las
coordenadas
geogrficas
en
una
cadena
de
direccin
legible
por
En este caso el objeto Geocoder se inicializa con los valores de latitud y longitud a travs del mtodo
getFromLocation (). Una vez ms, se solicita un nico resultado de la casacin. La informacin de direccin
basado en texto se extrae del objeto Direccin resultante.
Cabe sealar que la geocodificacin no es efectuado en el dispositivo Android, sino ms bien en un servidor
al que el dispositivo se conecta cuando se requiere una traduccin y los resultados devueltos posteriormente
cuando la traduccin es completa. Como tal, la geocodificacin slo puede tener lugar cuando el dispositivo
tiene una conexin activa a Internet.
484
485
El siguiente cambio de cdigo con el mtodo onCreate (), por ejemplo, cambia el mapa a modo de Terreno:
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_map_demo);
setUpMapIfNeeded ();
si (MMAP! = null) {
mMap.setMyLocationEnabled (true);
mMap.setMapType (GoogleMap.MAP_TYPE_TERRAIN);
}
}
Por otra parte, el tipo de mapa se puede especificar en el archivo de diseo XML en el que el mapa est
incrustado usando el mapa: propiedad mapType junto con un valor de nada, normal, hbrido, por satlite o el
terreno. Con el fin de poder utilizar esta directiva, sin embargo, primero es necesario aadir el espacio de
nombres mapa para el archivo de recursos XML en el que se utilizan las directivas:
xmlns: mapa = "http://schemas.android.com/apk/res-auto"
Por ejemplo:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns fragmento: android = "http://schemas.android.com/apk/res/android"
xmlns: mapa = "http://schemas.android.com/apk/res-auto"
android: id = "@ + / Identificacin del mapa"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
Mapa: mapType = "hbrido"
android: name = "com.google.android.gms.maps.SupportMapFragment" />
486
MapSettings UiSettings;
mapSettings = map.getUiSettings ();
Los
controles
de
zoom
estn
activados
desactivados
mediante
llamadas
al
mtodo
Alternativamente, el mapa: propiedad uiZoomControls puede establecerse dentro del elemento de mapa del
archivo de recursos XML:
mapa: uiZoomControls = "false"
La brjula se puede mostrar ya sea a travs de una llamada al mtodo setCompassEnabled () de la instancia
UiSettings, o por medio de recursos XML utilizando el mapa: propiedad uiCompass. El botn "Mi ubicacin"
slo aparecer cuando el modo Mi ubicacin est activada como se describe anteriormente en este
captulo. El botn se puede evitar que aparezcan, incluso cuando en este modo a travs de una llamada al
mtodo setMyLocationButtonEnabled () de la instancia UiSettings.
El mismo resultado se puede lograr dentro de un archivo de recursos XML estableciendo el mapa: propiedad
uiZoomGestures a verdadero o falso.
Cuando est activado, el zoom se producir cuando el usuario hace pellizcando gestos en la pantalla. Del
mismo modo, un doble toque ser un zoom mientras que un toque con dos dedos se alejar.Un dedo zoom
487
gestos, por otro lado, se realizan pulsando dos veces, pero no liberar el segundo toque y luego deslizar el
dedo hacia arriba y hacia abajo en la pantalla para acercar y alejar respectivamente.
Inclinado gestos tambin pueden ser activadas y desactivadas mediante el mapa: uiTiltGestures propiedad en
un archivo de recursos de diseo XML.
en
el
cdigo
travs
de
una
llamada
al
mtodo
de
la
instancia
UiSettings
Gestos de rotacin tambin se pueden activar o desactivar mediante el mapa: propiedad uiRotateGestures en
un archivo de recursos de diseo XML.
488
como un fragmento) y puede ser configurado de tal manera que puedan ser arrastradas a diferentes
ubicaciones en el mapa por el usuario. Cuando girada por el usuario una ventana de informacin aparecer
mostrar informacin adicional acerca de la ubicacin del marcador.
Los marcadores estn representados por las instancias de la clase Marker y se aaden a un mapa a travs
de una llamada al mtodo addMarker () del objeto GoogleMap correspondiente. Pasa a travs de un
argumento de este mtodo es una instancia de clase MarkerOptions que contiene las diversas opciones
necesarias para el marcador, como el texto del ttulo y fragmento. La ubicacin de un marcador se define
mediante la especificacin de los valores de latitud y longitud, tambin incluye como parte de la instancia
MarkerOptions. Por ejemplo, el cdigo siguiente aade un marcador que incluye un ttulo, fragmento y una
posicin en una ubicacin especfica en el mapa:
com.google.android.gms.maps.model.Marker importacin;
com.google.android.gms.maps.model.LatLng importacin;
com.google.android.gms.maps.model.MarkerOptions de importacin;
.
.
.
LatLng MUSEO = new LatLng (38.8874245, -77.0200729);
Marcador museo = mMap.addMarker (nuevos MarkerOptions ()
.position (MUSEO)
.title ("Museo")
.snippet ("National Air and Space Museum"));
Cuando se ejecuta, el cdigo de arriba marcar la ubicacin especificada que, cuando se golpe, se mostrar
una ventana de informacin que contiene el ttulo y el snippet como se muestra en la Figura 50-10:
489
Figura 50-10
Objetivo - La ubicacin del centro del mapa en la pantalla del dispositivo se especifica en trminos de
longitud y latitud.
Ampliar - El nivel de zoom de la cmara se especifica en los niveles. Aumentar el nivel de zoom 1.0
duplica el ancho de la cantidad del mapa visualizado.
Inclinacin - El ngulo de visin de la cmara especificada como una posicin en un arco que abarca
directamente sobre el centro del rea del mapa visible medida en grados desde la parte superior del arco
(siendo este el nadir del arco, donde los puntos de la cmara directamente a la el mapa).
Teniendo - La orientacin del mapa en grados medidos en sentido horario desde el norte.
Cambios de la cmara se realizan mediante la creacin de una instancia de la clase CameraUpdate con la
configuracin adecuada. Casos CameraUpdate se crean al hacer llamadas de mtodo a la clase
490
CameraUpdateFactory. Una vez que se ha creado una instancia de CameraUpdate, se aplica al mapa a
travs de una llamada al mtodo moveCamera () de la instancia GoogleMap. Para obtener un efecto de
animacin suave como los cambios de la cmara, el mtodo animateCamera () puede ser llamado en lugar de
moveCamera ().
Un resumen de los mtodos de CameraUpdateFactory es como sigue:
CameraUpdateFactory.newCameraPosition
(CameraPosition) -
Devuelve
una
instancia
El siguiente cdigo, en cambio, se mueve la cmara a una nueva ubicacin y ajusta el nivel de zoom a 10 sin
animacin:
privado static final LatLng MUSEO =
nueva LatLng (38.8874245, -77.0200729);
map.moveCamera (CameraUpdateFactory.newLatLngZoom (MUSEO, 10));
Por ltimo, el siguiente ejemplo de cdigo utiliza CameraPosition.Builder () para crear un objeto
CameraPosition con cambios en el destino, el zoom, teniendo e inclinacin. Este cambio se aplica luego a la
cmara mediante la animacin:
CameraPosition cameraPosition = new CameraPosition.Builder ()
.target (MUSEO)
detalle del mapa (10)
.bearing (70)
.tilt (25)
.build ();
491
Resumen
En este captulo se ha proporcionado una visin general de las clases principales y mtodos que componen la
API de Google Maps para Android y describen los pasos necesarios para preparar tanto el entorno de
desarrollo y un proyecto de aplicacin para hacer uso de la API.
492
8 Resumen
493
estn disponibles actualmente para impresoras HP, Epson y Canon y plugins de otra impresora manufacturas
lo ms probable es ser lanzado en un futuro prximo, aunque el plugin de Google Cloud Print servicio tambin
se puede utilizar para imprimir desde un dispositivo Android para casi cualquier impresora tipo y modelo. Para
los propsitos de este libro, vamos a utilizar el HP Print Servicios Plugin como un ejemplo de referencia.
Figura 51-1
494
Para comprobar si la impresora HP est respaldado por el Servicios de impresin Plugin HP, visite la
siguiente pgina Web de HP para obtener una lista de los modelos de impresoras compatibles:
http://h10025.www1.hp.com/ewfrf/wc/document?cc=us&lc=en&docname=c03722645#
El Servicios de impresin HP Plugin detectar automticamente las impresoras HP compatibles en la red a la
que est conectado el dispositivo Android y enumerarlos como opciones al imprimir desde una aplicacin.
495
Tanto el Guardar como opciones de Google Drive PDF y puede ser muy valiosa en trminos de ahorro de
papel al probar la funcionalidad de impresin de sus propias aplicaciones de Android.
Figura 51-2
Una vez que la opcin de impresin se ha seleccionado desde una aplicacin, aparecer la pantalla de
impresin estndar de Android que muestra una vista previa del contenido que se imprimir como se ilustra
en la Figura 51-3:
496
Figura 51-3
Al tocar el panel en la parte superior de la pantalla se mostrar la gama completa de opciones de impresin:
497
Figura 51-4
El panel de impresin Android ofrece las opciones de impresin habituales, tales como tamao de papel,
color, orientacin y nmero de copias. Otras opciones de destino de impresin se puede acceder pulsando
sobre la seleccin de salida de corriente de la impresora o PDF.
Impresin de imgenes
Como su nombre indica, esta opcin permite la impresin de imgenes a incorporar en las aplicaciones de
Android. Al aadir esta funcin a una aplicacin, el primer paso es crear una nueva instancia de la clase
PrintHelper:
PrintHelper ImagePrinter = new PrintHelper (contexto);
A continuacin, el modo de escala de la imagen impresa se puede especificar a travs de una llamada al
mtodo setScaleMode () de la instancia PrintHelper. Las opciones son como sigue:
498
SCALE_MODE_FIT - La imagen ser modificada para que quepa en el tamao de papel sin ningn
recorte o cambios de relacin de aspecto. Esto tpicamente resultar en el espacio en blanco que aparece
en una dimensin.
SCALE_MODE_FILL - La imagen ser modificada para llenar el tamao de papel con el recorte realizado
cuando sea necesario para evitar la aparicin de un espacio en blanco en la salida impresa.
Del mismo modo, el modo de color tambin puede ser configurada para indicar si la salida de impresin es
ser en color o en blanco y negro. Esto se consigue haciendo pasar una de las siguientes opciones a travs de
al mtodo setColorMode () de la instancia PrintHelper:
El marco de la impresin por defecto para dar color a la impresin a no ser que se especifique la opcin
monocromtica de la siguiente manera:
imagePrinter.setColorMode (PrintHelper.COLOR_MODE_MONOCHROME);
Todo lo que se requiere para completar la operacin de impresin es una imagen a imprimir y una llamada al
mtodo printBitmap () de la instancia PrintHelper, pasando a travs de una cadena que representa el nombre
que se asignar al trabajo de impresin y una referencia a la imagen ( en la forma de un objeto de mapa de
bits o una referencia Uri a la imagen):
De mapa de bits de mapa de bits (= BitmapFactory.decodeResource getResources (),
R.drawable.oceanscene);
imagePrinter.printBitmap ("Mi prueba de trabajo de impresin", mapa de bits);
Una vez que se ha iniciado el trabajo de impresin, el marco de impresin mostrar el cuadro de dilogo de
impresin y manejar tanto la posterior interaccin con el usuario y la impresin de la imagen en el destino de
impresin seleccionado por el usuario.
499
Al crear dinmicamente el contenido HTML (en oposicin a la carga y la impresin de una pgina web
existente) el proceso implica la creacin de un objeto WebView y asociar con ella una instancia
WebViewClient. El cliente de vista web se configura para iniciar un trabajo de impresin cuando el HTML ha
terminado siendo cargado en el WebView. Con el cliente de vista web configurado, el HTML se carga en el
WebView, momento en el que el proceso de impresin se activa.
Consideremos, por ejemplo, el siguiente cdigo:
myWebView WebView privado;
public void printContent (Ver vista)
{
WebView web View = new WebView (this);
webView.setWebViewClient (nueva WebViewClient () {
shouldOverrideUrlLoading public boolean (vista WebView,
String url)
{
return false;
}
@ Override
public void onPageFinished (vista WebView, Cadena url) {
createWebPrintJob (ver);
myWebView = null;
}
});
Cadena HTMLDocument =
"<Html> <body> <h1> Android prueba de impresin </ h1> <p>"
+ "Esto es parte del contenido de la muestra </ p> </ body> </ html>.";
El cdigo de este mtodo comienza por declarar una variable llamada myWebView en el que se almacena
una referencia a la instancia WebView creado en el mtodo. Dentro del mtodo printContent (), se crea una
instancia de la clase WebView al que se asigna a continuacin un ejemplo WebViewClient.
El WebViewClient asignado al objeto vista web est configurado para indicar que la carga del contenido
HTML debe ser manejado por la instancia WebView (volviendo falso de lo shouldOverrideUrlLoading ())
mtodo. Ms importante an, una onPageFinished () mtodo de control es declarado e implementado para
llamar a un mtodo llamado createWebPrintJob (). El mtodo de devolucin de llamada onPageFinished ()
ser llamado automticamente cuando todo el contenido HTML se ha cargado en la vista web. Esto asegura
que el trabajo de impresin no se inicia hasta que el contenido est listo, lo que garantiza que todo el
contenido se imprime.
500
A continuacin, se crea una cadena que contiene algo de HTML para servir como el contenido. Esto se carga
en la vista web. Una vez cargado el HTML, el mtodo onPageFinished () se disparar.Por ltimo, el mtodo
almacena una referencia al objeto vista web. Sin este paso vital, hay un riesgo significativo de que el sistema
de ejecucin de Java asumir que la aplicacin ya no necesita el objeto vista web y descartar a liberar
memoria (un concepto que se refiere en la terminologa de Java como la recoleccin de basura) que resulta
en la trabajo de impresin que termina antes de su finalizacin.
Todo lo que queda en este ejemplo es para implementar el mtodo createWebPrintJob () como sigue:
void createWebPrintJob privada (WebView web View) {
PrintManager PrintManager = (PrintManager) esta
.getSystemService (Context.PRINT_SERVICE);
PrintDocumentAdapter PrintAdapter =
webView.createPrintDocumentAdapter ("Mi Documento");
Cadena jobname = getString (R.string.app_name) + "documento";
PrintJob printJob = printManager.print (NOMBRE DEL TRABAJO, PrintAdapter,
nueva PrintAttributes.Builder () construir ()).;
}
Este mtodo simplemente obtiene una referencia al servicio PrintManager e instruye a la instancia vista web
para crear un adaptador de impresin. Se crea una nueva cadena para almacenar el nombre del trabajo de
impresin (en este caso basado en el nombre de la aplicacin y la palabra "documento").
Finalmente, el trabajo de impresin se inicia mediante una llamada al mtodo print () del administrador de
impresin, pasando por el nombre del trabajo, adaptador de impresin y un conjunto de atributos de impresin
predeterminados. Si es necesario, los atributos de impresin puede ser personalizado para especificar la
resolucin (puntos por pulgada), el margen y las opciones de color.
Tambin es importante tener en cuenta que la configuracin WebViewClient slo es necesario si una pgina
web es imprimir automticamente tan pronto como se haya cargado. Si la impresin es para ser iniciado por
el usuario que selecciona una opcin de men despus de que la pgina se ha cargado, slo el cdigo en el
mtodo createWebPrintJob () descrito anteriormente es necesario incluir en el cdigo de aplicacin. El
siguiente captulo, titulado Un Estudio Android HTML y contenido Web Printing Ejemplo , demostrar slo un
escenario.
501
Crear una instancia PdfDocument para representar las pginas del documento
Obtener una referencia a las pginas de la instancia PdfDocument, cada uno de los cuales tiene asociado
con l un ejemplo de la lona
El adaptador de impresin personalizado se indica en los pasos anteriores necesita implementar una serie de
mtodos que sern llamados por el sistema Android para realizar tareas especficas durante el proceso de
impresin. El ms importante de estos son el mtodo OnLayout () que se encarga de re-organizacin de la
presentacin del documento en respuesta al usuario cambiar la configuracin, como el tamao del papel o la
orientacin de pgina, y el mtodo OnWrite () que es el encargado de mostrar las pginas de imprimir. Este
tema se trata en detalle en el captulo titulado Un documento personalizado Impresin Ejemplo Android
Estudio .
Resumen
La versin Android 4.4 KitKat introdujo la posibilidad de imprimir el contenido de los dispositivos Android. La
salida de impresin se puede dirigir a las impresoras configuradas adecuadamente, un archivo de PDF local o
en la nube a travs de Google Drive. Desde la perspectiva del desarrollador de aplicaciones Android, estas
capacidades estn disponibles para su uso en aplicaciones haciendo uso del marco de impresin. Por ahora
las opciones ms fciles de impresin para aplicar son las que implican el contenido en forma de imgenes y
HTML. La impresin ms avanzada puede, sin embargo, se implementar utilizando las funciones de
impresin de documentos de encargo del marco.
502
6 Resumen
503
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.webkit.WebView importacin;
android.webkit.WebViewClient importacin;
android.print.PrintAttributes de importacin;
android.print.PrintDocumentAdapter importacin;
android.print.PrintManager importacin;
android.content.Context importacin;
public class HTMLPrintActivity extiende Actividad {
myWebView WebView privado;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_html_print);
WebView web View = new WebView (this);
webView.setWebViewClient (nueva WebViewClient () {
shouldOverrideUrlLoading public boolean (vista WebView,
String url)
{
return false;
}
@ Override
public void onPageFinished (vista WebView, Cadena url)
{
createWebPrintJob (ver);
myWebView = null;
}
});
Cadena HTMLDocument =
"<Html> <body> <h1> Android prueba de impresin </ h1> <p>"
+ "Esto es parte del contenido de la muestra </ p> </ body> </ html>.";
webView.loadDataWithBaseURL (null, HTMLDocument,
"Text / html", "UTF-8", null);
myWebView = web View;
}
.
.
.
}
Los cambios en el cdigo comienzan declarando una variable llamada myWebView en el que se almacenar
una referencia a la instancia WebView utilizado para la operacin de impresin. Dentro del mtodo onCreate
(), se crea una instancia de la clase WebView al que se asigna a continuacin un ejemplo WebViewClient.
El WebViewClient asignado al objeto vista web est configurado para indicar que la carga del contenido
HTML debe ser manejado por la instancia WebView (volviendo falso de lo shouldOverrideUrlLoading ())
mtodo. Ms importante an, una onPageFinished () mtodo de control es declarado e implementado para
llamar a un mtodo llamado createWebPrintJob (). El mtodo onPageFinished () ser llamado
504
automticamente cuando todo el contenido HTML se ha cargado en la vista web. Como se indica en el
captulo anterior, este paso es necesario cuando se imprime el contenido HTML creado dinmicamente para
asegurar que el trabajo de impresin no se inicia hasta que el contenido se haya cargado por completo en el
WebView.
A continuacin, se crea un objeto String que contiene algo de HTML para servir como el contenido y
posteriormente cargado en la vista web. Una vez cargado el HTML, el mtodo de devolucin de llamada
onPageFinished () se disparar. Por ltimo, el mtodo almacena una referencia al objeto vista web en la
variable myWebView declarado previamente. Sin este paso vital, hay un riesgo significativo de que el sistema
de ejecucin de Java asumir que la aplicacin ya no necesita el objeto vista web y descartar a liberar
memoria que resulta en el trabajo de impresin que termina antes de su finalizacin.
Todo lo que queda en este ejemplo es implementar el mtodo createWebPrintJob () que est actualmente
configurado para ser llamado por el mtodo de devolucin de llamada onPageFinished ().Permanecer dentro
del archivo HTMLPrintActivity.java, por lo tanto, poner en prctica este mtodo para que se lea de la siguiente
manera:
void createWebPrintJob privada (WebView web View) {
PrintManager PrintManager = (PrintManager) esta
.getSystemService (Context.PRINT_SERVICE);
PrintDocumentAdapter PrintAdapter =
webView.createPrintDocumentAdapter ("Mi Documento");
Cadena jobname = getString (R.string.app_name) + "Imprimir Prueba";
printManager.print (NOMBRE DEL TRABAJO, PrintAdapter,
nueva PrintAttributes.Builder () construir ()).;
}
Este mtodo obtiene una referencia al servicio PrintManager e instruye a la instancia vista web para crear un
adaptador de impresin. Se crea una nueva cadena para almacenar el nombre del trabajo de impresin (en
este caso basado en el nombre de la aplicacin y la palabra "Impresin de prueba").
Finalmente, el trabajo de impresin se inicia mediante una llamada al mtodo print () del administrador de
impresin, pasando por el nombre del trabajo, adaptador de impresin y un conjunto de atributos de impresin
predeterminados.
Compila y ejecuta la aplicacin en un dispositivo con Android 4.4 o posterior. Una vez puesto en marcha, el
panel de impresin debera aparecer como se ilustra en la Figura 52-1.
505
Figura 52-1
Imprimir en una impresora fsica si ha configurado uno, salvar en Google Drive o, de forma alternativa,
506
seleccione la opcin de guardar en un archivo PDF. Una vez que se ha iniciado el trabajo de impresin,
comprobar la salida generada en el destino elegido. Tenga en cuenta que cuando se utiliza la opcin Guardar
en PDF, el sistema solicitar un nombre y una ubicacin para el archivo PDF.La carpeta Descargas hace una
buena opcin, el contenido de la cual se pueden ver seleccionando el icono Descargas situado entre los otros
iconos de aplicacin en el dispositivo. Figura 52-2, por ejemplo, muestra la salida PDF generado por la opcin
Guardar en PDF visto en un dispositivo Android:
Figura 52-2
507
Cambie de nuevo a modo de diseo y, a partir de la seccin Widgets de la paleta, arrastre y suelte un objeto
WebView en el centro del diseo de la pantalla del dispositivo. Utilizando el panel Propiedades o los botones
de la barra de diseo, cambiar el layout_width y propiedades layout_height del WebView para match_parent
para que llene todo el lienzo de diseo como se indica en la Figura 52-3:
508
Figura 52-3
Haga doble clic en la instancia WebView que acaba de agregar y cambiar el ID de la vista para myWebView.
Antes de proceder con el siguiente paso de este tutorial, debe agregarse al proyecto para que el objeto
WebView para acceder a Internet y descargar una pgina Web para la impresin de un permiso
adicional. Aadir este permiso localizando el archivo AndroidManifest.xml en la ventana de herramientas del
proyecto y haga doble clic sobre l para cargarlo en el panel de edicin. Una vez cargado, editar el contenido
XML para agregar la lnea de permiso adecuado como se muestra en el siguiente listado:
509
name
name
name
name
=
=
=
=
</ Recursos>
A continuacin, localice y editar la aplicacin -> res -> Men -> archivo menu_web_print.xml y reemplazar la
opcin de men de ajustes con la opcin de impresin:
<Xmlns men: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
herramientas: context = ". WebPrintActivity">
510
<Item
android:
android:
android:
android:
</ Men>
Todo lo que queda en cuanto a la configuracin de la opcin de men es para modificar el mtodo de
controlador onOptionsItemSelected () dentro del archivo WebPrintActivity.java:
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
int id = item.getItemId ();
si (id == R.id.action_print) {
createWebPrintJob (myWebView);
return true;
}
volver super.onOptionsItemSelected (punto);
}
511
}
void createWebPrintJob privada (WebView web View) {
PrintManager PrintManager = (PrintManager) esta
.getSystemService (Context.PRINT_SERVICE);
PrintDocumentAdapter PrintAdapter =
webView.createPrintDocumentAdapter ("Mi Documento");
Cadena jobname = getString (R.string.app_name) +
"Imprimir Prueba";
printManager.print (NOMBRE DEL TRABAJO, PrintAdapter,
nueva PrintAttributes.Builder () construir ()).;
}
.
.
}
Con el cdigo cambia, ejecute la aplicacin en un dispositivo Android fsico que ejecuta la versin Android 5.0
o posterior. Una vez puesto en marcha con xito, el WebView debe ser visible con la pgina web designada
cargado. Una vez que la pgina se ha cargado, seleccione la opcin Imprimir en el men de desbordamiento
(Figura 52-4) y utilizar el panel de impresin resultante para imprimir la pgina Web para un destino
adecuado.
512
Figura 52-4
Resumen
El marco Impresin Android incluye extensiones a la clase WebView que hacen posible la impresin de
contenido basado en HTML desde una aplicacin Android. Este contenido puede ser en forma de HTML
creado dinmicamente dentro de la aplicacin en tiempo de ejecucin, o una pgina web pre-existente
cargado en una instancia de WebView. En el caso de HTML creado de forma dinmica, es importante utilizar
una instancia WebViewClient para asegurarse de que la impresin no se inicia hasta que el HTML se ha
cargado completamente en el WebView.
513
9 Prueba de la aplicacin
10 Resumen
Crear una instancia de la clase PdfDocument en el que almacenar las pginas del documento
Obtener referencias a los objetos de lona asociados con las pginas del documento
514
Escribe el documento PDF en un flujo de salida de destino proporcionada por el marco de impresin
En este captulo, una visin general de estos pasos, se le proporcionarn seguido de un tutorial detallado
diseado para demostrar la aplicacin de impresin de documentos de encargo dentro de las aplicaciones de
Android.
onStart () - Este mtodo es llamado cuando el proceso de impresin se inicia y se proporciona para que
el cdigo de la aplicacin tiene la oportunidad de realizar tareas necesarias en la preparacin para la
creacin de la tarea de impresin. La aplicacin de este mtodo dentro de la subclase
PrintDocumentAdapter es opcional.
OnLayout () - Este mtodo de devolucin de llamada se llama despus de la llamada al mtodo onStart ()
y luego de nuevo cada vez que el usuario realiza cambios en los ajustes de impresin (como el cambio de
la orientacin, el tamao del papel o la configuracin de color). Este mtodo debe adaptar el contenido y
el diseo cuando sea necesario para dar cabida a estos cambios.Una vez que se hayan completado estos
cambios, el mtodo debe devolver un recuento del nmero de pginas que desea imprimir. Aplicacin del
mtodo OnLayout () dentro de la subclase PrintDocumentAdapter es obligatorio.
OnWrite () - Este mtodo se llama despus de cada llamada a OnLayout () y es el encargado de mostrar
el contenido de los lienzos de las pginas a imprimir. Entre otros argumentos, este mtodo se pasa un
descriptor de archivo en el que el documento PDF resultante debe ser escrita una vez que la
representacin es completa. Luego se hace una llamada al mtodo de devolucin de llamada
onWriteFinished () que pasa a travs de un argumento que contiene informacin sobre la pgina va a
imprimir. Aplicacin del mtodo OnWrite () dentro de la subclase PrintDocumentAdapter es obligatorio.
515
onFinish () - Un mtodo opcional que, de aplicarse, se llama una vez por el marco de impresin cuando
se haya completado el proceso de impresin, proporcionando de este modo la aplicacin la posibilidad de
realizar cualquier operacin de limpieza que sean necesarios.
Figura 53-1
Cuando se selecciona el botn dentro de la aplicacin ser necesario llamar a un mtodo para iniciar el
proceso de impresin de documentos. Interruptor Designer para el modo texto y aadir una propiedad onClick
516
del botn configurado para llamar a un mtodo llamado PrintDocument. Suponiendo que el diseo se ha
configurado correctamente, el XML completado ahora queda redactada como sigue:
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: paddingLeft = "@ dimen / activity_horizontal_margin"
android: paddingRight = "@ dimen / activity_horizontal_margin"
android: paddingTop = "@ dimen / activity_vertical_margin"
android: paddingBottom = "@ dimen / activity_vertical_margin"
herramientas: context = ". CustomPrintActivity">
<Botn
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / print_string"
android: id = "@ + / Identificacin del botn"
android: layout_centerVertical = "true"
android: layout_centerHorizontal = "true"
android: onClick = "PrintDocument" />
</ RelativeLayout>
517
@ Override
public void OnWrite (PageRange [] pageRanges finales,
ParcelFileDescriptor destino final,
CancellationSignal definitiva
cancellationSignal,
devolucin de llamada WriteResultCallback final) {
}
}
.
.
}
A medida que la nueva clase se sita actualmente, contiene un mtodo constructor que se llamar cuando se
crea una nueva instancia de la clase. El constructor toma como argumento el contexto de la actividad de
llamadas que luego se almacena de manera que se pueda hacer referencia ms adelante en los dos mtodos
de devolucin de llamada.
Con el esquema de la clase establecida, el siguiente paso es comenzar a aplicar los dos mtodos de
devolucin de llamada, comenzando con OnLayout ().
518
android.print.PrintDocumentAdapter importacin;
android.content.Context importacin;
android.print.PrintDocumentInfo importacin;
android.print.pdf.PrintedPdfDocument importacin;
android.graphics.pdf.PdfDocument importacin;
public class CustomPrintActivity extiende Actividad {.
.
.
}
A continuacin, modificar la clase MyPrintDocumentAdapter para declarar variables para ser utilizado en el
mtodo OnLayout ():
public class MyPrintDocumentAdapter extiende PrintDocumentAdapter
{
Contexto Contexto;
int pageHeight privado;
int pageWidth privado;
pblica myPdfDocument PdfDocument;
pblicas TotalPages = int 4;
.
.
}
Tenga en cuenta que para los propsitos de este ejemplo, un documento de cuatro pginas va a ser
impreso. En situaciones ms complejas, la aplicacin lo ms probable es que tenga que calcular
dinmicamente el nmero de pginas a imprimir sobre la base de la cantidad y distribucin de los contenidos
en relacin con el tamao del papel y la orientacin de pgina las selecciones del usuario.
Con las variables declaradas, poner en prctica el mtodo OnLayout () como se indica en el siguiente listado
de cdigo:
@ Override
public void OnLayout (PrintAttributes oldAttributes,
PrintAttributes newAttributes,
CancellationSignal cancellationSignal,
Devolucin de llamada LayoutResultCallback,
Metadatos Bundle) {
myPdfDocument = new PrintedPdfDocument (contexto, newAttributes);
pageHeight =
newAttributes.getMediaSize () getHeightMils () / 1000 * 72.;
pageWidth =
newAttributes.getMediaSize () getWidthMils () / 1000 * 72.;
si (cancellationSignal.isCanceled ()) {
callback.onLayoutCancelled ();
retorno;
}
519
if (TotalPages> 0) {
PrintDocumentInfo.Builder constructor = new PrintDocumentInfo
.Builder ("Print_output.pdf")
.setContentType (PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount (TotalPages);
PrintDocumentInfo info = builder.build ();
callback.onLayoutFinished (informacin, true);
} Else {
callback.onLayoutFailed ("nmero de pginas es cero.");
}
}
Es evidente que este mtodo est realizando algunas tareas bastante, cada uno de los cuales requiere una
explicacin detallada.
Para empezar, un nuevo documento PDF se crea en forma de una instancia de clase PdfDocument. Uno de
los argumentos que se pasan al mtodo OnLayout () cuando se le llama por el marco de impresin es un
objeto de PrintAttributes tipo que contienen informacin sobre los ajustes de tamao de papel, resolucin y
color seleccionados por el usuario para la salida de impresin. Estos ajustes se utilizan al crear el documento
PDF, junto con el contexto de la actividad previamente almacenado para nosotros por nuestro mtodo
constructor:
myPdfDocument = new PrintedPdfDocument (contexto, newAttributes);
El mtodo utiliza las PrintAttributes objeto de extraer los valores de altura y anchura de las pginas del
documento. Estas dimensiones se almacenan en el objeto en forma de milsimas de pulgada.Dado que los
mtodos que utilizarn estos valores ms adelante en este ejemplo de trabajo en unidades de 1/72 de
pulgada de estos nmeros se convierten antes de que se almacenen:
pageHeight = newAttributes.getMediaSize () getHeightMils () / 1000 * 72.;
pageWidth = newAttributes.getMediaSize () getWidthMils () / 1000 * 72.;
Aunque este ejemplo no hace uso de la seleccin de color del usuario, esta propiedad se puede obtener a
travs de una llamada al mtodo getColorMode () de los PrintAttributes a objetos que devolver un valor de
COLOR_MODE_COLOR o COLOR_MODE_MONOCHROME.
Cuando se llama al mtodo OnLayout (), se pasa un objeto de tipo LayoutResultCallback. Este objeto
proporciona una manera para que el mtodo para comunicar informacin de estado de nuevo al marco de
impresin a travs de un conjunto de mtodos. El mtodo OnLayout (), por ejemplo, se llamar en el caso de
que el usuario cancela el proceso de impresin. El hecho de que el proceso ha sido cancelado se indica a
travs de un entorno en el argumento CancellationSignal. En el caso de que se detecte una cancelacin, el
mtodo OnLayout () debe llamar al mtodo onLayoutCancelled () del objeto LayoutResultCallback para
notificar el marco de impresin que se recibi la solicitud de cancelacin y que la tarea de diseo se ha
cancelado:
520
si (cancellationSignal.isCanceled ()) {
callback.onLayoutCancelled ();
retorno;
}
Cuando el trabajo de diseo es completa, se requiere el mtodo para llamar al mtodo onLayoutFinished ()
del objeto LayoutResultCallback, pasando a travs de dos argumentos. El primer argumento toma la forma de
un objeto PrintDocumentInfo que contiene informacin sobre el documento que desea imprimir. Esta
informacin consiste en el nombre que se utilizar para el documento PDF, el tipo de contenido (en este caso
un documento en lugar de una imagen) y el nmero de pginas. El segundo argumento es un valor booleano
que indica si el diseo ha cambiado desde la ltima llamada hecha al mtodo OnLayout ():
if (TotalPages> 0) {
PrintDocumentInfo.Builder constructor = new PrintDocumentInfo
.Builder ("Print_output.pdf")
.setContentType (PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount (TotalPages);
PrintDocumentInfo info = builder.build ();
callback.onLayoutFinished (informacin, true);
} Else {
callback.onLayoutFailed ("nmero de pginas es cero.");
}
En el caso de que el nmero de pginas es cero, los informes de cdigo de este fracaso en el marco de
impresin a travs de una llamada al mtodo onLayoutFailed () del objeto LayoutResultCallback.
La llamada al mtodo onLayoutFinished () notifica el marco impresin de que el trabajo de diseo est
completo, iniciando as una llamada al mtodo OnWrite ().
521
android.print.PageRange importacin;
android.print.PrintAttributes de importacin;
android.print.PrintDocumentAdapter importacin;
android.content.Context importacin;
android.print.PrintDocumentInfo importacin;
android.print.pdf.PrintedPdfDocument importacin;
android.graphics.pdf.PdfDocument importacin;
android.graphics.pdf.PdfDocument.PageInfo importacin;
.
.
.
.
@ Override
public void OnWrite (PageRange [] pageRanges finales,
ParcelFileDescriptor destino final,
ltima CancellationSignal cancellationSignal,
devolucin de llamada WriteResultCallback final) {
for (int i = 0; i <TotalPages; i ++) {
if (pageInRange (pageRanges, i))
{
PageInfo newPage = new PageInfo.Builder (pageWidth,
pageHeight, i) .Create ();
Pgina PdfDocument.Page =
myPdfDocument.startPage (newPage);
si (cancellationSignal.isCanceled ()) {
callback.onWriteCancelled ();
myPdfDocument.close ();
myPdfDocument = null;
retorno;
}
drawPage (pgina, i);
myPdfDocument.finishPage (pgina);
}
}
tratar {
myPdfDocument.writeTo (nueva FileOutputStream (
destination.getFileDescriptor ()));
} Catch (IOException e) {
callback.onWriteFailed (e.ToString ());
retorno;
} Finalmente {
myPdfDocument.close ();
myPdfDocument = null;
}
callback.onWriteFinished (pageRanges);
}
El mtodo OnWrite () comienza recorriendo cada una de las pginas del documento. Es importante tener en
cuenta, sin embargo, que el usuario puede no haber pedido que todas las pginas que componen el
522
documento se va a imprimir. En realidad, el panel de interfaz de usuario marco impresin proporciona la
opcin de especificar que las pginas especficas, o imprimir rangos de pginas.Figura 53-2, por ejemplo,
muestra el panel de impresin configurado para imprimir pginas 1-4, pginas 8 y 9 y 11 a 13 pginas de un
documento.
Figura 53-2
Al escribir las pginas del documento PDF, el mtodo OnWrite () debe tomar medidas para garantizar que
slo las pginas especificadas por el usuario se imprimen. Para hacer esto posible, el marco de impresin
pasa por como argumento una matriz de objetos PageRange indican los rangos de pginas que desea
imprimir. En la implementacin OnWrite arriba (), una pagesInRange llamado mtodo () se llama para cada
pgina para verificar que la pgina est dentro de los rangos especificados. El cdigo para el mtodo
pagesInRange () se llevar a cabo ms adelante en este captulo.
for (int i = 0; i <TotalPages; i ++) {
if (pageInRange (pageRanges, i))
{
Por cada pgina que est dentro de ningn rangos especificados, se crea un nuevo objeto
PdfDocument.Page. Al crear una nueva pgina, los valores de altura y anchura almacenados previamente por
el OnLayout () mtodo se pasan a travs como argumentos para que el tamao de la pgina coincide con las
opciones de impresin seleccionadas por el usuario:
PageInfo newPage = new PageInfo.Builder (pageWidth,
pageHeight, i) .Create ();
Pgina PdfDocument.Page = myPdfDocument.startPage (newPage);
Como con el mtodo OnLayout (), se requiere el mtodo OnWrite () para responder a las solicitudes de
cancelacin. En este caso, el cdigo notifica el marco impresin de que la cancelacin se ha realizado antes
de cerrar y de-referencia a la variable myPdfDocument:
si (cancellationSignal.isCanceled ()) {
callback.onWriteCancelled ();
523
myPdfDocument.close ();
myPdfDocument = null;
retorno;
}
Mientras el proceso de impresin no ha sido cancelado, el mtodo a continuacin, llama a un mtodo para
extraer el contenido de la pgina actual antes de llamar al mtodo finishedPage () en el objeto
myPdfDocument.
drawPage (pgina, i);
myPdfDocument.finishPage (pgina);
El mtodo drawPage () ser responsable de elaborar el contenido a la pgina y se implementar una vez que
el mtodo OnWrite () es completo.
Cuando el nmero necesario de pginas se han aadido al documento PDF, el documento se escribe en la
corriente de destino utilizando el descriptor de archivo que fue aprobada a travs de un argumento al mtodo
OnWrite (). Si, por cualquier razn, la operacin de escritura falla, el mtodo notifica al marco mediante una
llamada al mtodo onWriteFailed () del objeto WriteResultCallback (tambin pasa como argumento al mtodo
OnWrite ()).
tratar {
myPdfDocument.writeTo (nueva FileOutputStream (
destination.getFileDescriptor ()));
} Catch (IOException e) {
callback.onWriteFailed (e.ToString ());
retorno;
} Finalmente {
myPdfDocument.close ();
myPdfDocument = null;
}
Finalmente, el mtodo onWriteFinish () del objeto WriteResultsCallback se llama a notificar el marco impresin
de que el documento est listo para ser impreso.
524
dentro de los rangos especificados y puede ser implementado dentro de la clase MyPrintDocumentAdapter en
la clase CustomPrintActivity.java como sigue:
public class MyPrintDocumentAdapter extiende PrintDocumentAdapter
{
.
.
.
pageInRange private boolean (PageRange [] pageRanges, pgina int)
{
for (int i = 0; i <pageRanges.length; i ++)
{
if ((pgina> = pageRanges [i] .getStart ()) &&
(Pgina <= pageRanges [i] .getEnd ()))
return true;
}
return false;
}
.
.
}
525
android.graphics.pdf.PdfDocument.PageInfo importacin;
android.graphics.Canvas de importacin;
android.graphics.Color importacin;
android.graphics.Paint importacin;
public class CustomPrintActivity extiende Actividad {
.
.
public class MyPrintDocumentAdapter extiende PrintDocumentAdapter
{
.
.
void drawPage privada (pgina PdfDocument.Page,
int nmero de pgina) {
Lona lienzo = page.getCanvas ();
PageNumber ++; // Hacer nmeros de pginas seguras comienzan en 1
int titleBaseLine = 72;
int leftMargin = 54;
Pintura Paint Paint = new ();
paint.setColor (Color.BLACK);
paint.setTextSize (40);
canvas.drawText (
"Prueba de impresin de documentos de pgina" + nmero de pgina,
margen izquierdo,
titleBaseLine,
pintar);
paint.setTextSize (14);
canvas.drawText ("Esto es algo de contenido de prueba para verificar
que los trabajos de impresin de documentos de encargo", leftMargin, titleBaseLine + 35,
pintura);
si (nmero de pgina% 2 == 0)
paint.setColor (Color.RED);
ms
paint.setColor (Color.GREEN);
PageInfo pageInfo = page.getInfo ();
canvas.drawCircle (pageInfo.getPageWidth () / 2,
pageInfo.getPageHeight () / 2,
150,
pintar);
}
.
.
}
Numeracin de pgina dentro del cdigo comienza en 0. Dado que los documentos tradicionalmente
comienzan en la pgina 1, el mtodo comienza incrementando el nmero de pgina almacenado.Se obtiene
526
entonces una referencia al objeto Lienzo asociado a la pgina y algunos valores de los mrgenes y de lnea
de base declar:
Lona lienzo = page.getCanvas ();
PageNumber ++;
int titleBaseLine = 72;
int leftMargin = 54;
A continuacin, el cdigo crea la pintura y color de objetos para ser utilizados para el dibujo, establece un
tamao de texto y dibuja el texto ttulo de la pgina, incluyendo el nmero de pgina actual:
Pintura Paint Paint = new ();
paint.setColor (Color.BLACK);
paint.setTextSize (40);
canvas.drawText ("Prueba de impresin de documentos de pgina" + nmero de pgina,
margen izquierdo,
titleBaseLine,
pintar);
El tamao del texto se reduce a continuacin, y un poco de texto cuerpo dibuja bajo el ttulo:
paint.setTextSize (14);
canvas.drawText ("Esto es algo de contenido de prueba para verificar que los trabajos de
impresin de documentos de encargo", leftMargin, titleBaseLine + 35, pintura);
La ltima tarea realizada por este mtodo consiste en dibujar un crculo (rojo en pginas pares y verde en
impar). Despus de haber comprobado si la pgina es par o impar, el mtodo obtiene la altura y el ancho de
la pgina antes de usar esta informacin para colocar el crculo en el centro de la pgina:
si (nmero de pgina% 2 == 0)
paint.setColor (Color.RED);
ms
paint.setColor (Color.GREEN);
PageInfo pageInfo = page.getInfo ();
canvas.drawCircle (pageInfo.getPageWidth () / 2,
pageInfo.getPageHeight () / 2,
150, pintura);
Despus de haber dibujado en el lienzo, el mtodo devuelve el control al mtodo OnWrite ().
Con la finalizacin del mtodo drawPage (), la clase MyPrintDocumentAdapter ha finalizado.
527
528
Este mtodo obtiene una referencia al servicio en ejecucin Administrador de impresin en el dispositivo
antes de crear un nuevo objeto String para servir como el nombre de trabajo para la tarea de impresin. Por
ltimo, el mtodo print () del Administrador de impresin est llamado a iniciar el trabajo de impresin,
pasando por el nombre del trabajo y una instancia de nuestra clase adaptador documento de impresin
personalizado.
Prueba de la aplicacin
Compila y ejecuta la aplicacin en un dispositivo Android fsica que ejecuta Android 4.4 o posterior. Cuando la
aplicacin se haya cargado, toque el botn "Imprimir documento" para iniciar el trabajo de impresin y
seleccione un objetivo adecuado para la salida (la opcin Guardar en PDF es una opcin til para evitar
desperdiciar papel y tinta de la impresora).
Compruebe la salida impresa que debe consistir en 4 pginas, incluyendo texto y grficos. Figura 53-3, por
ejemplo, muestra las cuatro pginas del documento se ve como un archivo PDF listo para ser guardado en el
dispositivo Android:
Figura 53-3
Experimente con otras opciones de configuracin de impresin, como cambiar la configuracin del tamao del
papel, orientacin y pginas dentro del panel de impresin. Cada cambio de ajuste debe reflejarse en la salida
impresa, lo que indica que el adaptador de documento de impresin personalizada funciona correctamente.
529
Resumen
Aunque ms compleja de implementar que las opciones HTML marco y la impresin de la imagen de
impresin Android, la impresin de documentos de encargo ofrece una gran flexibilidad en cuanto a la
impresin de contenido complejo desde una aplicacin Android. La mayora de los trabajos en la aplicacin de
impresin de documentos de encargo consiste en la creacin de una clase adaptador personalizado de
impresin de tal manera que no slo se basa el contenido de las pginas del documento, sino que tambin
responde correctamente ya que los cambios se hacen por parte del usuario para imprimir los ajustes tales
como el tamao de pgina y el rango de pginas que desea imprimir.
530
8 Resumen
531
herramientas Construir Las variantes que se puede acceder desde el men de acceso rpido ventana de
herramientas (que se encuentra en la esquina inferior izquierda de la ventana principal de Android Studio
como se muestra en la Figura 54-1).
Figura 54-1
Una vez que aparezca la ventana de herramientas Variantes Generar, cambiar la configuracin de variantes
Construir para todos los mdulos listados de depuracin para liberar:
Figura 54-2
El proyecto ya est configurado para construir en modo de lanzamiento. El siguiente paso es configurar la
firma de informacin clave para su uso al generar el paquete de solicitud firmada.
532
Figura 54-3
En el caso de que usted tiene un archivo de almacn de claves de liberacin existente, haga clic en el botn
Elegir existente ... y busque y seleccione el archivo. En el caso de que todava tiene que crear un archivo de
almacn de claves, haga clic en el botn Crear nuevo ... para mostrar el cuadro de dilogo Nueva tienda de
claves (Figura 54-4). Haga clic en el botn situado a la derecha del campo de ruta tienda Clave y navegar a
una ubicacin adecuada en el sistema de archivos, escriba un nombre para el archivo de almacn de claves
(por ejemplo release.keystore.jks) y haga clic en el botn Aceptar.
Figura 54-4
El cuadro de dilogo Nueva tienda Key est dividido en dos secciones. La seccin superior se relaciona con
el archivo de almacn de claves. En esta seccin, introduzca una contrasea segura con la que, para
proteger el archivo de almacn de claves tanto en la Contrasea y Confirmar campos. La seccin inferior del
cuadro de dilogo se refiere a la llave de desbloqueo que se almacena en el archivo del almacn de claves.
533
Un alias por el que se har referencia a la tecla. Esto puede ser cualquier secuencia de caracteres,
aunque slo los primeros 8 son utilizados por el sistema.
El nmero de aos que la clave est en ser vlida (Google recomienda una duracin de ms de 27 aos).
Adems, la informacin debe ser proporcionada por al menos uno de los campos restantes (por ejemplo, su
nombre y apellido o nombre de la organizacin).
Figura 54-5
Una vez que la informacin se ha introducido, haga clic en el botn Siguiente para continuar con la creacin
del paquete.
534
Asistente APK Generar Firmado todava debe mostrarse con la ruta de almacn de claves, contraseas y los
campos de alias clave pobladas de informacin:
Figura 54-6
Suponiendo que los ajustes son correctos, haga clic en el botn Siguiente para pasar a la pantalla de
generacin APK (Figura 54-7). Dentro de esta pantalla, revise el Destino APK ruta: el establecimiento para
verificar que la ubicacin en la que se generar el archivo APK es aceptable. En el caso de que se prefiere
otra ubicacin, haga clic en el botn situado a la derecha del campo de texto y desplcese a la ubicacin del
sistema de archivos deseado.
Figura 54-7
535
Active la casilla de verificacin Ejecutar ProGuard (ProGuard realiza una serie de tareas de optimizacin y
verificacin que se traducen en el cdigo de bytes pequeo y ms eficiente) antes de hacer clic en el botn
Finalizar. En este punto el sistema Gradle compilar la aplicacin en modo de lanzamiento. Una vez que la
construccin se haya completado, aparecer un dilogo que proporciona la opcin de abrir la carpeta que
contiene el archivo APK en una ventana del explorador:
Figura 54-8
En este momento la aplicacin est lista para ser presentada a la tienda de Google Play.
La clave privada generada como parte de este proceso se debe utilizar cuando la firma y la liberacin de las
aplicaciones futuras y, como tal, se debe mantener en un lugar seguro y con seguridad una copia de
seguridad.
El paso final en el proceso de traer una aplicacin Android en el mercado implica presentarlo al desarrollador
Google Play Consola. Una vez presentada, la aplicacin estar disponible para descargar en Google Play
App Store.
Texto promocional - El texto que se utilizar cuando la aplicacin aparece en las caractersticas
especiales de promocin dentro del entorno de Google Play.
536
Categora - La categora que mejor describe su aplicacin (por ejemplo, finanzas, salud y bienestar,
educacin, deportes, etc.).
Ubicaciones - Las zonas geogrficas en las que se desee su aplicacin para estar disponibles para
su compra.
Informacin de contacto - Mtodos por el cual los usuarios pueden ponerse en contacto con usted
para el apoyo en relacin con la aplicacin. Las opciones incluyen web, correo electrnico y
telfono.
Despus de haber recogido la informacin anterior y preparado el archivo del paquete de solicitud de
liberacin, simplemente siga los pasos en el Google Play Developer Console para presentar la solicitud de
pruebas y la venta.
Para resolver este problema, el cdigo de versin incorporada en el APK necesita ser aumentado. Esto se
realiza en el archivo build.gradle nivel de mdulo del proyecto, que se muestra resaltado en la figura 54 -9. Es
importante sealar que esto no es el archivo de build.gradle nivel superior posicionada inferior en el listado
jerarqua del proyecto:
Figura 54-9
537
('Proguard-android.txt'),
'proguard-
dependencias {
compilar FileTree (dir: 'libs', incluyen: ['* .jar'])
Para cambiar el cdigo de la versin, cambiar simplemente el nmero declarado junto a versionCode. Para
cambiar el nmero de versin que se muestra a los usuarios de la aplicacin, cambie la cadena
VersionName. Por ejemplo:
versionCode 2
VersionName "2.0"
Despus de haber realizado estos cambios, reconstruir el archivo APK y realizar la carga de nuevo.
Resumen
Antes de que una solicitud puede presentarse a la tienda de Google Play, que primero se debe construir en
modo de lanzamiento, firmado con un certificado privado y el archivo del paquete APK resultante se somete a
un proceso denominado alineamiento. Como se ha sealado en este captulo, todos estos pasos se pueden
realizar con relativa facilidad a travs de la utilizacin del sistema de compilacin Android Studio.
538
539
Contenido
[ ocultar ]
24 Resumen
540
Figura 55-1
541
Haga clic en Finalizar para iniciar el proceso de creacin del proyecto.
542
Figura 55-2
En el cuadro de dilogo Opciones resultante, acepte los valores predeterminados, haga clic en el botn
Finalizar.
Dentro de la ventana de la herramienta de proyecto ahora debe aparecer la carpeta AIDL. El siguiente paso
es crear el paquete com.android.vending.BILLING. Haga clic derecho en la carpeta y seleccione Nuevo AIDL
el
->
elemento
de
men
Paquete. En
el
cuadro
de
dilogo
resultante,
introduzca
543
Figura 55-3
Con el archivo de la biblioteca instalada, el siguiente paso es importar las clases de utilidad de la muestra
TrivialDrive en el proyecto para que estos puedan ser utilizados dentro del cdigo de la aplicacin.
Seleccione los nueve archivos en esta carpeta y copiarlos. Regresar a Android Studio y pegar los archivos en
el paquete com.example.inappbilling.inappbilling.util en la ventana de herramientas Proyecto. Verifique que la
jerarqua del proyecto coincide ahora con la figura 55-4:
544
Figura 55-4
545
Figura 55-5
Extraer las cadenas de texto botn a recursos de cadena con nombre click_string y buy_string y, con el
diseo de la interfaz de usuario diseada, cambiar la herramienta Diseador de modo de texto y el nombre de
los botones clickButton y buyButton respectivamente. Tambin, establecer las propiedades onClick para
configurar los botones para llamar a mtodos denominados buttonClicked y buyClick tal que el archivo de
diseo XML completado dice lo siguiente:
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: Herramientas = "http://schemas.android.com/tools"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: paddingLeft = "@ dimen / activity_horizontal_margin"
android: paddingRight = "@ dimen / activity_horizontal_margin"
android: paddingTop = "@ dimen / activity_vertical_margin"
android: paddingBottom = "@ dimen / activity_vertical_margin"
herramientas: context = ". InAppBillingActivity">
546
<Botn
android:
android:
android:
android:
android:
android:
android:
layout_width = "wrap_content"
layout_height = "wrap_content"
text = "@ string / buy_string"
id = "@ + / Identificacin del buyButton"
layout_centerVertical = "true"
layout_centerHorizontal = "true"
onClick = "buyClick" />
<Botn
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / click_string"
android: id = "@ + / Identificacin del clickButton"
android: layout_above = "@ + / Identificacin del buyButton"
android: layout_centerHorizontal = "true"
android: layout_marginBottom = "83dp"
android: onClick = "buttonClicked" />
</ RelativeLayout>
Con el diseo completo la interfaz de usuario, es el momento de empezar a escribir algo de cdigo Java para
manejar la compra y el consumo de clics.
547
.
.
.
}
Ahora necesita tambin el mtodo buttonClicked que se llama cuando se hace clic en el botn por el usuario
para ser implementado. Todo este mtodo tiene que hacer es desactivar el botn una vez ms para que el
botn no se puede hacer clic hasta que se tome otra compra y permitir que el botn de compra para que otro
clic se puede comprar. Permanecer dentro del archivo InAppBillingActivity.java, implementar este mtodo de
la siguiente manera:
com.ebookfrenzy.inappbilling paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.Button importacin;
android.view.View importacin;
public class InAppBillingActivity extiende Actividad {
.
.
.
public void buttonClicked (Ver vista)
{
clickButton.setEnabled (false);
buyButton.setEnabled (true);
}
.
.
}
El trabajo sobre la funcionalidad del primer botn est completa. Los prximos pasos son para comenzar a
implementar la funcionalidad de facturacin in-app.
548
debe tener una cuenta de Google Wallet Merchant asociado a l. Si una cuenta de comerciante de Google
Wallet no est configurado, cree una cuenta de comerciante y registrarlo con su cuenta de Google para
desarrolladores consola antes de continuar.
Figura 55-6
No es necesario cargar el archivo APK en este punto, por lo que una vez que la aplicacin se ha registrado,
haga clic en la opcin Servicios y APIs para mostrar la clave pblica RSA codificada en Base64 para la
aplicacin, como se muestra en la Figura 55-7:
549
Figura 55-7
Mantenga esta ventana del explorador abierta por ahora ya tendr esta tecla para ser incluidos en el cdigo
de la aplicacin en el siguiente paso de este tutorial.
<su
<su
<su
<su
dominio>
dominio>
dominio>
dominio>
.inappbilling.util.IabHelper;
.inappbilling.inappbilling.util.IabResult;
.inappbilling.inappbilling.util.Inventory;
.inappbilling.inappbilling.util.Purchase;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.Button importacin;
android.view.View importacin;
android.content.Intent importacin;
android.util.Log importacin;
550
551
Comience editando el archivo InAppBillingActivity.java y aadiendo el cdigo para el mtodo buyClick para
que se lea de la siguiente manera:
.
.
.
public class InAppBillingActivity extiende Actividad {
esttica TAG final String privada = "com.example.inappbilling";
IabHelper mHelper;
static final Cadena ITEM_SKU = "android.test.purchased";
.
.
.
public void buyClick (Ver vista) {
mHelper.launchPurchaseFlow (esto, ITEM_SKU, 10001,
mPurchaseFinishedListener, "mypurchasetoken");
}
.
.
.
}
Es evidente que todo este mtodo tiene que hacer es hacer una llamada al mtodo launchPurchaseFlow de
nuestra instancia mHelper. Los argumentos que se pasan a travs con el mtodo son las siguientes:
Una referencia a la instancia que encierra la actividad de la que se est llamando el mtodo.
El SKU que identifica el producto que se est comprando. En este caso vamos a utilizar un SKU estndar
proporcionado por Google para fines de prueba. Este SKU, que se refiere como una respuesta esttica
SKU, siempre resultar en una compra exitosa. Otros SKUs disponibles para su uso cuando se prueba la
compra de funcionalidad sin hacer compras reales se android.test.cancelled, android.test.refunded y
android.test.item_unavailable pruebas.
El cdigo de solicitud que puede ser cualquier valor entero positivo. Cuando la compra se ha completado,
el mtodo onActivityResult ser llamado y se pasa este entero junto con la respuesta de la compra. Esto
permite que el mtodo para identificar qu proceso de compra est regresando y puede ser til cuando el
mtodo tiene que ser capaz de manejar la compra de diferentes artculos.
La carga til desarrollador cadena simblica. Esto puede ser cualquier valor de cadena y se utiliza para
identificar la compra. Para los fines de este ejemplo, esto se establece en "mypurchasetoken".
552
Este mtodo tiene que identificar si fue llamado como resultado de una solicitud de compra en aplicacin o
alguna peticin relacionada con la facturacin en app. Lo hace mediante una llamada al mtodo
handleActivityResult de la instancia mHelper y que pasa por los argumentos de entrada. Si esta es una
solicitud de compra del mHelper se encargar de ello y devolver un valor verdadero. Si este no es el resultado
de una compra, entonces el mtodo tiene que pasar hacia arriba a la superclase para ser manipulados. Llevar
esta juntos los resultados en el siguiente cdigo:
@ Override
protected void onActivityResult (int requestCode, int resultCode,
Intencin de datos)
{
if (! mHelper.handleActivityResult (requestCode,
resultCode, datos)) {
super.onActivityResult (requestCode, resultCode, datos);
}
}
En el caso de que el mtodo onActivityResult fue llamado en respuesta a una compra de facturacin in-app, a
continuacin, se har una llamada al mtodo oyente referencia en la llamada al mtodo launchPurchaseFlow
(en este caso un mtodo llamado mPurchaseFinishedListener). La siguiente tarea, por lo tanto, es poner en
prctica este mtodo.
553
}
}
};
Como puede verse a partir del fragmento de cdigo anterior, en el caso de que la compra fue exitosa, un
mtodo denominado consumeItem () ser llamado. Claramente, el siguiente paso es poner en prctica este
mtodo.
Al igual que con la consulta, se realiza tambin la tarea consumo de forma asncrona y, en este caso, est
configurado para llamar a un oyente llamado mConsumeFinishedListener cuando est terminado. Este oyente
ahora debe aplicarse de tal manera que permite el botn "Click Me!" Despus de que el artculo ha sido
consumida en el sistema de facturacin:
554
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
nueva IabHelper.OnConsumeFinishedListener () {
public void compra onConsumeFinished (Compra,
IabResult resultado) {
si (result.isSuccess ()) {
clickButton.setEnabled (true);
} Else {
// Error mango
}
}
};
555
que el cdigo de funcionamiento cuando se utilizan los valores SKU de respuesta esttica. Antes de probar la
aplicacin en modo de depuracin, por lo tanto, unas pocas lneas adicionales de cdigo necesitan ser
aadido con el mtodo verifyPurchase () en el archivo de Security.java. Dentro de la ventana de la
herramienta Android Proyecto de estudio, seleccione el archivo Security.java ubicada en la aplicacin -> Java
-> <nombre del paquete> -> util carpeta del proyecto para cargarlo en el editor. Una vez cargado, localizar y
modificar el mtodo verifyPurchase () para que se lea de la siguiente manera:
com.ebookfrenzy.inappbilling.util paquete;
android.text.TextUtils de importacin;
android.util.Log importacin;
org.json.JSONException importacin;
org.json.JSONObject importacin;
com.ebookfrenzy.inappbilling.BuildConfig importacin;
java.security.InvalidKeyException importacin;
java.security.KeyFactory importacin;
java.security.NoSuchAlgorithmException importacin;
java.security.PublicKey importacin;
java.security.Signature importacin;
java.security.SignatureException importacin;
java.security.spec.InvalidKeySpecException importacin;
java.security.spec.X509EncodedKeySpec importacin;
.
.
.
public static boolean verifyPurchase (String base64PublicKey,
Cadena SignedData, firma String) {
si (TextUtils.isEmpty (SignedData) ||
TextUtils.isEmpty (base64PublicKey) ||
TextUtils.isEmpty (firma)) {
Log.e (TAG, "verificacin Compra fall: falta de datos.");
si (BuildConfig.DEBUG) {
return true;
}
return false;
}
Clave PublicKey = Security.generatePublicKey (base64PublicKey);
volver Security.verify (clave, SignedData, firma);
}
Esto asegurar que cuando la aplicacin se ejecuta en modo de depuracin del mtodo no informa de un
error si la firma es falta cuando se verifica un SKU compra respuesta esttica. Al marcar para el modo de
depuracin en el cdigo, nos aseguramos de que esta comprobacin de seguridad funcionar como est
previsto cuando la aplicacin est construida en modo de lanzamiento.
556
Figura 55-8
Haga clic en el botn Comprar para simular una compra en ese momento un mensaje de xito de Pago
(Figura 55-9) debera aparecer despus de lo cual debera ser posible hacer clic en el botn "Click Me!" Una
vez.
Figura 55-9
Despus de haber consumido el clic, ser necesario comprar otro clic con el fin de permitir que una vez ms
el botn.
557
respuesta esttica SKU. El producto SKU que se utilizar en el resto de este captulo se llamar
com.example.buttonclick, por lo que editar el archivo InAppBillingActivity.java y modificar la referencia SKU en
consecuencia:
public class InAppBillingActivity extiende Actividad {
esttica TAG final String privada =
"Com.ebookfrenzy.inappbilling";
IabHelper mHelper;
static final Cadena ITEM_SKU = "com.example.buttonclick";
clickButton Botn privado;
buyButton Botn privado;
.
.
.
Antes de cualquiera de los productos se pueden crear, un archivo APK de liberacin para la aplicacin
primero debe ser subido a la consola de desarrollador. Para preparar este archivo APK de liberacin para la
aplicacin InAppBilling, siga los pasos descritos en el captulo titulado Generacin de un lanzamiento APK
archivo Firmado en Android Estudio . Una vez que el archivo APK se ha creado, seleccione la aplicacin
previamente registrada en la lista de aplicaciones en el desarrollador Google Play Consola y, en la pantalla
resultante, haga clic en el enlace APK en el panel de la izquierda. Cuando se le solicite, cargue el archivo
APK de liberacin a la consola.
558
Figura 55-10
Para aadir un nuevo producto, haga clic en el botn Agregar nuevo producto y, en el panel resultante,
establezca el tipo de producto a producto Gestionado e introduzca un ID de producto (en este caso
com.example.buttonclick). Haga clic en Continuar y en la segunda pantalla de introducir un ttulo, descripcin
y precio para el artculo. Cambie el men en la parte superior de la pgina para activar.
A su regreso a la pantalla de inicio En-app productos, el nuevo producto debera aparecer ahora:
Figura 55-11
559
560
dispositivo e iniciar sesin en el dispositivo como el usuario de prueba seleccionando el icono correspondiente
en la parte inferior de la pantalla. Tenga en cuenta que durante la compra de prueba, ser necesario introducir
la informacin de tarjetas de crdito para el nuevo usuario con el fin de ser capaz de probar plenamente la
aplicacin de facturacin in-app.
Una vez que el usuario se ha aadido como una cuenta de prueba, el siguiente paso es cargar el archivo APK
liberacin generado previamente en el dispositivo. Comience permitiendo que el dispositivo para la
depuracin USB siguiendo los pasos descritos en el captulo titulado Testing Android Apps Studio en un
dispositivo Android fsica . Una vez activado, conecte el dispositivo al sistema de desarrollo y eliminar
cualquier versin anterior de la aplicacin del dispositivo ejecutando lo siguiente en una terminal o ventana de
smbolo, donde <nombre del paquete> es el nombre del paquete completo de la aplicacin (por ejemplo < su
dominio> .inappbilling):
desinstalacin adb <nombre del paquete>
A continuacin, subir el APK liberacin creado anteriormente en este captulo ejecutando el siguiente
comando:
adb install -d /path/to/release/apkfile.apk
Una vez instalada la aplicacin, localizarlo entre las aplicaciones en el dispositivo y ejecutarlo. Mientras la
aplicacin permanece en estado de prueba dentro de la consola de Google Play desarrollador no se cobrar
nada incurridos por el usuario, mientras que probar la funcionalidad de facturacin en app de la
solicitud. Tenga en cuenta que el Google de dilogo (Figura 55-12) Juega ahora enumera el ttulo del
producto y el precio segn lo declarado por el producto de la Consola de Google Play para desarrolladores:
Figura 55-12
Todas las compras de prueba hechas de esta manera sern enumerados dentro de la cuenta de Google
561
Wallet del desarrollador pero no sern facturados al usuario que realiza la prueba. Cualquier no transacciones
cancelados manualmente dentro de Google Wallet se cancelar automticamente despus de 14 das.
Figura 55-13
En el cuadro de dilogo resultante (Figura 55-14), introduzca la direccin de correo electrnico de un grupo de
Google o el URL de la Comunidad Google+ que est listo para realizar la prueba. El dilogo tambin incluye
la direccin URL de la aplicacin en la tienda de Google Play, que tendr que ser enviado a sus probadores
para que puedan descargar e instalar la aplicacin.
562
Figura 55-14
563
Por ejemplo:
mHelper.startSetup (nueva
IabHelper.OnIabSetupFinishedListener () {
public void onIabSetupFinished (IabResult resultado)
{
if (! result.isSuccess ()) {
Log.d (TAG, "Dentro de la aplicacin de configuracin de facturacin
fall:" +
resultado);
} Else {
Log.d (TAG, "En aplicacin de facturacin est configurado OK");
mHelper.enableDebugLogging (true, TAG);
}
}
});
}
Por ltimo, no es raro que el desarrollador para encontrar ese cdigo que funcionaba en modo de depuracin
utilizando respuestas estticas falla en el modo de liberacin con valores reales SKU. En esta situacin, la
salida LogCat de la aplicacin de modo de disparo se ejecuta se puede ver en tiempo real mediante la
conexin del dispositivo a la computadora de desarrollo y ejecucin de la siguiente comando adb en una
terminal o ventana de smbolo del comando:
Logcat adb
En general, los mensajes de diagnstico proporcionarn un buen punto de partida para identificar las posibles
causas de la mayora de los fracasos.
Resumen
El Google Play En aplicacin API de facturacin proporciona un mecanismo por el cual los usuarios pueden
cargar por bienes o servicios virtuales desde las aplicaciones. Dentro de la aplicacin de los productos se
pueden configurar para ser suscripcin nica de compra basada, por una sola vez, o consumible (en que el
tema tiene que volver a comprar despus de que se utiliza dentro de la aplicacin).
En este captulo se trabaj a travs de los pasos implicados en la preparacin y aplicacin de Google Play
facturacin en app dentro de una aplicacin Android.
564
2.2 Dependencias
7 Resumen
Un panorama de Gradle
Gradle es un conjunto de herramientas de construccin automatizado que permite que la forma en que se
construyen los proyectos para ser configurado y gestionado a travs de un conjunto de archivos de
configuracin de generacin. Esto incluye definir cmo un proyecto se va a construir, lo que necesitan las
dependencias de cumplirse para el proyecto para construir con xito y cul debera ser el resultado final (o
resultados) del proceso de construccin. La fuerza de Gradle radica en la flexibilidad que proporciona a los
desarrolladores. El sistema Gradle es un entorno basado en lnea de comandos independiente que se puede
integrar en otros ambientes mediante el uso de plug-ins. En el caso de Android de estudio, integracin Gradle
se proporciona a travs de la apropiadamente llamada Android Estudio Plug-in.
565
Aunque el Android Estudio Plug-in permite tareas Gradle a ser iniciados y gestionados desde dentro Android
de estudio, la lnea de comandos envoltorio Gradle todava se puede utilizar para construir proyectos basados
en Android Studio, incluyendo en los sistemas en los que Android Studio no est instalado.
Las reglas de configuracin para construir un proyecto se declaran en Gradle construir archivos y scripts
basados en el lenguaje de programacin Groovy.
Predeterminados Sensible
Gradle implementa un concepto denominado convencin sobre configuracin. Esto simplemente significa que
Gradle tiene un conjunto predefinido de valores de configuracin predeterminados razonables que se
utilizarn a menos que sean anulados por los ajustes en los archivos de creacin. Esto significa que se
construye se puede realizar con el mnimo de configuracin requerida por el desarrollador. Los cambios en los
archivos de creacin slo son necesarios cuando la configuracin predeterminada no satisface sus
necesidades de construccin.
Dependencias
Otra rea clave de la funcionalidad Gradle es el de las dependencias. Consideremos, por ejemplo, un mdulo
dentro de un proyecto Android Estudio que desencadena un intento para cargar otro mdulo en el proyecto. El
primer mdulo, en efecto, una dependencia en el segundo mdulo ya que la aplicacin dejar de construir si
el segundo mdulo no puede ser localizado y puesto en marcha en tiempo de ejecucin. Esta dependencia
puede ser declarada en el Gradle construir archivo para el primer mdulo de modo que el segundo mdulo se
incluye en la construccin de aplicaciones, o un error marcado en el caso de que el segundo mdulo no se
puede encontrar o construida. Otros ejemplos de dependencias son las bibliotecas y archivos JAR en el que
el proyecto depende, a fin de compilar y ejecutar.
Dependencias Gradle se pueden categorizar como local o remoto. Una dependencia local hace referencia a
un elemento que est presente en el sistema de archivos local del sistema de ordenador en el que se est
realizando la construccin. Una dependencia a distancia se refiere a un elemento que est presente en un
servidor remoto (tpicamente referido como un repositorio).
Dependencias remotas se manejan para proyectos Android Studio utilizando otra herramienta de gestin de
proyectos nombrado Maven. Si una dependencia remota se declara en un Gradle construir archivo usando
Maven sintaxis entonces la dependencia se descargar automticamente desde el repositorio designado y se
incluye en el proceso de construccin. La declaracin de dependencias del siguiente, por ejemplo, hace que
la biblioteca de Google Play Servicios que se agrega al proyecto desde el repositorio de Google:
compilar 'com.google.android.gms: play-servicios: +'
566
Entradas Manifest
Cada proyecto Android Studio ha asociado a l un archivo AndroidManifest.xml que contiene detalles de
configuracin sobre la aplicacin. Un nmero de entradas manifiestos se puede especificar en Gradle
construir archivos que luego se genera automticamente en el archivo de manifiesto cuando se construye el
proyecto. Esta capacidad es complementaria a la acumulacin variantes de funcin, permitiendo elementos
tales como el nmero de versin de la aplicacin, ID de la aplicacin y SDK informacin de la versin para ser
configurado de forma diferente para cada variante de construccin.
APK Firma
El captulo titulado Firma y Preparacin de una aplicacin Android para lanzamiento cubierto la creacin de un
archivo APK autorizacin firmada utilizando el entorno Android Studio. Tambin es posible incluir la
informacin de la firma introducida a travs de la interfaz de usuario de Android Estudio en un Gradle
construir archivo para que los archivos APK firmados se pueden generar desde la lnea de comandos.
Soporte ProGuard
ProGuard es una herramienta incluida con Android Studio que optimiza, se encoge y ofusca el cdigo de
bytes de Java para que sea ms eficiente y ms difcil de realizar ingeniera inversa (el mtodo por el cual la
lgica de una aplicacin puede ser identificado por otros a travs del anlisis del cdigo de bytes de Java
compilado ). Los archivos Gradle construir proporcionan la capacidad de controlar o no ProGuard se ejecuta
en su aplicacin cuando se construy.
567
Figura 56-1
Por defecto, el contenido del nivel superior Gradle construir archivo dicen lo siguiente:
// Fichero de construccin de alto nivel donde se puede aadir opciones de configuracin
comunes a todos los sub-proyectos / mdulos.
buildscript {
repositorios {
JCentro ()
}
dependencias {
ruta de clase 'com.android.tools.build:gradle:1.0.0'
// NOTA: No coloque sus dependencias de aplicaciones aqu; que pertenecen
// En los archivos build.gradle mdulo individual
}
}
allprojects {
repositorios {
JCentro ()
}
}
568
Tal y como est todo el archivo que hace es declarar que las bibliotecas remotas deben ser obtenidos
utilizando JCentro repositorio y que construye dependen del plugin de Android para Gradle. En la mayora de
las situaciones, no es necesario realizar ningn cambio en este fichero de construccin.
Module1 / build.gradle
Module2 / build.gradle
'proguard-
dependencias {
compilar FileTree (dir: 'libs', incluyen: ['* .jar'])
compilar 'com.android.support:appcompat-v7:21.0.3'
dependencias {
compilar FileTree (dir: 'libs', incluyen: ['* .jar'])
compilar 'com.android.support:appcompat-v7:19.+'
}
Como es evidente a partir del contenido del archivo, el archivo de creacin comienza declarando el uso del
plug-in Gradle Android:
569
La seccin androide del archivo a continuacin indica la versin tanto del SDK y las herramientas de
construccin de Android que se van a utilizar en la construccin de Module1.
androide {
compileSdkVersion 21
buildToolsVersion "21.1.2"
Los artculos declarados en la seccin defaultConfig definen los elementos que van a ser generados en el
archivo AndroidManfest.xml del mdulo durante la construccin. Estos ajustes, que pueden ser modificados
en el archivo de generacin, se han tomado de los ajustes introducidos en Android Studio cuando se cre
primero el mdulo:
defaultConfig {
applicationId "com.ebookfrenzy.gradledemo.module1"
minSdkVersion 19
targetSdkVersion 21
versionCode 1
VersionName "1.0"
}
La seccin buildTypes contiene instrucciones sobre si y cmo ejecutar ProGuard en el archivo APK cuando se
construy una versin de lanzamiento de la aplicacin:
buildTypes {
liberacin {
runProguard falsa
proguardFiles getDefaultProguardFile ('Proguard-android.txt'),
'Proguard-rules.pro'
}
}
Como actualmente configurado, ProGuard no se ejecutar cuando Module1 se construye. Para habilitar
ProGuard, la entrada runProguard hay que cambiar de falso a verdadero. El archivo proguard-rules.pro se
puede encontrar en el directorio de mdulos del proyecto. Los cambios realizados en este archivo tienen
prioridad sobre la configuracin predeterminada en el archivo-Proguard android.txt que se encuentra en el
directorio de instalacin del SDK de Android bajo sdk / herramientas / Proguard.
Dado que no buildtype depuracin se declara en este archivo, se utilizarn los valores predeterminados
(construidas sin ProGuard, firmado con una clave de depuracin y con smbolos de depuracin habilitada).
Una seccin adicional, productFlavors derecho tambin puede ser incluido en el archivo de generacin
mdulo para permitir mltiples variantes de construccin que se crearon. Este tema se tratar en el prximo
captulo titulado Un Estudio Android Gradle Construir Las variantes Ejemplo .
570
Por ltimo, la seccin de dependencias muestra todas las dependencias locales y remotos en los que el
mdulo es dependiente. La primera dependencia es el siguiente:
compilar FileTree (dir: 'libs', incluyen: ['* .jar'])
Esta es una lnea estndar que indica al sistema Gradle que cualquier archivo JAR ubicado en el
subdirectorio lib del mdulo se va a incluir en el proyecto de construccin. Si, por ejemplo, un archivo JAR
myclasses.jar llamada estaba presente en el / Module1 / carpeta lib GradleDemo del proyecto, ese archivo
JAR sera tratado como una dependencia del mdulo y se incluye en el proceso de construccin.
Una dependencia de otros mdulos dentro del mismo proyecto de aplicacin tambin puede ser declarada en
el fichero de construccin. Si, por ejemplo, el mdulo 1 tiene una dependencia en Module2, tendra que ser
aadido a la seccin de las dependencias del archivo build.gradle Module1 la siguiente lnea:
compilar proyecto (": Module2")
La ltima lnea de la dependencia en el archivo de ejemplo anterior utiliza la sintaxis de Maven para designar
que la biblioteca de soporte Android debe ser incluido en el Repositorio Android:
compilar 'com.android.support:appcompat-v7:19.+'
Otro requisito repositorio comn es la biblioteca de Google Play Services, una dependencia que puede ser
declarado como sigue:
compilar 'com.google.android.gms: play-servicios: +'
Tenga en cuenta que la declaracin de dependencias puede incluir un nmero de versin opcional para
indicar qu versin de la biblioteca debe ser incluido. Versin 19.0 o posterior tiene el mandato para la
biblioteca de soporte mientras que no se especifica ninguna versin en particular para los servicios de juego
(que resulta en la versin ms reciente que se obtiene desde el repositorio).
571
applicationId "com.ebookfrenzy.gradledemo.module1"
minSdkVersion 9
targetSdkVersion 19
versionCode 1
VersionName "1.0"
}
signingConfigs {
liberacin {
archivo storefile ("keystore.release")
storePassword "la contrasea del almacn de claves aqu"
keyAlias "sus alias clave aqu"
keyPassword "su contrasea clave aqu"
}
}
buildTypes {
.
.
.
}
Otro enfoque es configurar el fichero de construccin para que Gradle solicita las contraseas que se
introduzcan durante el proceso de compilacin:
signingConfigs {
liberacin {
archivo storefile ("keystore.release")
storePassword System.Console (). readLine
("\ NNo Keystore contrasea:")
keyAlias "sus alias clave aqu"
keyPassword System.Console () readline ("\ nNo contrasea de clave:").
}
}
572
cada carpeta del proyecto. Mientras que esta envoltura es ejecutable en los sistemas Windows, se necesita
tener permiso de ejecucin habilitado en Linux y Mac OS X antes de que pueda ser utilizado. Para habilitar el
permiso de ejecucin, abra una ventana de terminal, cambie el directorio a la carpeta del proyecto para el que
se necesita la envoltura y ejecutar el siguiente comando:
chmod + x gradlew
Una vez que el archivo tiene permisos de ejecucin, o bien hay que aadir a la variable de entorno $ PATH, o
el nombre con el prefijo ./ con el fin de ejecutar la ubicacin del archivo. Por ejemplo:
tareas ./gradlew
Gradle ve edificio del proyecto en trminos de nmero de tareas diferentes. Una lista completa de las tareas
que estn disponibles para el proyecto actual se puede obtener ejecutando el siguiente comando desde el
directorio del proyecto (recordando como prefijo el comando con ./ si se ejecuta en Mac OS X o Linux):
tareas gradlew
Tambin vale la pena sealar que esta lista tambin est disponible en la ventana de herramientas Gradle en
Android Studio como se muestra en la Figura 56-2:
Figura 56-2
573
Haciendo doble clic en cualquier tarea dentro de la ventana de la herramienta se iniciar la tarea de
construccin.
Para construir una versin de depuracin del proyecto adecuado para el dispositivo o las pruebas emulador,
utilice la opcin assembleDebug:
gradlew assembleDebug
Resumen
En su mayor parte, Android Estudio realiza la aplicacin se basa en segundo plano sin intervencin alguna del
desarrollador. Este proceso de construccin se maneja mediante el sistema Gradle, un conjunto de
herramientas de construccin automatizado diseado para permitir a las formas en que se construyen los
proyectos para ser configurado y gestionado a travs de un conjunto de archivos de configuracin de
generacin. Mientras que el comportamiento predeterminado de Gradle es adecuada para muchos requisitos
bsicos de construccin del proyecto, la necesidad de configurar el proceso de construccin es inevitable con
los proyectos ms complejos. En este captulo se ha proporcionado una visin general del sistema de
construccin Gradle y archivos de configuracin en el contexto de un proyecto Android Studio. El siguiente
captulo, titulado Un Estudio Android Gradle Construir Las variantes Ejemplo llevar un paso ms all en la
forma de utilizar Gradle para construir diferentes versiones de un mismo proyecto de aplicacin.
574
phoneDebug
phoneRelease
tabletDebug
tabletRelease
Esto plantea la cuestin de la diferencia entre un tipo de acumulacin y un sabor de construccin. En general,
un tipo de construccin define cmo se construye un mdulo (por ejemplo, si es o no ProGuard se ejecuta,
cmo se firm el paquete de la aplicacin resultante y si son smbolos de depuracin para ser incluido).
El sabor de construccin, por otra parte, tpicamente define lo que se construy (tales como que los archivos
de cdigo de recursos y fuente son para ser incluidos en la construccin) para cada variante del
mdulo. Inicialmente los dos sabores sern configurados de tal manera que slo se diferencian visualmente
en trminos de los recursos que se utilizan para cada objetivo, como los diseos y los valores de cadena. El
proyecto luego ampliarse para proporcionar un ejemplo de cmo cada sabor puede hacer uso de diferentes
bases de cdigo fuente con el fin de proporcionar diferentes comportamiento de la aplicacin.
Contenido
[ ocultar ]
9 Resumen
575
Figura 57-1
Una vez cargado en el editor, el fichero de construccin debe ser similar a la siguiente lista:
aplicar plugin: 'com.android.application'
androide {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.ebookfrenzy.buildexample"
minSdkVersion 19
targetSdkVersion 21
versionCode 1
VersionName "1.0"
}
buildTypes {
liberacin {
minifyEnabled falsa
576
proguardFiles
getDefaultProguardFile
('Proguard-android.txt'),
'proguard-
rules.pro'
}
}
}
dependencias {
compilar FileTree (dir: 'libs', incluyen: ['* .jar'])
compilar 'com.android.support:appcompat-v7:21.0.3'
}
Como se ha sealado anteriormente, el proyecto va a consistir en dos tipos de construccin (de liberacin y
de depuracin), junto con dos sabores (telfonos y tabletas). Como es evidente en el archivo de creacin, el
tipo de versin de lanzamiento ya se declar en el expediente por lo que este no tiene que ser aadido. En la
prctica, Gradle tambin est utilizando la configuracin predeterminada sensibles para la versin de
depuracin por lo que este tipo tambin no tiene que ser agregado al archivo. Todo esto deja es el requisito
de declarar los dos sabores de construccin de la siguiente manera:
aplicar plugin: 'com.android.application'
androide {
compileSdkVersion 19
buildToolsVersion "19.1.0"
defaultConfig {
applicationId "com.ebookfrenzy.buildexample"
minSdkVersion 15
targetSdkVersion 19
versionCode 1
VersionName "1.0"
}
buildTypes {
liberacin {
runProguard falsa
proguardFiles
getDefaultProguardFile
('Proguard-android.txt'),
rules.pro'
}
}
productFlavors {
telfono {
ID de aplicacin
"Com.ebookfrenzy.buildexample.app.phone"
VersionName "1,0-phone"
}
tablet {
ID de aplicacin
"Com.ebookfrenzy.buildexample.app.tablet"
VersionName "1,0-tablet"
}
}
}
dependencias {
'proguard-
577
Una vez se han realizado los cambios, una barra de advertencia amarilla aparecer en la parte superior del
editor de lo que indica que los cambios en el Gradle construir necesidad de archivos para ser sincronizado
con el resto del proyecto. Haga clic en el enlace Sincronizar ahora se encuentra en el panel de aviso para
realizar la sincronizacin.
Antes de proceder con el siguiente paso, abra la ventana de herramientas Variantes Build ya sea usando el
men de acceso rpido situada en la barra de estado en la esquina inferior izquierda de la ventana principal
de Android Studio o utilizando la barra de la ventana de herramientas Variant Generar. Una vez cargado, al
hacer clic en la celda de la variante de construccin para el mdulo de aplicacin debe enumerar las cuatro
variantes de construccin:
Figura 57-2
Ahora que los sabores de construccin se han aadido al proyecto la estructura del proyecto debe ser
ampliado para proporcionar apoyo a estos dos nuevos sabores.
578
Figura 58-3
Dentro de la ventana de la herramienta de proyectos, haga clic en el BuildExample -> aplicacin -> directorio
src y seleccione Nuevo -> opcin de men Directorio y crear un nuevo directorio llamado de telfono / res /
layout. Haga clic una vez en el directorio src, esta vez aadiendo un nuevo directorio llamado de telfono / res
/ valores.
Repita estos pasos, esta vez nombrando la nueva tableta de directorios / res / layout y tabletas / res /
valores. Una vez completado, el mdulo de la seccin de la estructura del proyecto debe ser similar a la de la
Figura 57-4:
Figura 57-4
579
sabor
se
va
necesitar
para
contener
una
copia
de
los
archivos
de
recursos
activity_build_example.xml strings.xml de la actividad. Cada copia entonces ser modificado para satisfacer
los requisitos de la respectiva sabor.
Dentro de la ventana de herramientas del proyecto, vaya a la aplicacin -> src -> principal -> res -> diseo ->
archivo activity_build_example.xml y haga doble clic en l para cargarlo en la herramienta Diseador. Con la
herramienta en modo de diseo, haga doble clic en el fondo de la disposicin de la pantalla y especificar
presentacin que el id de la vista de diseo relativa.
En la ventana de herramientas de proyectos, haga clic en el archivo activity_build_example.xml y seleccione
la opcin de men Copiar. Con el archivo copiado, haga clic en el src -> Telfono -> res -> carpeta de diseo
y seleccione la opcin de men Pegar para agregar una copia del archivo en la carpeta. Dentro del dilogo
clic en Copiar en Aceptar para aceptar los valores predeterminados.
Utilizando la misma tcnica, aadir una copia de la src -> principal -> res -> Valores -> archivo strings.xml al
src -> Telfono -> res -> Valores de carpeta.
Una vez aadidos los archivos de recursos, edite el archivo strings.xml en el sabor telfono para cambiar el
recurso de cadena hello_world de la siguiente manera:
<? Xml version = "1.0" encoding = "UTF-8"?>
<recursos>
<String name = "nombre_apl"> BuildExample </ string>
<String name = "hello_world"> Este es el sabor de telfono </ string>
<String name = "action_settings"> Configuracin </ string>
</ Recursos>
580
Figura 57-5
581
Haga clic derecho en el nuevo directorio java, esta vez seleccionando la Nueva -> opcin de men Paquete y
nombrar el nuevo paquete com.ebookfrenzy.buildexample. Por ltimo, encontrar la clase BuildExampleActivity
que se encuentra en el src -> principal -> Java -> carpeta com.ebookfrenzy.buildexample, haga clic derecho
sobre l y seleccione la opcin de men Copiar. Haga clic derecho en el nuevo paquete aadido a la variante
de telfono y seleccionar la opcin de men Pegar para copiar el archivo de origen Actividad en el
paquete. En el clic de dilogo Copiar Clase resultante en el botn Aceptar para aceptar la configuracin
predeterminada. La variante telfono ahora tiene su propia versin de la clase de actividad. Uso de la ventana
de herramientas Variantes Generar, cambiar la variante de generacin para tabletDebug y repita los pasos
anteriores para agregar instancias del archivo de clase del paquete y la actividad a la tableta sabor de la
construccin.
En este punto, Android Estudio muy probablemente han comenzado a quejarse de instancias duplicadas de la
clase BuildExampleActivity. Esto es porque, adems de tener la clase declarada dentro de las variantes de
sabor, todava existe la instancia original dentro de la carpeta principal de construccin. Busque, por lo tanto,
y elimine la entrada BuildExampleActivity enumerados en src -> principal -> Java ->
com.ebookfrenzy.buildexample.
Cambie la variante de generacin para tabletDebug y modificar la tableta -> Java ->
com.ebookfrenzy.buildexample - archivo> clase BuildExampleActivity para cambiar el color de fondo del
diseo a verde:
582
com.ebookfrenzy.buildexample paquete;
android.support.v7.app.ActionBarActivity importacin;
android.graphics.Color importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.RelativeLayout importacin;
public class BuildExampleActivity extiende Actividad {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_build_example);
RelativeLayout myLayout =
(RelativeLayout) findViewById (R.id.layout);
myLayout.setBackgroundColor (Color.GREEN);
}
.
.
.
}
Compilar y ejecutar la aplicacin con cada variante y tenga en cuenta que los cambios en el color de fondo
para indicar que cada sabor est utilizando su propio archivo de clase de actividad, adems de diferentes
archivos de recursos.
Resumen
El mercado Android ahora cuenta con una amplia gama de dispositivos de todos los cuales tienen diferentes
capacidades de hardware y tamaos de pantalla. Si bien hay mucho que se puede lograr con el uso
cuidadoso de los controladores de distribucin, como el RelativeLayout y codificacin defensiva,
inevitablemente habr situaciones en las que algunos dispositivos de destino necesitarn un paquete de
solicitud por separado para ser construido. En reconocimiento de este hecho, Android Estudio introduce el
concepto de variantes de construccin y sabores diseados especficamente para hacer la tarea de construir
mltiples variaciones de un proyecto de aplicacin ms fcil de manejar.