Anda di halaman 1dari 582

1

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

Los cambios de configuracin


Manipulacin de cambio de estado

11.Manipulacin Android Actividad Cambios de estado en Android Estudio


La Clase de Actividad
Estado Dinamizador vs. Estado Persistente
Los mtodos de ciclo de vida para Android Actividad
Vidas Actividad
12.Android Actividad Estado Cambios - Un Estudio Android Ejemplo
Crear el ejemplo del Proyecto de cambio de estado
El diseo de la interfaz de usuario
Anulacin de los mtodos del ciclo de vida de actividad
Filtrar el panel LogCat
Ejecutar la aplicacin
Experimentar con la Actividad
13.Guardar y restaurar la actividad del Estado en Android Estudio
Ahorrar Estado Dinamizador
Guardado predeterminado de la interfaz de usuario del Estado
La Clase Bundle
Guardar el Estado
Restauracin del Estado
Prueba de la aplicacin
14.Entendiendo Vistas Android, Ver grupos y diseos en Android Estudio
Disear para diferentes dispositivos Android
Vistas y Ver grupos
Android Controladores de Distribucin
La vista Jerarqua
Creacin de interfaces de usuario
15.Una gua para la herramienta Diseador Android Estudio
El Diseador Android Estudio
Modo Diseo
Modo de texto
Configuracin de las propiedades
Tipo Morphing
Creacin de una definicin de dispositivo personalizado
16.El diseo de una interfaz de usuario utilizando la herramienta Diseador Android Estudio
Un Diseador Android Estudio Herramienta Ejemplo
Creacin de una nueva actividad
El diseo de la interfaz de usuario
Edicin de Propiedades de la vista
Ejecutar la aplicacin
Creacin manual de un diseo XML
Uso del visor Jerarqua
17.Creacin de una interfaz de usuario de Android en el Cdigo Java utilizando Android Estudio
Cdigo Java vs. XML Archivos Layout
Crear vistas
Propiedades y parmetros de diseo

Crear el proyecto Ejemplo en Android Estudio


Adicin Vistas a una actividad
Configuracin de propiedades de la vista
Agregar parmetros y reglas de diseo
Usando Ver IDs
Pxeles Independientes de densidad en la conversin (dp) de pxeles (px)

18.Uso del Administrador de Android GridLayout en Android Studio Designer


La introduccin de las Clases Android GridLayout y el Espacio
El GridLayout Ejemplo
Crear el proyecto GridLayout
Crear el GridLayout Instancia
Adicin Vistas a clulas GridLayout
Mover y eliminar filas y columnas
La implementacin de la fila de la clula y Spanning Columna
Cambio de la gravedad de un GridLayout Nio
19.Trabajar con el GridLayout Android usando Recursos Disposicin XML
GridLayouts en archivos de recursos XML
Adicin de Nios Vistas a la GridLayout
Declarando Spanning celular, Gravedad y Mrgenes
20.Una visin general y Android Estudio Ejemplo de Manejo Android Evento
Entender Eventos Android
Utilizando el androide: Recursos onClick
Los oyentes de eventos y mtodos de devolucin de llamada
Un ejemplo Manejo de Eventos
El diseo de la interfaz de usuario
El detector de eventos y mtodo de devolucin de llamada
El consumo de Eventos
21.Touch Android y multi-touch control de eventos en Android Estudio
Interceptar Eventos Touch
El objeto MotionEvent
Acciones Touch Comprensin
Manejo de Mltiples Toques
Un Multi-Touch Ejemplo de Aplicacin
El diseo de la interfaz de la actividad del usuario
Implementacin del Evento Listener Touch
Ejecutar la aplicacin Ejemplo
22.La deteccin de gestos comunes que utilizan Android Studio y el Gesto Detector Clase
La implementacin de Deteccin Gesto Comn
Creacin de un proyecto de deteccin de gestos Ejemplo
La implementacin de la clase Listener
Creacin de la GestureDetectorCompat Instancia
La aplicacin de la onTouchEvent Mtodo ()
Prueba de la aplicacin
23.La implementacin de reconocimiento de gestos Android personalizada con Android Estudio
El Gesto Android Application Builder
La Clase GestureOverlayView
La deteccin de gestos

La identificacin de los gestos especficos


Adicin de soporte de tarjetas SD a un AVD
Creacin y ejecucin de la Application Builder Gesto
Creacin de un archivo Gestos
Extraer el archivo de gestos de la tarjeta SD
Crear el proyecto Ejemplo
Adicin de los Gestos archivo al proyecto
El diseo de la interfaz de usuario
Carga del archivo Gestos
Registrando el detector de eventos
Implementacin del Mtodo onGesturePerformed
Prueba de la aplicacin
Configuracin del GestureOverlayView
Interceptar Gestos
La deteccin de gestos de pellizco en Android
Un gesto de pellizcar Ejemplo de proyecto

24.Introduccin al uso de fragmentos en Android Estudio


Qu es un fragmento?
Creacin de un Fragmento
Adicin de un fragmento de una actividad utilizando el archivo XML Layout
Adicin y Gestin de Fragmentos de Cdigo
Gestin de eventos Fragmento
Ejecucin Fragmento Comunicacin
25.Usando fragmentos en Android Studio - Un Ejemplo
Sobre el Fragmento Ejemplo de Aplicacin
Crear el proyecto Ejemplo
Creacin de la Primera Disposicin Fragmento
Creacin de la Primera Clase Fragmento
La creacin de la Segunda Disposicin Fragmento
Adicin de los fragmentos para la Actividad
Hacer la barra de herramientas Fragmento Hable con la Actividad
Hacer el Talk Actividad al fragmento de texto ]
Prueba de la aplicacin
26.Un Maestro Android estudio / Detalle Flujo Tutorial
El Android Maestro / Detalle de Flujo
Creacin de un maestro / detalle de Flujo de Actividad
La anatoma del Maestro / Detalle Plantilla de Flujo
Modificacin del Maestro / Detalle Plantilla de Flujo
Cambiar el modelo contenido
Cambio del panel Detalle
Modificacin de la Clase WebsiteDetailFragment
Adicin de permisos Manifest
Ejecutar la aplicacin
27.Creacin y administracin de desbordamiento Mens en Android Estudio
El men de desbordamiento
Creacin de un men de desbordamiento
Visualizacin de un men de desbordamiento
Respondiendo a Men Elemento Selecciones
Creacin de grupos de artculos checkable

Crear el proyecto Ejemplo


Modificacin del men Descripcin
Modificacin de la (Mtodo onOptionsItemSelected)
Prueba de la aplicacin

28.Animacin de interfaces de usuario en Android Studio usando el Marco Transiciones


Presentacin de Transiciones y escenas Android
Usando Interpoladores con transiciones
Trabajo con transiciones de escena
Transiciones y TransitionSets en cdigo personalizado
Transiciones y TransitionSets en XML personalizados
Trabajar con Interpoladores
Creacin de un interpolador personalizada
Utilizar el mtodo beginDelayedTransition
29.Un Android Estudio Transicin Tutorial usando beginDelayedTransition
Crear el proyecto Android Estudio TransitionDemo
Preparacin de los archivos de proyecto
Ejecucin beginDelayedTransition Animacin
Personalizacin de la Transicin
30.Ejecucin Escena Android Transiciones - Un Estudio Android Tutorial
Una visin general del Proyecto de Transicin de escena
Crear el proyecto SceneTransitions Android Estudio
Identificacin y Preparacin del contenedor raz
El diseo de la Primera Escena
El diseo de la Segunda Escena
Al entrar en la Primera Escena
Cargando Escena 2
La aplicacin de las transiciones
Agregar el archivo de Transicin
Cargando y Manejo del Set Transition
Configuracin de transiciones adicionales
31.Una visin general de Intenciones en Android Estudio
Una visin general de Intenciones
Intentos explcitos
Devolver datos a partir de una actividad
Intentos implcitos
El uso de Intencin Filtros
Comprobacin de Intencin disponibilidad
32.Intentos explcitos Android - Un Estudio Android Ejemplo
Creacin de la explcita intencin Ejemplo de Aplicacin
Disear el diseo de interfaz de usuario para ActivityA
Creacin de la segunda clase de actividad
Disear el diseo de interfaz de usuario para ActivityB
Revisando el archivo de manifiesto de aplicacin
Creacin de la Intencin
La extraccin de datos Intencin
Lanzamiento ActivityB como Sub-Actividad
Volviendo datos de un Sub-Actividad
Prueba de la aplicacin

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

44.Un proveedor de contenido de Android Estudio Ejemplo


Copia del proyecto de base de datos
Agregar el Proveedor Contenido del paquete
Creacin de la Clase Proveedor de Contenido
La construccin de la Autoridad y contenido URI
Implementar Matching URI en el Proveedor de Contenido
Implementacin del Proveedor de Contenido onCreate () Mtodo
La implementacin de la insercin Proveedor de Contenido Mtodo ()
La implementacin de la consulta Proveedor de Contenido Mtodo ()
La implementacin de la actualizacin Proveedor de Contenido Mtodo ()
Implementacin del Proveedor de Contenido eliminar Mtodo ()
Declarando el proveedor de contenido en el archivo de manifiesto
Modificacin de la base de datos Handler
45.Acceso Cloud Storage utilizando el Marco para un acceso de almacenamiento en Android Estudio
El Marco de Acceso de almacenamiento
Trabajando con el Marco de Acceso de almacenamiento
Listados de archivos Picker Filtrado
Manejo de Resultados Intencin
Leyendo el contenido de un archivo
Escritura de contenido a un archivo
Eliminacin de un archivo
Ganando acceso permanente a un archivo
46.Un Android Estudio Acceso de almacenamiento Marco Ejemplo
Sobre el ejemplo de almacenamiento de Acceso Marco
Crear el Acceso de almacenamiento Marco Ejemplo
El diseo de la interfaz de usuario
Declarando Solicitar Cdigos
Creacin de un archivo de almacenamiento nuevo
El onActivityResult (Mtodo)
Cmo guardar a un archivo de almacenamiento
Apertura y lectura de un archivo de almacenamiento
Prueba de la aplicacin de almacenamiento de acceso
47.Un Android Estudio VideoView y MediaController Tutorial
Al presentar el Android VideoView Clase
Al presentar el Android MediaController Clase
Prueba de reproduccin de vdeo
Creacin de la reproduccin de vdeo Ejemplo
Disear el VideoPlayer Layout

10

Configuracin del VideoView


Adicin de Permiso de Internet
Agregar el MediaController al vdeo Ver
Configuracin del onPreparedListener

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

Implementacin del Mtodo onActivityResult


Implementacin del Oyente Terminado Compra
Consumir el artculo comprado
Al soltar el IabHelper Instancia
Modificacin del archivo Security.java
Prueba de la aplicacin de facturacin en app
La construccin de una APK lanzamiento
Creacin de un nuevo En aplicacin del producto
La publicacin de la solicitud para el Canal de Distribucin Alfa
Adicin de cuentas de prueba de facturacin en app
Configuracin Testing Group
Resolucin de problemas con In-App de Compras [

56.Un panorama de Gradle en Android Estudio


Un panorama de Gradle
Gradle y Android Estudio
Predeterminados Sensible
Dependencias
Construir Las variantes
Entradas Manifest
APK Firma
Soporte ProGuard
El nivel superior Gradle Construir Archivo
Mdulo Nivel Gradle Archivos de creacin
Configuracin de los valores de firma en el fichero de construccin
Ejecucin de tareas Gradle desde la lnea de comandos
57.Un Android Estudio Gradle Construir Las variantes Ejemplo
Creacin de la Variante Ejemplo Proyecto Build
Adicin de los Sabores Build a la Build Mdulo Archivo
Adicin de los Sabores de la estructura del proyecto
Adicin de archivos de recursos de los Sabores
Prueba de los Sabores Complexin
Construir variantes y Archivos Clase
Adicin de paquetes a los Sabores Complexin
Personalizacin de las clases de actividad

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

2. La creacin de un equipo con Windows, Linux o Mac OS X


Android Ambiente Development Studio
Antes de cualquier trabajo puede comenzar en el desarrollo de una aplicacin para Android, el primer paso es
configurar un sistema informtico para que acte como la plataforma de desarrollo. Esto implica una serie de
etapas que consisten en la instalacin del Java Development Kit (JDK) y el Android Estudio Entorno Integrado
de Desarrollo (IDE), que tambin incluye el Kit de desarrollo de software de Android (SDK).
En este captulo se har cargo de los pasos necesarios para instalar los componentes necesarios para el
desarrollo de aplicaciones para Android en sistemas basados en Windows, Mac OS X y Linux.
Contenido

1 Requisitos del sistema

2 Instalacin del Java Development Kit (JDK)


o

2.1 Instalacin de Windows JDK

2.2 Instalacin de Mac OS X JDK

3 Instalacin Linux JDK

4 La descarga del paquete Android Estudio

5 Instalacin Android Estudio


o

5.1 Instalacin en Windows

5.2 Instalacin en Mac OS X

5.3 Instalacin en Linux

6 El Asistente para configuracin de Android Estudio

7 Instalacin de los ltimos paquetes SDK de Android

8 Hacer el SDK Herramientas de lnea de comandos Android Accesible


o

8.1 de Windows 7

8.2 de Windows 8.1

8.3 Linux

8.4 Mac OS X

9 Actualizacin del Estudio de Android y el SDK

10 Resumen

15

Requisitos Del Sistema


Desarrollo de aplicaciones Android se puede realizar en cualquiera de los siguientes tipos de sistemas:

Windows 2003 (32 bits o 64 bits)

Windows Vista (32 bits o 64 bits)

Windows 7 (32 bits o 64 bits)

Windows 8 / Windows 8.1

(Slo sistemas basados en Intel) Mac OS X 10.5.8 o posterior

Sistemas Linux con la versin 2.11 o posterior de GNU C Library (glibc)

Mnimo de 2 GB de RAM (4 GB se prefiere)

1,5 GB de espacio disponible en disco

Instalacin del Java Development Kit (JDK)


El SDK de Android fue desarrollado utilizando el lenguaje de programacin Java. Del mismo modo, las
aplicaciones de Android tambin se desarrollan utilizando Java. Como resultado, el Java Development Kit
(JDK) es el primer componente que se debe instalar.
Desarrollo de Android requiere la instalacin de cualquiera de las versiones 6 o 7 de la edicin estndar del
Kit de Desarrollo Java Platform. Java est disponible en el desarrollo (JDK) y tiempo de ejecucin de
paquetes (JRE). A los efectos del desarrollo de Android, el JDK debe ser instalado.

Instalacin de Windows JDK


Para los sistemas Windows, el JDK se puede obtener de la pgina web de Oracle Corporation utilizando el
siguiente URL:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Suponiendo que un JDK adecuado no est instalado en su sistema, descargue el ltimo paquete JDK que
coincida con el sistema de ordenador de destino. Una vez descargado, ejecute el archivo ejecutable de
instalacin y siga las instrucciones en pantalla para completar el proceso de instalacin.

La instalacin de Mac OS X JDK


Java no est instalado de forma predeterminada en las ltimas versiones de Mac OS X. Para confirmar la
presencia o no de la versin Java que est instalado, abra una ventana de terminal y escriba el siguiente
comando:
java -version

Suponiendo que Java est instalado actualmente, una salida similar a la siguiente aparecer en la ventana de
terminal:

16

java version "1.7.0_71"


Java (TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot (TM) 64-Bit Servidor VM (build 24.71-b01, modo mixto)

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

Instalacin de Linux JDK


En primer lugar, si el sistema de desarrollo elegido est ejecutando la versin de 64 bits de Ubuntu, entonces
es esencial que se instalar el paquete de soporte de biblioteca de 32 bits:
sudo apt-get install ia32-libs

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.

La descarga del paquete Android Estudio


La mayor parte del trabajo involucrado en el desarrollo de aplicaciones para Android se realizarn utilizando el
entorno Android Studio. Estudio Android se puede descargar de la siguiente pgina web:
http://developer.android.com/sdk/index.html
Desde esta pgina, o bien haga clic en el botn de descarga si se enumera la plataforma correcta (por
ejemplo en un navegador web basado en Windows en el botn leer "Download Android Studio for
Windows"), o seleccione el enlace "Otras Opciones de descarga" para seleccionar manualmente el paquete
adecuado para su plataforma y sistema operativo. En la siguiente pantalla, acepte los trminos y condiciones
para iniciar la descarga.

18

Instalar Android Estudio


Una vez descargado, los pasos exactos para instalar Android estudio difieren en funcin del sistema operativo
en el que se est realizando la instalacin.

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

descomprimir / <ruta de acceso al paquete> / android-studio-Lo ideal <versin> -linux.zip

Tenga en cuenta que el paquete Android estudio se instalar en un android-estudio sub-directorio


llamado. Suponiendo, pues, que el comando anterior fue ejecutado en / home / demo, los paquetes de
software se descomprime en / home / demo / android-estudio.
Para lanzar Android Studio, abra una ventana de terminal, cambie el directorio a la / subdirectorio bin android studio y ejecutar el siguiente comando:
./studio.sh

El Asistente para configuracin de Android Estudio


La primera vez que Android Studio se puso en marcha despus de haber sido instalado, aparecer un dilogo
que proporciona la opcin de importar la configuracin de una versin anterior de Android Studio. Si usted
tiene la configuracin de una versin anterior y desea importarlos en la ltima instalacin, seleccione la opcin
y ubicacin adecuada. Por otra parte, indica que no es necesario importar cualquier configuracin anterior y
haga clic en el botn Aceptar para continuar.
Despus de Android Studio ha terminado de cargar, aparecer el asistente de configuracin, como se
muestra en la Figura 2-3.

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

Instalacin de los ltimos paquetes SDK de Android


Los pasos realizados hasta ahora han instalado Java, Android Studio IDE y el conjunto actual de paquetes
SDK Android por defecto. Antes de continuar, vale la pena tomar algn tiempo para verificar que estn
instalados los paquetes e instalar los paquetes que faltan.
Esta tarea se puede realizar mediante el Administrador de SDK de Android, que puede ser lanzado desde
dentro de la herramienta Android Estudio seleccionando Configurar el -> opcin SDK Manager desde dentro
del dilogo de bienvenida Android Studio. Una vez que se invoca, la herramienta Manager SDK aparecer
como se ilustra en la Figura 2-3:

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:

Herramientas> Herramientas del SDK de Android

Herramientas> Android SDK Platform-herramientas

Herramientas> SDK Android acumulacin de herramientas

Platform SDK (versin ms reciente)> Platform SDK

Platform SDK (versin ms reciente)> ARM EABI Sistema v7a Imagen

23

Extras -> Android Ayuda Repositorio

Extras> Android Soporte Biblioteca

Extras -> Google Repositorio

Extras -> USB Driver Google (Requerido en los sistemas Windows solamente)

Extras> Intel x86 emulador Acelerador (instalador HAXM)

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.

Hacer el SDK Herramientas de lnea de comandos Android Accesible


La mayora de las veces, se puede acceder las herramientas fundamentales de la SDK de Android desde el
entorno de Android Studio. Dicho esto, sin embargo, tambin habr casos en los que ser til para poder
invocar esas herramientas desde una lnea de comandos o ventana de terminal. Para que el sistema
operativo en el que est desarrollando para ser capaz de encontrar estas herramientas, ser necesario aadir
a la variable de entorno PATH del sistema.
Independientemente del sistema operativo, la variable PATH debe configurarse para incluir las siguientes
rutas (donde <path_to_android_sdk_installation> representa la ubicacin del sistema de archivos en el que se
instal el SDK):
<path_to_android_sdk_installation> / sdk / herramientas
<path_to_android_sdk_installation> / sdk / plataforma de herramientas

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

Actualizacin del Estudio de Android y el SDK


De vez en cuando las nuevas versiones de Android Studio y el SDK de Android se liberan. Las nuevas
versiones del SDK se instalan mediante el Administrador de Android SDK. Android Studio normalmente le
notifique cuando una actualizacin est listo para ser instalado.
Para comprobar manualmente si hay actualizaciones de Android Studio, haga clic en el Buscar
actualizaciones ahora conexin situado en la parte inferior de la pantalla de bienvenida Android de estudio, o
utilizar la Ayuda -> Buscar actualizaciones ... opcin de men accesible desde dentro de la ventana principal
de Android Studio.

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

3. Creacin de una aplicacin Android en Android Ejemplo


Estudio
Los captulos anteriores de este libro han cubierto los pasos necesarios para configurar un entorno adecuado
para el desarrollo de aplicaciones de Android utilizando el IDE Android Studio. Antes de pasar a los temas un
poco ms avanzados, ahora es un buen momento para validar que todos los paquetes de desarrollo
necesarios estn instalados y funcionando correctamente. La mejor manera de lograr este objetivo es la
creacin de una aplicacin para Android y compilar y ejecutarlo. En este captulo se cubrir la creacin de un
proyecto de aplicacin de Android simple usando Android Studio. Una vez que el proyecto ha sido creado, un
captulo posterior explorar el uso del medio ambiente emulador de Android para realizar una prueba de
funcionamiento de la aplicacin.
Contenido

1 Creacin de un nuevo proyecto de Android

2 Definicin de la configuracin del proyecto y SDK

3 Creacin de una Actividad

4 Modificar el ejemplo de aplicacin

5 Revisin de los archivos de diseo y Recursos

6 Vista previa de la Disposicin

7 Resumen

Creacin de un nuevo proyecto de Android


El primer paso en el proceso de desarrollo de aplicaciones es crear un nuevo proyecto en el entorno Android
Studio. Comienza, por lo tanto, con el lanzamiento de Android Estudio para que aparezca la pantalla
"Bienvenido a Android Studio", como se ilustra en la Figura 3-1:

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

Definicin de la configuracin del proyecto y SDK


En la ventana Nuevo proyecto, establezca el campo Nombre de la aplicacin de AndroidSample. El nombre
de la aplicacin es el nombre con el que se har referencia a la solicitud e identificado en Android Studio y es
tambin el nombre que se utilizar cuando la solicitud completa sale a la venta en la tienda de Google Play.
El nombre del paquete se utiliza para identificar de forma exclusiva la aplicacin dentro del ecosistema de
aplicaciones para Android. Debe basarse en la URL invertida de su nombre de dominio seguido del nombre
de la aplicacin. Por ejemplo, si su dominio es www.mycompany.com, y la aplicacin ha sido nombrado
AndroidSample, a continuacin, el nombre del paquete se puede especificar como sigue:
com.mycompany.androidsample

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.

Creacin de una Actividad


El siguiente paso es definir el tipo de actividad inicial que se va a crear para la aplicacin. Una gama de
diferentes tipos de actividades est disponible en el desarrollo de aplicaciones de Android. La opcin Master
Flow / detalle ser cubierto en un captulo posterior. Para los fines de este ejemplo, sin embargo, slo tiene
que seleccionar la opcin de crear una actividad en blanco.

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.

Modificacin del Ejemplo de Aplicacin


En este punto, Android Studio ha creado un proyecto mnimo ejemplo de aplicacin y ha abierto el proyecto
principal.
El proyecto y las referencias a los archivos asociados de nueva creacin se enumeran en la ventana de
herramientas del proyecto se encuentra en la parte izquierda de la ventana principal del proyecto. La ventana
de la herramienta de proyecto tiene varios modos en los que la informacin puede ser representada. De forma
predeterminada, este panel estar en modo Android. Este ajuste es controlado por el men desplegable en la
parte superior del panel como se destaca en la figura 3-6. Si el panel no est en modo de Android, haga clic
en este men y cambiar al modo de Android:

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.

Revisin de los archivos de diseo y Recursos


Antes de pasar al siguiente captulo, vamos a mirar algunos de los aspectos internos de diseo de la interfaz
de usuario y el manejo de recursos. En la seccin anterior, hemos hecho algunos cambios en la interfaz de
usuario mediante la modificacin del archivo activity_android_sample.xml utilizando la herramienta Diseador
de interfaz de usuario. De hecho, todo lo que el diseador estaba haciendo era proporcionar una manera fcil
de usar para editar el contenido XML subyacente del archivo. En la prctica, no hay ninguna razn por la que
no se puede modificar el cdigo XML directamente con el fin de hacer cambios en la interfaz de usuario y, en
algunos casos, en realidad esto puede ser ms rpido que el uso de la herramienta Diseador. En la parte
inferior del panel Designer son dos pestaas Diseo y texto marcadas respectivamente. Para cambiar a la
vista XML slo tiene que seleccionar la ficha Texto como se muestra en la Figura 3-13:

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:

<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 = ". AndroidSampleActivity"
android: fondo = "# ff2438">

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

=
=
=
=

"nombre_apl"> AndroidSample </ string>


"hello_world"> Hola, mundo! </ String>
"action_settings"> Configuracin </ string>
"welcomestring"> Bienvenido a Android Estudio </ string>

</ 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.

Vista previa del diseo


Hasta ahora, en este captulo, la disposicin slo se ha visto previamente en una representacin del
dispositivo Nexus 4. Como se mencion anteriormente, el diseo puede ser probado para otros dispositivos al

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

4. Un recorrido por la interfaz de usuario de Android


Estudio
Si bien es tentador para sumergirse en ejecutar la aplicacin de ejemplo creada en el captulo anterior, el
hacerlo implica el uso de los aspectos de la interfaz de usuario de Android estudio que se describe mejor por
adelantado. Android Studio es un entorno de desarrollo potente y rica caracterstica que es, en gran medida,
de uso intuitivo. Dicho esto, tomando el tiempo para familiarizarse con el diseo y la organizacin de la
interfaz de usuario de Android Estudio acortar considerablemente la curva de aprendizaje en los ltimos
captulos del libro. Con esto en mente, este captulo ofrecer una visin general inicial de las distintas reas y
componentes que conforman el entorno Android Studio.
Contenido

1 La pantalla de bienvenida

2 La ventana principal

3 La herramienta de Windows

4 Mtodos abreviados de teclado Android Studio

5 Switcher y archivos recientes Navegacin

6 Cambiar el tema Android Estudio

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

Los diversos elementos de la ventana principal se pueden resumir como sigue:

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

Al seleccionar un elemento en el men de acceso rpido har que la ventana de la herramienta


correspondiente que aparezca en la ventana principal.
Por otra parte, un conjunto de barras de la ventana de la herramienta se puede visualizar haciendo clic en el
icono de men de acceso rpido en la barra de estado. Estas barras aparecen a lo largo de la izquierda,
derecha e inferior bordes de la ventana principal (como indican las flechas en la Figura 4-5) y contienen
botones para mostrar y ocultar cada una de las ventanas de herramientas.Cuando se muestran los barrotes
de la ventana de herramientas, un segundo clic en el botn en la barra de estado ocultarlos.

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.

Mensajes - La herramienta de mensajes de registros de las ventanas de salida del sistema de


construccin de Gradle (Gradle es el sistema subyacente utilizado por Android Estudio para la
construccin de las diferentes partes de los proyectos en unas aplicaciones ejecutables) y puede ser til
para identificar las causas de los problemas de compilacin al compilar proyectos de .

Android - La ventana de herramientas Android proporciona acceso al sistema de depuracin


Android. Dentro de esta ventana tareas como la salida del registro de vigilancia de una aplicacin que se
ejecuta, tomar capturas de pantalla y vdeos de la aplicacin, la detencin de un proceso y la realizacin
de tareas bsicas de depuracin se puede realizar.

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.

Monitor de la memoria - Se conecta a la ejecucin de aplicaciones de Android y las estadsticas de uso


de memoria monitores en forma de un grfico en tiempo real.

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.

Atajos de teclado Android Studio


Android Studio incluye una gran cantidad de atajos de teclado diseados para ahorrar tiempo al realizar
tareas comunes. Un listado completo mapa de teclas de acceso directo del teclado se puede ver e imprimir
desde dentro de la ventana del proyecto Android Estudio seleccionando la Ayuda -> opcin de men de
referencia por defecto de configuracin de teclado.

Switcher y archivos recientes Navegacin


Otro mecanismo til para navegar dentro de la ventana principal de Android estudio implica el uso de la
Switcher. Se accede a travs de la combinacin de teclas Ctrl-Tab, el conmutador aparece como un panel de
lista tanto las ventanas de herramientas y archivos actualmente abiertos (Figura 4-7).

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

Cambiar el tema Android Estudio


El tema general del entorno Android estudio se puede cambiar ya sea desde la pantalla de bienvenida con el
Configuracin -> Configuracin de la opcin, o por medio del Archivo -> Configuracin ... opcin de men de
la ventana principal. Una vez que aparezca el dilogo de configuracin, seleccione la opcin Apariencia en el
panel de la izquierda y luego cambiar la configuracin del men del tema antes de hacer clic en el botn
Aplicar. Los temas disponibles en la actualidad consisten en IntelliJ, Windows y Darcula. Figura 4-9 muestra
un ejemplo de la ventana principal con el tema seleccionado Darcula:

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

5. Creacin de un dispositivo virtual de Android (AVD)


en Android Estudio
En el curso de desarrollo de aplicaciones de Android en Android estudio ser necesario para compilar y
ejecutar una aplicacin varias veces. Una aplicacin para Android puede ser probado por la instalacin y
ejecucin que sea en un dispositivo fsico o en un dispositivo virtual (AVD) Entorno emulador de
Android. Antes de que una AVD se puede utilizar, primero debe ser creado y configurado para que coincida
con la especificacin de un modelo de telfono. El objetivo de este captulo, por lo tanto, es trabajar a travs
de los pasos necesarios para crear un dispositivo virtual, utilizando la tableta Nexus 7 como un ejemplo de
referencia.
Contenido

1 Dispositivos virtuales Acerca Android

2 Creacin de una nueva AVD

3 Iniciar el emulador

4 Ejecutar la aplicacin en el AVD

5 Ejecutar / Depurar Configuraciones

6 Detener una aplicacin en ejecucin

7 de lnea de comandos AVD Creacin

8 Android dispositivo virtual de archivos de configuracin

9 Mover y Cambiar el nombre de un dispositivo virtual de Android

10 Resumen

Acerca de los dispositivos virtuales Android


AVDs son esencialmente emuladores que permiten a las aplicaciones de Android a ensayar sin la necesidad
de instalar la aplicacin en un dispositivo basado en Android fsica. Un AVD puede estar configurado para
emular una variedad de caractersticas de hardware incluyendo opciones tales como tamao de pantalla,
capacidad de memoria y la presencia o no de caractersticas tales como una cmara, soporte de navegacin
GPS o un acelermetro. Como parte de la instalacin estndar de Android de estudio, una serie de plantillas
emulador

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

Creacin de un nuevo AVD


Con el fin de probar el comportamiento de una aplicacin, ser necesario crear un AVD para una
configuracin de dispositivo Android especfico.
Para crear una nueva AVD, el primer paso es poner en marcha el Administrador de AVD. Esto se puede
lograr desde el entorno de Android Estudio seleccionando las Herramientas -> Android -> opcin de men
AVD Manager desde dentro de la ventana principal. Alternativamente, la herramienta puede ser lanzado
desde una terminal o de lnea de comandos con el siguiente comando:
avd androide

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.

Inicio del emulador


Para llevar a cabo una prueba de funcionamiento del emulador AVD de nueva creacin, slo tiene que
seleccionar el emulador desde el Administrador de AVD y haga clic en el botn de inicio (el tringulo verde en
la columna Acciones), seguido por el lanzamiento en el dilogo de Opciones de lanzamiento resultante. El
emulador aparecer en una nueva ventana y, despus de un corto perodo de tiempo, el logotipo de
"androide" aparecer en el centro de la pantalla. La primera vez que el emulador se ejecuta, puede tardar
hasta 10 minutos para que el emulador se cargue por completo y empezar. En las invocaciones posteriores,

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.

Ejecutar la aplicacin en el AVD


Con un emulador AVD configurado, el ejemplo de aplicacin AndroidSample creado en el captulo anterior ya
se puede compilar y ejecutar. Con el proyecto AndroidSample cargado en Android de estudio, simplemente
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 5-5 a continuacin, seleccione Ejecutar -> opcin Ejecutar ...
del men o utilizar las teclas Shift + F10 atajo de teclado:

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

Si surgen problemas durante el proceso de lanzamiento, la herramienta Ejecutar proporcionar informacin


que se espera ayude a aislar la causa del problema.
Suponiendo que se carga la aplicacin en el emulador y se ejecuta como se esperaba, se han verificado con
seguridad que el entorno de desarrollo de Android est instalado y configurado correctamente.

Ejecutar / Depurar Configuraciones


Un proyecto en particular se puede configurar de tal manera que un dispositivo o emulador especfico se
utiliza de forma automtica cada vez que se ejecuta desde Android Studio. Esto evita la necesidad de hacer
una seleccin en el selector de dispositivo cada vez que se ejecuta la aplicacin. Revisar y modificar la
configuracin Ejecutar / Depurar, haga clic en el botn situado a la izquierda del botn de carreras en la barra
de herramientas de Android Studio y seleccione Editar Configuraciones ... opcin en el men resultante:

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

Detener una aplicacin en ejecucin


Cuando la construccin y ejecucin de una aplicacin con fines de prueba, cada vez que una nueva revisin
de la aplicacin se compila y ejecuta, la instancia anterior de la aplicacin que se ejecuta en el dispositivo o
emulador se dar por terminado de forma automtica y se reemplaza con la nueva versin. Tambin es
posible, sin embargo, para detener manualmente una aplicacin que se ejecuta desde dentro Android Studio.
Para detener una aplicacin ejecutndose, comience por mostrar la ventana de herramientas de Android, ya
sea usando el botn de la barra de la ventana, o por medio del men de acceso rpido (invocada por mover el
puntero del ratn sobre el botn en la esquina izquierda de la barra de estado, como se muestra en la Figura
5 -11).

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

De lnea de comandos AVD Creacin


Como se discuti previamente, adems de la interfaz grfica de usuario tambin es posible crear un nuevo
AVD directamente desde la lnea de comandos. Esto se logra con la funcin androide junto con algunas
opciones de lnea de comandos. Una vez iniciada, la herramienta solicitar informacin adicional antes de la
creacin de la nueva AVD.
Suponiendo que el sistema se ha configurado de tal manera que el directorio de herramientas del SDK de
Android est incluido en la variable de entorno PATH, una lista de objetivos disponibles para el nuevo AVD se
puede obtener emitiendo el siguiente comando en una ventana de terminal o el comando:
objetivos lista android

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,

La sintaxis para la creacin de AVD es como sigue:


Android crear avd -n <nombre> -t <targetID> [- <option> <valor>]

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

Android eliminar avd -n <avd nombre>

Archivos de configuracin de dispositivo virtual de Android


De forma predeterminada, los archivos asociados a un AVD se almacenan en el subdirectorio .android / avd
de directorio personal del usuario, cuya estructura es la siguiente (donde <avd name> se sustituye por el
nombre asignado a la AVD):
<Nombre avd> .avd / config.ini
<Avd nombre> .avd / userdata.img
<Nombre avd> .ini

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.

Mover y cambiar el nombre de un dispositivo virtual de Android


El nombre actual o la ubicacin de los archivos de AVD pueden alterarse desde la lnea de comandos
utilizando el argumento movimiento avd de la herramienta androide. Por ejemplo, para cambiar el nombre de
una AVD llamado Nexus7 a Nexus7B, el siguiente comando se puede ejecutar:
android movimiento avd -n -r Nexus7 Nexus7B

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

6. Prueba Android Apps Estudio en un dispositivo


Android Fsica

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

1 Una visin general del Android depuracin Bridge (ADB)

2 Activacin de ADB en Android 5.0 dispositivos basados


o

2.1 Mac OS X configuracin ADB

2.2 Configuracin de Windows ADB

3 Prueba de la conexin de adb

4 Resumen

Una visin general del Android depuracin Bridge (ADB)


El propsito principal de la ADB es facilitar la interaccin entre un sistema de desarrollo, en este caso Android
de estudio, y ambos emuladores AVD y dispositivos Android fsicas a efectos de funcionamiento y depurar
aplicaciones.
El Banco Asitico de Desarrollo se compone de un cliente, un proceso de servidor que se ejecuta en segundo
plano en el sistema de desarrollo y un proceso de fondo demonio que se ejecuta en cualquiera de AVDs o
dispositivos Android reales tales como telfonos y tabletas.
El cliente ADB puede tomar una variedad de formas. Por ejemplo, un cliente se proporciona en forma de una
herramienta de lnea de comandos denominada adb ubicado en el subdirectorio de plataforma-herramientas
SDK de Android. Del mismo modo, Android Studio tambin tiene un cliente incorporado.
Una variedad de tareas se puede realizar mediante la herramienta de lnea de comandos adb. Por ejemplo,
una lista de los dispositivos virtuales o fsicos activos actualmente se puede obtener con el argumento de
dispositivos de lnea de comandos. La siguiente salida de comando indica la presencia de una AVD en el
sistema pero no hay dispositivos fsicos:

70

$ adb devices
Lista de dispositivos conectados
dispositivo emulador-5554

Habilitacin de ADB en Android 5.0 dispositivos basados


Antes de ADB se puede conectar a un dispositivo Android, ese dispositivo primero debe estar configurado
para permitir la conexin. En los dispositivos de telfonos y tabletas con Android 5.0 o posterior, los pasos
para lograr esto son los siguientes:
1. Abra la configuracin de la aplicacin en el dispositivo y seleccione la tableta Acerca de Acerca de opcin o
telfono.
2. En la pantalla Acerca de, desplcese hasta el campo del nmero de Build (Figura 6-1) y puntee en l siete
veces hasta que aparezca un mensaje indicando que el modo de programador se ha habilitado.

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.

Mac OS X configuracin ADB


Con el fin de configurar el entorno de ADB en un sistema Mac OS X, conecte el dispositivo al sistema de
computadora con un cable USB, abra una ventana de terminal y ejecute el siguiente comando:
adb actualizacin 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

Lista de dispositivos conectados


Dispositivo 015d41d4454bf80c

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.

Configuracin de Windows ADB


El primer paso para configurar un sistema de desarrollo basado en Windows para conectarse a un dispositivo
Android usando ADB es instalar los controladores USB correspondientes en el sistema.En el caso de algunos
dispositivos, el controlador USB Google debe estar instalado (una lista completa de dispositivos compatibles
con el controlador USB Google se puede encontrar en lnea enhttp://developer.android.com/sdk/winusb.html ).
Para instalar este controlador, realice los siguientes pasos:
1. Inicie Android Studio y abra el Administrador de SDK de Android, ya sea seleccionado Configurar -> Gestor
de SDK de la pantalla de bienvenida, o el uso de las Herramientas -> Android -> SDK opcin de men
Administrador

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

Regreso al Administrador de dispositivos y tenga en cuenta que el dispositivo ya no aparece en Otros


dispositivos y ahora se clasifica como un ADB Composite interfaz Android. Figura 6-8, por ejemplo, muestra la
entrada del dispositivo para una tableta Nexus 7 usando el controlador USB Google.

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

Si el dispositivo todava no est en la lista, trate de ejecutar el siguiente comando:


adb actualizacin de Android

Tenga en cuenta que tambin puede ser necesario reiniciar el sistema.

Prueba de la conexin de adb


Suponiendo que la configuracin adb ha tenido xito en su plataforma de desarrollo elegido, el siguiente paso
es tratar de ejecutar la aplicacin de prueba creada en el captulo Creacin de una aplicacin para Android
Ejemplo en Android Studio en el dispositivo.
Lanzamiento Android Studio, abra el proyecto AndroidSample y, una vez que el proyecto se haya cargado,
haga clic en el botn de ejecucin se encuentra en la barra de herramientas Android Studio (Figura 6-10).

Figura 6-10

Suponiendo que el proyecto no ha sido previamente configurado para ejecutarse automticamente en un


entorno emulador, el cuadro de dilogo Seleccionar dispositivo aparecer con el dispositivo Android
conectado aparece como un dispositivo en ejecucin. Figura 6-11, por ejemplo, enumera un dispositivo Nexus
7 como un objetivo adecuado para instalar y ejecutar la aplicacin.

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

7. Los fundamentos de la Android Estudio Editor de


cdigo
Desarrollo de aplicaciones para Android implica una cantidad considerable de trabajo de programacin que,
por definicin, implica escribir, revisar y modificar las lneas de cdigo. No debera ser ninguna sorpresa que
la mayora del tiempo de un programador dedicado al uso de Android Studio suelen involucrar a la edicin de
cdigo dentro de la ventana del editor.
El editor de cdigo moderno tiene que ir mucho ms all de los fundamentos originales de escribir, borrar,
cortar y pegar. Hoy en da la utilidad de un editor de cdigo se mide generalmente por factores tales como la
cantidad en que se reduce la tipificacin requerida por el programador, la facilidad de navegacin a travs de
grandes archivos de cdigo fuente y la capacidad del editor para detectar y poner de relieve los errores de
programacin en tiempo real, como se est escribiendo el cdigo. Como se har evidente en este captulo,
estas son slo algunas de las reas en las que el editor de Android Estudio sobresale.
Aunque no es un panorama exhaustivo de las caractersticas del editor de Android de estudio, este captulo
tiene como objetivo proporcionar una gua de las principales caractersticas de la herramienta. Programadores
experimentados encontrarn que algunas de estas caractersticas son comunes a la mayora de los editores
de cdigo disponible en la actualidad, mientras que un nmero son exclusivas de este entorno de edicin en
particular.
Contenido

1 El Android Studio Editor

2 Dividir la ventana del editor

3 Cdigo de finalizacin

4 Finalizacin de instrucciones

5 Informacin de parmetros

6 Generacin de cdigo

7 Cdigo plegable

8 Bsqueda de Documentacin Rpida

9 Cdigo reformateo

10 Resumen

El Android Studio Editor


El editor de Android estudio aparece en el centro de la ventana principal cuando se selecciona una de Java,
XML u otro archivo de texto para su edicin. Figura 7-1, por ejemplo, muestra una sesin tpica con un editor
de archivo de cdigo fuente de Java cargado:

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.

La divisin de la ventana del editor


Por defecto, el editor mostrar un nico panel que muestra el contenido del archivo seleccionado. Una
caracterstica particularmente til cuando se trabaja simultneamente con mltiples archivos de cdigo fuente
es la capacidad de dividir el editor en varios paneles. Para dividir el editor, haga clic en una pestaa archivo
dentro de la ventana del editor y seleccione la vertical de Split o la opcin de men Dividir
horizontalmente. Figura 7-5, por ejemplo, muestra el divisor en la accin con la divisin editor en tres paneles:

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

Bsqueda de Documentacin Rpida


Contexto Java sensible y documentacin de Android se puede acceder mediante la colocacin del cursor
sobre la declaracin para el que se requiere documentacin y pulsando la combinacin de teclas Ctrl-Q (Ctrl-J
en Mac OS X). Esto mostrar una ventana emergente que contiene la documentacin de referencia pertinente
para el artculo. Figura 7-15, por ejemplo, muestra la documentacin de la clase Menu Android.

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

8. Una visin general de la arquitectura de Android


(Android Studio)
Hasta ahora, en este libro, se han tomado medidas para establecer un entorno adecuado para el desarrollo
de aplicaciones Android que utilizan Android Studio. Un paso inicial tambin se ha tenido en el proceso de
desarrollo de aplicaciones a travs de la creacin de un proyecto de aplicacin de Android Estudio simple.
Antes de ahondar an ms en las cuestiones prcticas de desarrollo de aplicaciones de Android, sin
embargo, es importante obtener una comprensin de algunos de los conceptos ms abstractos, tanto del SDK
de Android y el desarrollo de Android en general. Ganando una comprensin clara de estos conceptos ahora
proporcionar una base slida sobre la que construir nuevos conocimientos.Comenzando con una visin
general de la arquitectura de Android en este captulo, y continuando en los prximos captulos de este libro,
el objetivo es proporcionar una visin detallada de los fundamentos del desarrollo de Android.
Contenido

1 El Android Software Stack

2 El kernel de Linux

3 Runtime Android - ART

4 Bibliotecas Android
o

4.1 C / C ++ Bibliotecas

5 Application Framework

6 Aplicaciones

7 Resumen

El Android Software Stack


Android est estructurado en forma de una pila de software que comprende aplicaciones, un sistema
operativo, entorno de tiempo de ejecucin, middleware, servicios y bibliotecas. Esta arquitectura puede, tal
vez, el mejor representarse visualmente como se indica en la Figura 8-1. Cada capa de la pila, y los
elementos correspondientes dentro de cada capa, son altamente integrado y cuidadosamente afinado para
proporcionar el desarrollo de la aplicacin ptima y entorno de ejecucin para dispositivos mviles.

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.

Runtime Android - ART


Cuando una aplicacin para Android est construido dentro de Android estudio se compila en un formato de
cdigo de bytes intermedio (denominado formato DEX). Cuando la aplicacin se carga posteriormente en el
dispositivo, el tiempo de ejecucin de Android (ART) utiliza un proceso denominado Ahead-de-tiempo (AOT)
Compilacin de traducir el cdigo de bytes a las instrucciones nativas requeridas por el procesador del
dispositivo. Este formato se conoce como ejecutable y Formato enlazable (ELF).
Cada vez que la aplicacin se inicia posteriormente, la versin ejecutable ELF se ejecuta, lo que resulta en el
rendimiento de aplicaciones ms rpido y una mejor duracin de la batera.
Esto contrasta con el enfoque de compilacin Just-in-Time (JIT) que se utiliza en las implementaciones
Android mayores por lo que el cdigo de bytes se tradujo en una mquina virtual (VM) cada vez que se lanza
la aplicacin.

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.content - Facilita el acceso al contenido, la edicin y la mensajera entre aplicaciones y


componentes de aplicaciones.

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.media - Proporciona clases para permitir la reproduccin de audio y vdeo.

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.util - Un conjunto de clases de utilidad para la realizacin de tareas como la cadena y la


conversin de nmero, el manejo de XML y la fecha y la manipulacin del tiempo.

android.view - Los bloques fundamentales de las interfaces de usuario de aplicaciones de construccin.

android.widget - Una rica coleccin de componentes de interfaz de usuario pre-construidos, como


botones, etiquetas, las vistas de lista, los administradores de diseo, botones de radio, etc.

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.

Telefona Gerente - Proporciona informacin a la aplicacin de los servicios telelphony disponibles en el


dispositivo, tales como informacin de estado y abonado.

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

9. La Anatoma de una aplicacin Android Android


Estudio
Independientemente de sus experiencias de programacin anteriores, ya sea Windows, Mac OS X, Linux o
incluso iOS basado, las posibilidades son buenas de que el desarrollo de Android es muy diferente a
cualquier cosa que hayas visto antes. El objetivo de este captulo, por lo tanto, es proporcionar una
comprensin de los conceptos de alto nivel detrs de la arquitectura de aplicaciones de Android. Al hacer
esto, vamos a explorar en detalle tanto los diversos componentes que pueden ser utilizados para construir
una aplicacin y los mecanismos que permiten a stos a trabajar juntos para crear una aplicacin coherente.
Contenido

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 para Android

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

10. Entender Aplicacin para Android


Lifecycles (Android Studio)

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

1 Aplicaciones para Android y Gestin de


Recursos

2 Estados Android Proceso


o

2.1 Proceso de primer plano

2.2 Proceso Visible

2.3 Proceso de Servicio

2.4 Proceso de fondo

2.5 Proceso de vaco

3 dependencias entre procesos

4 El ciclo de vida de Actividad

5 La Actividad Pila

6 Actividad Unidos

7 cambios de configuracin

8 Manejo de cambio de estado

9 Resumen

102

Aplicaciones para Android y Gestin de Recursos


Cada aplicacin Android corriendo es visto por el sistema operativo como un proceso independiente. Si el
sistema identifica que los recursos del dispositivo estn llegando a la capacidad que tomar las medidas
necesarias para poner fin a los procesos para liberar memoria.
Al hacer una determinacin en cuanto a que el proceso para terminar con el fin de liberar memoria, el sistema
tiene en cuenta tanto la prioridad y el estado de todos los procesos que se estn ejecutando, la combinacin
de estos factores para crear lo que se conoce por Google como una jerarqua de importancia. Los procesos
se termina entonces comenzando con la prioridad ms baja y trabajar en la jerarqua hasta que los recursos
suficientes han sido liberados para que el sistema funcione.

Estados Proceso Android


Procesos aplicaciones host y aplicaciones estn formados por componentes. Dentro de un sistema Android,
el estado actual de un proceso se define por el componente activo de ms alto rango dentro de la aplicacin
que alberga. Como se indica en la Figura 10-1, un proceso puede estar en uno de los siguientes cinco
estados en un momento dado:

Figura 10-1

Proceso de primer plano


Estos procesos se les asigna el ms alto nivel de prioridad. En cualquier momento, hay poco probable que
sea ms de uno o dos procesos en primer plano activo y por lo general son los ltimos en ser terminado por el
sistema. Un proceso debe cumplir con uno o ms de los siguientes criterios para calificar la condicin de
primer plano:

103

Hosts una actividad con la que el usuario est interactuando.

Hosts un servicio conectado a la actividad con la que el usuario est interactuando.

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.

Dependencias entre procesos


La situacin con respecto a la determinacin del proceso de prioridad ms alta es un poco ms compleja de lo
que se indica en el apartado anterior por la sencilla razn de que los procesos a menudo pueden ser
interdependientes. Como tal, al hacer una determinacin en cuanto a la prioridad de un proceso, el sistema
Android tambin tiene en cuenta si el proceso es de alguna manera servir otro proceso de mayor prioridad
(por ejemplo, un proceso de servicio que acta como el proveedor de contenido para una procesos en primer
plano). Como regla bsica, la documentacin Android establece que un proceso no puede ser clasificado ms
bajo que otro proceso que actualmente est sirviendo.

El Ciclo de Vida de Actividad


Como hemos determinado previamente, el estado de un proceso de Android se determina en gran parte por
el estado de las actividades y componentes que forman la aplicacin que lo aloja. Es importante entender, por

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:

Activo / Running - La actividad es en la parte superior de la Actividad industrial, es la tarea de primer


plano visible en la pantalla del dispositivo, tiene centrar y actualmente est interactuando con el
usuario. Esta es la actividad menos probable que se concluyan en caso de escasez de recursos.

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.

Los cambios de configuracin


Hasta ahora, en este captulo, hemos visto dos de las causas para el cambio de estado de una actividad de
Android, es decir, el movimiento de una actividad entre el primer plano y el fondo, y la terminacin de una
actividad por el sistema de ejecucin con el fin de liberar la memoria. De hecho, hay un tercer escenario en el
que el estado de una actividad puede cambiar dramticamente y esto implica un cambio en la configuracin
del dispositivo.
De forma predeterminada, cualquier cambio de configuracin que afecta a la apariencia de una actividad (por
ejemplo, la rotacin de la orientacin del dispositivo entre el retrato y el paisaje, o cambiar una configuracin
de fuentes del sistema) har que la actividad sea destruido y recreado. El razonamiento detrs de esto es que
tales cambios afectan a recursos tales como el diseo de la interfaz de usuario y simplemente destruir y
volver a crear actividades impactado es la forma ms rpida para una actividad para responder al cambio de
configuracin.

106

Manipulacin de cambio de estado


Si nada ms, debe ser claro en este captulo que una aplicacin y, por definicin, los componentes contenidos
en el mismo pasar a travs de muchos estados durante el curso de su vida til. De particular importancia es
el hecho de que se impongan estos cambios de estado (hasta e incluyendo la terminacin completa) de la
aplicacin por el tiempo de ejecucin de Android sujeto a las acciones del usuario y de la disponibilidad de
recursos en el dispositivo.
En la prctica, sin embargo, estos cambios de estado no se impusieron por completo sin previo aviso y una
solicitud sern, en la mayora de circunstancias, sern notificados por el sistema de ejecucin de los cambios
y se les da la oportunidad de reaccionar en consecuencia. Esto suele implicar el ahorro o la restauracin de
las estructuras internas de datos y estado de la interfaz de usuario, lo que permite al usuario cambiar
fcilmente entre las aplicaciones y proporcionar al menos la aparicin de mltiples, al mismo tiempo la
ejecucin de aplicaciones. Los pasos a seguir en el manejo de gracia cambios de estado se tratarn en
detalle en el prximo captulo titulado Manejo Android Actividad Cambios de estado.

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

11. Manipulacin Android Actividad Cambios de estado


en Android Estudio
Con base en la informacin que se indica en el captulo titulado Comprensin Aplicacin para Android y
Actividad Ciclos de vida ahora es evidente que las actividades que componen una aplicacin pasan a travs
de una variedad de diferentes estados durante el transcurso de la vida til de la aplicacin. El cambio de un
estado a otro es impuesta por el sistema de ejecucin de Android y es, por tanto, en gran medida fuera del
control de la actividad misma. Dicho esto, en la mayora de los casos el tiempo de ejecucin ofrecer la
actividad en cuestin con una notificacin del cambio de estado inminente, dndole as tiempo para
reaccionar en consecuencia. En la mayora de los casos, esto implicar salvar o restaurar datos en relacin
con el estado de la actividad y su interfaz de usuario.
El objetivo principal de este captulo es proporcionar una visin general de alto nivel de las formas en que una
actividad puede ser notificado de un cambio de estado y para delinear las reas en las que es aconsejable
guardar o restaurar la informacin de estado. Despus de haber cubierto esta informacin, el captulo y luego
tocar brevemente el tema de la vida til de actividad.
Contenido

1 La clase de actividad

2 Estado Dinamizador vs. Estado Persistente

3 Los mtodos de ciclo de vida para Android 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

Estado Dinamizador vs. Estado Persistente


Un objetivo clave de la gestin del ciclo de vida de la actividad es garantizar que el estado de la actividad se
guarda y restaura en los momentos apropiados. Cuando se habla de Estado en este contexto nos referimos a
los datos que se estn celebrando actualmente dentro de la actividad y la apariencia de la interfaz de
usuario. La actividad podra, por ejemplo, mantener un modelo de datos en la memoria que debe ser
guardado en una base de datos, proveedor de contenido o archivo. Tal informacin de estado, debido a que
persiste de una invocacin de la aplicacin a otra, se conoce como el estado persistente.
La apariencia de la interfaz de usuario (tales como texto introducido en un campo de texto, pero todava no
comprometida con modelo de datos interno de la aplicacin) se conoce como el estado dinmico, ya que est
normalmente slo conserv durante una nica invocacin de la aplicacin (y tambin denominado estado de
la interfaz de usuario o la instancia estatal).
La comprensin de las diferencias entre estos dos estados es importante porque tanto las formas en que se
guardan, y las razones para hacerlo, difieren.
El propsito de salvar el estado persistente es evitar la prdida de datos que pueden resultar de una actividad
que est siendo asesinado por el sistema de ejecucin, mientras que en el fondo. El estado dinmico, por otro
lado, se guarda y restaurado por razones que son ligeramente ms complejo.
Consideremos, por el bien de ejemplo, para que una aplicacin contiene una actividad (que nos referiremos
como Actividad A) que contiene un campo de texto y algunos botones de radio. Durante el transcurso del uso
de la aplicacin, el usuario introduce algn texto en el campo de texto y hace una seleccin de los botones de
radio. Antes de realizar una accin para salvar a estos cambios, sin embargo, el usuario cambia a otra
actividad que causa la actividad de A a ser empujado hacia abajo la Actividad Pila y se coloca en el
fondo. Despus de algn tiempo, el sistema de ejecucin comprueba que la memoria es baja y, en
consecuencia mata Actividad A para liberar recursos. En lo que se refiere al usuario, sin embargo, Actividad A
se coloca simplemente en el fondo y est listo para ser movido al primer plano en cualquier momento. Al
regresar Actividad A al primer plano el usuario, muy razonablemente, esperar que el texto introducido y
selecciones de botn de radio a se han conservado. En este escenario, sin embargo, se habr creado una
nueva instancia de la Actividad A y, si el estado dinmico no se ha guardado y restaurado, perdi la entrada
del usuario anterior.
El objetivo principal de salvar estado dinmico, por lo tanto, es dar la percepcin de conmutacin sin fisuras
entre las actividades de primer plano y de fondo, independientemente del hecho de que las actividades
pueden realmente han muerto y renovadas sin el conocimiento del usuario.
Los mecanismos de ahorro de estado persistente y dinmico se harn ms claras en las siguientes secciones
de este captulo.

111

Los mtodos de ciclo de vida para Android Actividad


Como se ha explicado anteriormente, la clase de actividad contiene una serie de mtodos de ciclo de vida
que actan como controladores de eventos cuando el estado de un cambio de actividad.Los mtodos
principales soportados por la clase Actividad Android son los siguientes:

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:

onRestoreInstanceState (Bundle savedInstanceState) - Este mtodo es llamado inmediatamente


despus de una llamada al mtodo onStart () en el caso de que la actividad se est reiniciando desde una
invocacin anterior en la que se salv estado. Como con onCreate (), este mtodo se pasa un objeto
Bundle que contiene los datos de estado anteriores. Este mtodo se suele utilizar en situaciones en las

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

onRestoreInstanceState () y onSaveInstanceState () son opcionales existen considerables beneficios al


hacerlo, un tema que se tratar en el captulo titulado Cmo guardar y restaurar el estado de usuario de
interfaz de una Actividad Android.

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

12. Android Actividad Estado Cambios - Un Estudio


Android Ejemplo
En los captulos anteriores se han discutido con cierto detalle los diferentes estados y los ciclos de vida de las
actividades que componen una aplicacin para Android. En este captulo, vamos a poner la teora de la
manipulacin de los cambios de estado de actividad en prctica a travs de la creacin de una aplicacin de
ejemplo. El propsito de este ejemplo de aplicacin es el de proporcionar un verdadero demostracin mundo
de una actividad a medida que pasa a travs de una variedad de diferentes estados dentro del tiempo de
ejecucin Android.
En el siguiente captulo, titulado Cmo guardar y restaurar la actividad del Estado en Android estudio , el
proyecto de ejemplo construido en este captulo se extendern a demostrar el ahorro y la restauracin del
estado de actividad dinmica.
Contenido

1 Crear el Ejemplo Proyecto de cambio de estado

2 El diseo de la interfaz de usuario

3 Anulacin de los mtodos del ciclo de vida de actividad

4 Filtrar el panel LogCat

5 Ejecutar la aplicacin

6 Experimentar con la Actividad

7 Resumen

Crear el ejemplo del Proyecto de cambio de estado


El primer paso en este ejercicio es crear el nuevo proyecto. Comience con el lanzamiento de Android Studio
y, si es necesario, el cierre de los proyectos actualmente abiertos utilizando el Archivo -> para que aparezca
la pantalla de bienvenida opcin Cerrar men Proyecto.
Seleccione el inicio de un nuevo proyecto Android Estudio opcin de inicio rpido de la pantalla de bienvenida
y, en el nuevo cuadro de dilogo proyecto resultante, introduzca StateChange en el campo Nombre de la
aplicacin y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn
Siguiente.
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

StateChangeActivity

un

activity_state_change correspondiente y un recurso de men llamado menu_state_change.

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.

El diseo de la interfaz de usuario


Con el diseo de la interfaz de usuario cargado en la herramienta de diseo, ahora es el momento de dis ear
la interfaz de usuario para la aplicacin de ejemplo. En lugar del "Hola, mundo!" TextView actualmente
presente en el diseo de la interfaz de usuario, la actividad requiere realmente una vista
EditarTexto. Seleccione el objeto TextView en el lienzo Designer y pulse la tecla Supr en el teclado para
eliminarlo de la concepcin.
Desde la paleta situada en el lado izquierdo del Diseador, busque la categora de los campos de texto y
haga clic y arrastre un componente Texto sin formato a la representacin visual de la pantalla del
dispositivo. Mueva el componente al centro de la pantalla para que aparezcan las directrices del centro y
colocarlo en su lugar para que el diseo se asemeja a la de la figura 12-2.

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

maysculas. Configuracin del tipo de entrada tambin se pueden combinar.


A los efectos de este ejemplo, vamos a establecer el tipo de entrada para apoyar la introduccin d e texto en
general. Para ello, haga clic en el icono de la bombilla seguida de la derecha frente flecha al final del mensaje
que describe el problema. En la lista de posibles soluciones (Figura 12-3) haga clic en la opcin Agregar
atributo InputType:

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

Anulacin de los mtodos del ciclo de vida de actividad


En este punto, el proyecto contiene una sola actividad denominada StateChangeActivity, que se deriva de la
clase Android ActionBarActivity. El cdigo fuente de esta actividad est contenida en el archivo
StateChangeActivity.java que ya debera estar abierto en una sesin de editor y representada por una
pestaa en la barra de pestaas editor. En el caso de que el archivo ya no est abierta, navegue hasta que en
el panel de ventana de herramientas Proyecto (app -> Java -> com.ebookfrenzy.statechange ->
StateChangeActivity) y haga doble clic en l para cargar el archivo en el editor.Una vez cargado el cdigo
debera decir lo siguiente:

com.ebookfrenzy.statechange paquete;

119

android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;

public class StateChangeActivity extiende ActionBarActivity {


@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_state_change);
}

@ 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");
}

Filtrar el panel LogCat


El propsito del cdigo aadido a los mtodos reemplaza en StateChangeActivity.java es capturar la
informacin de salida al panel LogCat dentro de la ventana de la herramienta Android. Sin filtros definidos, el
registro aparecer una lista de todos los eventos que tiene lugar dentro del dispositivo o emulador por lo que
es difcil encontrar los mensajes de registro para nuestros mtodos sobrescritos. Antes de ejecutar la
aplicacin, por lo tanto, se recomienda crear un filtro que, cuando se selecciona, se asegurar de que slo se
muestran los mensajes de registro que contienen la etiqueta declarada en nuestra actividad.
Comienza mostrando la ventana de herramientas Android utilizando el botn de men de herramientas
situada en la esquina izquierda de la barra de estado o la Alt-6 atajo de teclado. Dentro de la ventana de la
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 como se muestra en la Figura 12-5:

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

Experimentar con la Actividad


Con el diagnstico de trabajo, ahora es el momento de ejercer la aplicacin con el fin de profundizar en el
conocimiento de los cambios de estado de la actividad del ciclo de vida. Para empezar, tenga en cuenta la
secuencia inicial de eventos de registro en el panel LogCat:
onCreate
onStart
En resumen

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

13. Guardar y restaurar la actividad del Estado en


Android Estudio
Si los captulos anteriores han logrado su objetivo, que ahora debe ser un poco ms claro en cuanto a la
importancia de guardar y restaurar el estado de una interfaz de usuario en determinados puntos en el tiemp o
de vida de una actividad.
En este captulo, vamos a ampliar la aplicacin de ejemplo creada en Android Actividad Cambios de estado Un Estudio Android Ejemplo para demostrar los pasos necesarios para guardar y restaurar el estado cuando
se destruye una actividad y recreado por el sistema de ejecucin.
Un componente clave de guardar y restaurar el estado dinmico implica el uso de la clase Android SDK
Bundle, un tema que tambin se tratar en este captulo.
Contenido

1 Ahorro de Estado Dinamizador

2 Guardado predeterminado de la interfaz de usuario del Estado

3 La Clase Bundle

4 Guardar el Estado

5 Restauracin del Estado

6 Prueba de la aplicacin

7 Resumen

Ahorrar Estado Dinamizador


Una actividad, como ya hemos aprendido, se le da la oportunidad de guardar la informacin de estado
dinmico a travs de una llamada del sistema de ejecucin de la implementacin de la actividad del mtodo
onSaveInstanceState (). Pasado por como argumento para el mtodo es una referencia a un objeto de
paquete en el que tendr el mtodo para almacenar cualquier dato dinmico que necesita ser salvado. El
objeto Bundle se almacena por el sistema de ejecucin en nombre de la actividad y, posteriormente, pas a
travs de como argumento para onCreate de la actividad () y onRestoreInstanceState () mtodos, siempre y
cuando se les llama. Los datos pueden ser recuperados desde el objeto Bundle dentro de estos mtodos y se
usan para restaurar el estado de la actividad.

Guardado predeterminado de la interfaz de usuario del Estado


En el captulo anterior, la salida de diagnstico desde el ejemplo de aplicacin StateChange mostr que una
actividad pasa por una serie de cambios de estado cuando el dispositivo en el que se est ejecutando es
girado lo suficiente para desencadenar un cambio de orientacin.

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);

Llevar todo esto

junto nos da un mtodo

modificado onSaveInstanceState

() en el archivo

StateChangeActivity.java que dice lo siguiente (teniendo en cuenta tambin la directiva de importacin


adicional de android.widget.EditText):
com.ebookfrenzy.statechange paquete;
android.support.v7.app.ActionBarActivity importacin;

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.

Restauracin del Estado


El estado dinmico ahorrado puede ser restaurada en los mtodos de ciclo de vida que se pasan el objeto
Bundle como argumento. Esto deja el programador con la opcin de usar ya sea onCreate () o
onRestoreInstanceState (). El mtodo a utilizar depender de la naturaleza de la actividad. En los casos en
que es mejor restaurado estado despus se han realizado tareas de inicializacin de la actividad, el mtodo
onRestoreInstanceState () es en general ms adecuado. A los efectos de este ejemplo vamos a aadir cdigo
al mtodo onRestoreInstanceState () para extraer el estado guardado del paquete usando la tecla
"savedText". Entonces podemos mostrar el texto en el componente EditarTexto utilizando el mtodo del
objeto setText ():
@ Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
super.onRestoreInstanceState (savedInstanceState);
Log.i (TAG, "onRestoreInstanceState");
textBox definitiva EditarTexto =
(EditarTexto) findViewById (R.id.editText);
CharSequence usertext =
savedInstanceState.getCharSequence ("savedText");
textBox.setText (usertext);

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

14. Entendiendo Vistas Android, Ver grupos y diseos en


Android Estudio
Con la posible excepcin de escuchar el streaming de audio, la interaccin de un usuario con un dispositivo
Android es principalmente visual y tctil en la naturaleza. Toda esta interaccin tiene lugar a travs de las
interfaces de usuario de las aplicaciones instaladas en el dispositivo, incluyendo tanto las aplicaciones
incorporadas y las aplicaciones de terceros instaladas por el usuario. No debera ser ninguna sorpresa, por lo
tanto, que un elemento clave del desarrollo de aplicaciones Android implica el diseo y la creacin de
interfaces de usuario.
Dentro de este captulo, el tema de la estructura de la interfaz de usuario de Android ser cubierta, junto con
una visin general de los diferentes elementos que se pueden juntar para hacer una interfaz de usuario; a
saber, Vistas Ver grupos y diseos.
Contenido

1 Diseo para diferentes dispositivos Android

2 Puntos de vista y Ver grupos

3 Android Controladores de Distribucin

4 El Ver Jerarqua

5 Creacin de interfaces de usuario

6 Resumen

Disear para diferentes dispositivos Android


El trmino "dispositivo Android" abarca una amplia gama de tabletas y telfonos inteligentes productos con
diferentes tamaos de pantalla y resoluciones. Como resultado, las interfaces de usuario de aplicaciones
ahora deben ser cuidadosamente diseados para asegurar correcta presentacin sobre la ms amplia gama
de tamaos de pantalla como sea posible. Una parte clave de esto es asegurar que los diseos de interfaz de
usuario cambiar el tamao correctamente cuando se ejecuta en diferentes dispositivos. Esto en gran parte se
puede lograr a travs de una cuidadosa planificacin y el uso de los controladores de distribucin descritos en
este captulo.
Tambin es importante tener en cuenta que la mayora de los telfonos inteligentes y las tabletas basado en
Android puede ser considerado por el usuario en ambas orientaciones vertical y horizontal. Una interfaz de
usuario bien diseado debe ser capaz de adaptarse a estos cambios y hacer los ajustes de diseo sensibles
para utilizar el espacio de pantalla disponible en cada orientacin.

132

Vistas y Ver grupos


Cada elemento en una interfaz de usuario es una subclase de la clase Vista Android (sea android.view.View
precisos). El SDK de Android proporciona un conjunto de vistas predefinidas que se pueden utilizar para
construir una interfaz de usuario. Ejemplos tpicos incluyen elementos estndar como los botones, CheckBox,
clases ProgressBar y TextView. Estos puntos de vista tambin se les conoce como widgets o
componentes. Para conocer los requisitos que no se cumplen los reproductores suministrados con el SDK,
nuevos puntos de vista pueden ser creados ya sea por subclases y ampliar una clase existente, o la creacin
de un componente completamente nuevo mediante la construccin directamente en la parte superior de la
clase View.
Una vista puede tambin estar compuesto de mltiples otras vistas (conocido de otra manera como una vista
compuesta). Estos puntos de vista son subclases de la clase Android ViewGroup (android.view.ViewGroup),
que es en s misma una subclase de View. Un ejemplo de tal punto de vista es la RadioGroup, que est
destinado a contener mltiples RadioButton objetos de tal manera que slo uno puede estar en la posicin
"on" en cualquier momento. En trminos de estructura, vistas compuestas constan de una sola vista padre
(derivado de la clase ViewGroup y tambin conocida como vista contenedor o elemento raz) que es capaz de
contener otros puntos de vista (conocidos como puntos de vista del nio).
Otra categora de vista contenedor basado ViewGroup es la del controlador de distribucin.

Android Controladores de Distribucin


Adems de los puntos de vista de estilo widget de discutidos en la seccin anterior, el SDK tambin incluye
un conjunto de puntos de vista referidos como diseos. Layouts son vistas de contenedores (y, por lo tanto,
una subclase de ViewGroup) diseados con el nico propsito de controlar cmo vistas nio se colocan en la
pantalla.
El SDK de Android incluye los siguientes puntos de vista de diseo que se pueden utilizar dentro de un diseo
de la interfaz de usuario de Android:

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.

FrameLayout - El propsito de la FrameLayout es asignar un rea de la pantalla, tpicamente para los


fines de visualizacin de una sola vista. Si se aaden varias vistas nio lo harn, de forma
predeterminada, aparecer en la parte superior de cada uno situado en la esquina superior izquierda del
rea de diseo. Posicionamiento alternativo de puntos de vista individuales del nio se puede lograr
mediante el establecimiento de valores de gravedad en cada nio. Por ejemplo, el establecimiento de una

133
gravedad center_vertical en un nio har que se coloque en el centro vertical de la vista que contiene
FrameLayout.

RelativeLayout - Probablemente el ms potente y flexible de los controladores de distribucin, lo que


permite vistas nio para ser colocados tanto en relacin con los dems y la vista de diseo que contiene
mediante la especificacin de las alineaciones y los mrgenes de los puntos de vista del nio. Por
ejemplo, nio View A puede estar configurado para ser colocado en el centro vertical y horizontal de la
vista que contiene RelativeLayout. Ver B, por otro lado, podra tambin ser configurado para estar
centrado horizontalmente dentro de la vista de diseo, pero posicionado 30 pxeles por encima del borde
superior de la vista A, con lo que la posicin vertical relativa a la de gerente Ver A. El RelativeLayout
puede ser de uso particular en el diseo de una interfaz de usuario que deben trabajar en una variedad de
tamaos de pantalla y orientaciones.

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.

GridLayout - El GridLayout es relativamente un nuevo controlador de distribucin que se introdujo como


parte de Android 4.0. Un ejemplo GridLayout se divide por lneas invisibles que forman una cuadrcula que
contiene filas y columnas de celdas. Visitas infantiles se colocan en las clulas y pueden ser configurados
para cubrir varias celdas horizontal y verticalmente permitiendo una amplia gama de opciones de diseo
para ser implementado de forma rpida y sencilla. Los espacios entre los componentes de un GridLayout
pueden implementarse mediante la colocacin de un tipo especial de vista llamada una vista espacial en
las clulas adyacentes, o mediante el establecimiento de parmetros de margen.

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.

Creacin de interfaces de usuario


Con una mejor comprensin de los conceptos de puntos de vista, diseos y la jerarqua de vistas, los
siguientes captulos se centrarn en los pasos involucrados en la creacin de interfaces de usuario para
actividades de Android. De hecho, hay tres enfoques diferentes para el diseo de interfaces de usuario: Con
la herramienta Android Studio Designer, archivos de recursos de diseo de escritura XML o escribir cdigo
Java, cada uno de los cuales sern cubiertos.

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

15. Una gua para la herramienta Diseador Android


Estudio
Es difcil pensar en un concepto de aplicacin de Android que no requiere de algn tipo de interfaz de
usuario. La mayora de los dispositivos Android vienen equipados con una pantalla tctil y un teclado (virtual o
fsico) y grifos y golpes son la principal forma de interaccin entre el usuario y la aplicacin. Invariablemente,
estas interacciones tienen lugar a travs de la interfaz de usuario de la aplicacin.
Una interfaz de usuario bien diseada e implementada, un factor importante en la creacin de una aplicacin
Android exitoso y popular, puede variar de simple a muy complejo, dependiendo de los requisitos de diseo
de la aplicacin individual. Independientemente del nivel de complejidad, la herramienta Android Studio
Designer simplifica considerablemente la tarea de disear e implementar interfaces de usuario de Android.
Contenido

1 El Diseador Android Estudio

2 modo de diseo

3 Modo de texto

4 Configuracin de las propiedades

5 Tipo Morphing

6 Creacin de una definicin de dispositivo personalizado

7 Resumen

El Diseador Android Estudio


Como se ha demostrado en los captulos anteriores, la herramienta Diseador proporciona un "lo que ves es
lo que obtienes" (WYSIWYG) entorno en el que visitas se pueden seleccionar de una gama de colores y luego
colocados en un lienzo que representa la pantalla de un dispositivo Android. Una vez que un punto de vista ha
sido colocado en el lienzo, se puede mover, elimina y cambia de tamao (sujeto a las limitaciones de la vista
padre). Adems, una amplia variedad de propiedades relacionadas con la vista seleccionada podr ser
modificado mediante el panel Propiedades.
Bajo la superficie, la herramienta Diseador realidad construye un archivo de recursos XML que contiene la
definicin de la interfaz de usuario que se est diseando. Como tal, la herramienta Diseador funciona en
dos modos distintos que se hace referencia como modo de diseo y el modo de texto.

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.

Configuracin de las propiedades


El panel de propiedades proporciona acceso a todas las opciones disponibles para el componente
seleccionado. Al hacer clic en los caracteres del panel y mecanografa se iniciar un proceso de bsqueda
para resaltar y seleccionar la medida ms prxima a los caracteres escritos.

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

Creacin de una definicin de dispositivo personalizado


El men del dispositivo en la barra de herramientas Diseador proporciona una lista de tipos de dispositivos
preconfigurados que, cuando se selecciona, aparecer como el lienzo de la pantalla del dispositivo. Adems
de los tipos de dispositivos preconfigurados, cualquier instancia AVD que han sido previamente configurados
en el entorno Android Studio tambin se mostrarn en el men. Para agregar configuraciones de dispositivos
adicionales, ver el men del dispositivo, seleccione la opcin Agregar Dispositivo Definicin ... opcin y siga
los pasos descritos en el captulo titulado Creacin de un dispositivo virtual de Android (AVD) en Android
Estudio

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

16. El diseo de una interfaz de usuario utilizando la


herramienta Diseador Android Estudio
Con mucho, el mecanismo ms fcil y ms productivo para el diseo de una interfaz de usuario para una
aplicacin Android es hacer uso de la herramienta Android Studio Designer. El objetivo de este captulo es
proporcionar una visin general de cmo crear una interfaz de usuario utilizando esta herramienta. El ejercicio
se incluye en este captulo tambin se utilizar como una oportunidad para perfilar la creacin de una
actividad a partir de un "escueto" proyecto Android Studio.
Despus de haber cubierto el uso del Diseador Android Studio, el captulo tambin se ofrecer una visin
general de los conceptos detrs de los archivos de recursos de diseo de edicin de XML escrito a mano y
antes de introducir la herramienta Visor de Jerarqua.
Contenido

1 Un estudio Android Diseador Herramienta Ejemplo

2 Creacin de una nueva actividad

3 El diseo de la interfaz de usuario

4 Edicin de propiedades de la vista

5 Ejecutar la aplicacin

6 Creacin manual de un diseo XML

7 Uso del visor Jerarqua

8 Resumen

Un Diseador Android Estudio Herramienta Ejemplo


El primer paso en esta fase del ejemplo es crear un nuevo proyecto Android Studio. Comienza, por lo tanto,
con el lanzamiento de Android Estudio y cierre de los proyectos previamente abiertos al seleccionar Archivo > opcin de men Cerrar proyecto. Dentro de la pantalla de bienvenida clic Android Studio en el inicio de una
nueva opcin de inicio rpido del proyecto Android Estudio para mostrar la primera pantalla del nuevo cuadro
de dilogo proyecto.
Introduzca LayoutSample en el campo Nombre de la aplicacin y ebookfrenzy.com como el Dominio de la
empresa establecer antes de hacer clic en el botn Siguiente.
En los ejemplos anteriores, hemos solicitado que Android Estudio crear una actividad de plantilla para el
proyecto. Nosotros, sin embargo, a utilizar este tutorial para aprender a crear una actividad totalmente nueva
y archivo de recursos de diseo correspondiente de forma manual, as que asegrese de que la opcin
Agregar Sin actividad est seleccionado antes de hacer clic en Finalizar para crear el nuevo proyecto.

145

Creacin de una nueva actividad


Una vez que el proceso de creacin del proyecto se ha completado, la ventana principal de Android Estudio
debera aparecer con un fondo blanco que contiene un mensaje que dice "No hay archivos estn abiertos".
El siguiente paso en el proyecto es la creacin de una nueva actividad. Este ser un valioso ejercicio de
aprendizaje, ya que hay muchos casos en el curso del desarrollo de aplicaciones Android en nuevas
actividades necesitan ser creado desde cero.
Comienza mostrando la ventana de herramientas Proyecto utilizando la Alt-1 atajo de teclado. Una vez que
aparece, despliegue la jerarqua haciendo clic en la derecha frente flechas junto a las entradas de la ventana
del proyecto. El objetivo aqu es tener acceso a la aplicacin -> Java -> carpeta
com.ebookfrenzy.layoutsample en la jerarqua del proyecto. Una vez que el nombre del paquete es visible,
haga clic derecho sobre l y seleccione Nuevo -> Actividad -> opcin de men Actividad en blanco como se
ilustra en la Figura 16-1:

Figura 16-1

En el cuadro de dilogo Nueva actividad resultante, nombre de la nueva actividad LayoutSampleActivity, el


activity_layout_sample disposicin y el menu_layout_sample recurso de men.
Para que una aplicacin pueda ejecutarse en un dispositivo que tiene que tener una actividad designada
como la actividad de lanzamiento. Sin una actividad de lanzamiento, el sistema operativo no sabr que la
actividad se inicie cuando los primeros lanzamientos de aplicaciones y, como tal, la aplicacin no se
iniciar. Desde este ejemplo slo tiene una actividad, necesita ser designada como la actividad de
lanzamiento de la aplicacin para asegurarse de que la opcin Actividad Launcher est seleccionado antes de
hacer clic en el botn Finalizar.

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>

El diseo de la interfaz de usuario


Localice y haga doble clic en el archivo de diseo activity_layout_sample.xml ubicada en la aplicacin -> res > carpeta de presentacin para cargarlo en la herramienta Diseador.
Por defecto, el diseo debe contener una sola vista de componentes en la forma de la TextView mostrando el
mensaje "Hola Mundo!". Seleccionar este componente y retrela pulsando la tecla Suprimir del teclado.
Desde dentro de la categora de la paleta de widgets, arrastre un objeto de vista botn en el centro de la vista
de la pantalla. Tenga en cuenta que verdes lneas de trazos horizontales y verticales parecen indicar los ejes
centrales de la pantalla. Una vez centrado, suelte el botn del ratn para colocar la vista en su posicin. Haga
clic y arrastre un objeto de texto sin formato de la seccin de campos de texto de la paleta y posicionarlo para
que aparezca encima del botn como se ilustra en la Figura 16-2:

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.

Edicin de Propiedades de la vista


Una vez que un objeto de vista se ha colocado en la interfaz de usuario, las propiedades de este punto de
vista tambin se pueden modificar desde dentro de la herramienta Designer. En el primer caso, la anchura del
objeto EditarTexto puede ser insuficiente para permitir que el usuario introduzca texto. Para cambiar esto,
seleccione el objeto EditarTexto y busque y seleccione la propiedad de ancho en el panel Propiedades. En el

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

pt - Puntos (1/72 de pulgada)

dp - independiente de la densidad de pxeles. Una unidad abstracta de medicin basado en la densidad


fsica de la pantalla del dispositivo con relacin a una lnea de base 160dpi pantalla.

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.

Creacin manual de un diseo XML


Si bien el diseo de layouts utilizando la herramienta de diseo en gran medida mejora la productividad,
todava es posible crear diseos XML editando manualmente el cdigo XML. La estructura de un archivo de
diseo XML en realidad es bastante sencillo y sigue el enfoque jerrquico del rbol vista. La primera lnea de
un archivo de recursos XML debe incluir idealmente la declaracin siguiente norma:
<? Xml version = "1.0" encoding = "UTF-8"?>

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.

Uso del visor Jerarqua


Una herramienta til para inspeccionar de cerca la jerarqua de vistas de una actividad es el visor de la
Jerarqua. El propsito principal de la herramienta es proporcionar una descripcin detallada de todo el rbol
de vista de las actividades dentro de las aplicaciones actualmente en ejecucin y proporcionar alguna
informacin sobre el rendimiento de la representacin de diseo.
El espectador jerarqua slo se puede utilizar para inspeccionar las aplicaciones que se estn ejecutando, ya
sea dentro de un emulador de Android, o en un dispositivo que ejecuta una versin de desarrollo de
Android. Para ejecutar la herramienta en la aplicacin LayoutSample creado en este captulo, iniciar la
aplicacin en un emulador de dispositivo virtual de Android y esperar hasta que se haya cargado y es visible
en la pantalla del emulador. Una vez en funcionamiento, seleccione Herramientas -> Android -> Dispositivo
Android opcin de men Monitor. En la ventana DDMS, seleccione la Ventana -> Abrir perspectiva ... opcin
de men y elija Jerarqua Vista desde el cuadro de dilogo resultante antes de hacer clic en el botn Aceptar.
Cuando aparezca el visor de la Jerarqua, que consistir en una serie de diferentes paneles. El panel de la
izquierda, que se ilustra en la Figura 16 315 3, enumera todas las ventanas activas actualmente en el
dispositivo o emulador, como la barra de navegacin, barra de estado y el lanzador. La ventana que aparece
en negrita es la ventana actual en primer plano, lo que debera, en este caso, ser LayoutSampleActivity.

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

17. Creacin de una interfaz de usuario de Android en el


Cdigo Java utilizando Android Estudio
Hasta este punto en el libro, todas las tareas de diseo de interfaz de usuario se han realizado utilizando la
herramienta Android Studio Designer, ya sea en texto o modo de diseo. Una alternativa a la escritura de
archivos de recursos XML o utilizando Android Studio Designer es escribir cdigo Java para crear
directamente, configurar y manipular los objetos de vista que componen la interfaz de usuario de una
actividad Android. En el contexto de este captulo, vamos a explorar algunas de las ventajas y desventajas de
escribir cdigo Java para crear una interfaz de usuario antes de describir algunos de los conceptos clave,
como las propiedades de vista, los parmetros de diseo y las reglas. Por ltimo, un proyecto de ejemplo se
crear y se utiliza para demostrar algunos de los pasos tpicos involucrados en este enfoque de la creacin de
interfaz de usuario de Android.
Contenido

1 Cdigo Java vs. XML Archivos Layout

2 Creacin de Vistas

3 Propiedades y parmetros de diseo

4 Crear el proyecto Ejemplo en Android Estudio

5 Adicin Vistas a una actividad

6 Configuracin de propiedades de la vista

7 Agregar parmetros y reglas Disposicin

8 Usando Ver IDs

9 Conversin Densidad pxeles Independientes (dp) de pxeles (px)

10 Resumen

Cdigo Java vs. XML Archivos Layout


Hay un nmero de ventajas clave para usar archivos de recursos XML para disear una interfaz de usuario en
lugar de escribir cdigo Java. De hecho, Google va a longitudes considerables en la documentacin Android
para ensalzar las virtudes de recursos XML sobre el cdigo Java. Como se discuti en el captulo anterior,
una ventaja clave para el enfoque XML incluye la capacidad de utilizar la herramienta Diseador Android
Studio, que, en s, genera recursos XML. Una segunda ventaja es que una vez que se ha creado una
aplicacin, los cambios en las pantallas de la interfaz de usuario se pueden hacer simplemente modificando el
archivo XML, evitando as la necesidad de volver a compilar la aplicacin. Adems, incluso cuando la mano
escribiendo diseos XML, es posible obtener informacin inmediata sobre la apariencia de la interfaz de
usuario utilizando la funcin de vista previa de la herramienta Android Studio Designer. Con el fin de probar la
apariencia de un Java creado interfaz de usuario el desarrollador ser, inevitablemente, el ciclo repetidamente
a travs de un bucle de escribir cdigo, compilacin y pruebas con el fin de completar el trabajo de diseo.

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 ().

Propiedades y parmetros de diseo


Cada clase de vista ha asociado a l una serie de propiedades. Estos valores de propiedades se establecen
directamente en las instancias de vista y generalmente definen cmo aparecer el objeto vista o
comportarse. Ejemplos de propiedades son el texto que aparece en un objeto Button, o el color de fondo de
una vista RelativeLayout. Cada clase de vista dentro del SDK de Android tiene un conjunto predefinido de
mtodos que permiten al usuario configurar y obtener estos valores de propiedad. La clase Button, por
ejemplo, tiene un mtodo setText (), que se puede llamar desde el cdigo Java para establecer el texto que
aparece en el botn para un valor de cadena especfica. El color de fondo de un objeto RelativeLayout, por
otro lado, se puede configurar con una llamada al mtodo del objeto setBackgroundColor ().
Si bien la configuracin de propiedades son internos para ver objetos y dictar cmo aparece una vista y se
comporta, Parmetros de diseo se utilizan para controlar cmo aparece una vista con respecto a su punto de
vista de los padres y otras visitas de hermanos. Disposicin parmetros no se fijan en la misma manera como
propiedades, sino ms bien almacenan en una instancia de ViewGroup.LayoutParams (o una subclase de los
mismos) que luego se pasa a travs de ya sea como un argumento cuando se aade la vista a la vista de los

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.

Crear el proyecto Ejemplo en Android Estudio


Lanzamiento Android Studio y seleccionar el inicio de una nueva opcin de proyecto Android Estudio de la
lista de inicio rpido en la pantalla de bienvenida. Si los proyectos existentes ya estn abiertos, cerrarlos
primero utilizando el Archivo -> Cerrar opcin de men.
En el nuevo cuadro de dilogo de configuracin del proyecto, introduzca JavaLayout en el campo Nombre de
la aplicacin y ebookfrenzy.com como el dominio de la empresa establecer antes de hacer clic en el botn
Siguiente.
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 JavaLayoutActivity con una disposicin correspondiente
llamado activity_java_layout y con el nombre de recurso de men a menu_java_layout.
Una vez que el proyecto ha sido creado, el archivo JavaLayoutActivity.java debe cargar automticamente en
el panel de edicin. Como hemos llegado a esperar, Android Studio ha creado una actividad de plantilla y se
reemplaza el mtodo onCreate (), proporcionando un lugar ideal para el cdigo Java que se aade para crear
una interfaz de usuario.

Adicin Vistas a una actividad


El mtodo onCreate () est diseado para utilizar un archivo de diseo de recursos para la interfaz de
usuario. Comienza, por lo tanto, mediante la supresin de esta lnea a partir del mtodo:
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_java_layout);
}

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;

public class JavaLayoutActivity extiende ActionBarActivity {


@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
Botn myButton = new Button (this);
RelativeLayout myLayout = new RelativeLayout (this);
myLayout.addView (myButton);
setContentView (myLayout);
}
.
.
.
}

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

Configuracin de propiedades de la vista


A los efectos de este ejercicio, necesitamos el fondo de la vista RelativeLayout a ser azul y la vista del botn
para mostrar el texto que dice "Pulse Me". Ambas tareas se puede lograr mediante el establecimiento de
propiedades en las vistas en el cdigo Java como se indica en el siguiente fragmento de cdigo:
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;
public class JavaLayoutActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
Botn myButton = new Button (this);
myButton.setText ("Presione Me");
myButton.setBackgroundColor (Color.YELLOW);
RelativeLayout myLayout = new RelativeLayout (this);
myLayout.setBackgroundColor (Color.BLUE);
myLayout.addView (myButton);
setContentView (myLayout);
}
.
.
.
}

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.

Agregar parmetros y reglas de diseo


Por defecto, la vista RelativeLayout ha puesto la vista botn en la esquina superior izquierda de la
pantalla. Con el fin de instruir a la vista de diseo para colocar el botn en un lugar diferente, en este caso
centrado tanto horizontal como verticalmente, ser necesario crear un objeto LayoutParams e inicializar con
los valores apropiados.
Por lo general, una nueva instancia LayoutParams se crea al pasar por los valores de altura y anchura para la
vista. Estos valores deben establecerse en cualquiera de MATCH_PARENT, WRAP_CONTENT o especficos
valores de tamao. El ajuste MATCH_PARENT instruye la disposicin de los padres para expandir la vista del
nio para que coincida con el tamao de la matriz.WRAP_CONTENT, por otro lado, instruye a los padres con
el tamao de la vista del nio de modo que es slo lo suficientemente grande para mostrar cualquier
contenido puede ser configurado para mostrar al usuario.

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

myLayout.addView (myButton, buttonParams);


setContentView (myLayout);
}

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.

Usando Ver IDs


Hasta ahora, en este tutorial no ha sido necesario el uso de identificadores de vista. Con el fin de demostrar el
uso de identificadores en cdigo Java, el ejemplo ahora se extender a aadir otra vista en la forma de una

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

myLayout.addView (myEditText, textParams);


setContentView (myLayout);
}
.
.
.
}

Una prueba de funcionamiento de la aplicacin debe mostrar el campo EditarTexto centrado sobre el botn
con un margen de 80 pxeles.

Pxeles Independientes de densidad en la conversin (dp) de pxeles (px)


La tarea final en este ejercicio es establecer la anchura de la vista EditarTexto a 200dp. Como se indica en el
captulo titulado El diseo de una interfaz de usuario de Android utilizando la Herramienta de diseo grfico, al
establecer los tamaos y posiciones en los diseos de interfaz de usuario que es mejor utilizar pxeles
densidad independientes (dp) en lugar de pxeles (px).Cuando el margen se establece en el apartado anterior,
el valor fue declarado en pxeles en lugar de dp. La razn de esto era que tales llamadas a mtodos slo
aceptan valores de pxeles. Con el fin de establecer una posicin usando dp, por lo tanto, es necesario para
convertir un valor dp a un valor px en tiempo de ejecucin, teniendo en cuenta la densidad de la pantalla del
dispositivo. En fin, por lo tanto, para ajustar el ancho de la vista EditarTexto a 350dp, el siguiente cdigo debe
ser aadido al mtodo onCreate ():
com.ebookfrenzy.javalayout paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.widget.RelativeLayout importacin;
android.widget.Button importacin;
android.widget.RelativeLayout importacin;
android.graphics.Color importacin;
android.widget.EditText importacin;
android.content.res.Resources de importacin;
android.util.TypedValue importacin;
public class JavaLayoutActivity extiende ActionBarActivity {
@ Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
Botn myButton = new Button (this);
myButton.setText ("me Pulse");
EditarTexto myEditText = new EditarTexto (this);
myButton.setId (1);
myEditText.setId (2);
RelativeLayout myLayout = new RelativeLayout (this);
myLayout.setBackgroundColor (Color.BLUE);
RelativeLayout.LayoutParams buttonParams =
nuevos RelativeLayout.LayoutParams (

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

18. Uso del Administrador de Android GridLayout en Android


Studio Designer
Un controlador de distribucin til que fue presentado como parte del SDK de Android 4.0 es la clase gerente
GridLayout. Como su nombre indica, esta clase permite vistas nio para ser dispuestos en un diseo de
cuadrcula. Hay un nmero de maneras de poner en prctica el GridLayout dentro de la interfaz de usuario de
una aplicacin Android, incluso mediante el uso de los recursos de diseo y cdigo Java. Quizs el mtodo
ms sencillo, sin embargo, es hacer uso de algunas de las caractersticas especficas GridLayout integradas
en la herramienta Android Studio Designer.
Este captulo presentar los conceptos bsicos de la clase GridLayout antes de explorar la creacin de una
interfaz de usuario basada en GridLayout usando Android Studio Designer. Creando Directamente GridLayout
diseos de interfaz de usuario que utilizan los recursos de diseo XML como alternativa al uso de la
herramienta Diseador sern cubiertos en el siguiente captulo, titulado Trabajar con el GridLayout Android
usando XML Recursos de diseo.
Contenido

1 Presentacin de las Clases Android GridLayout y el Espacio

2 El Ejemplo GridLayout

3 Crear el proyecto GridLayout

4 Crear el GridLayout Instancia

5 Adicin Vistas a clulas GridLayout

6 Traslado y Eliminacin de filas y columnas

7 Implementacin Fila Celular y Spanning Columna

8 Cambio de la gravedad de un GridLayout Nio

9 Resumen

La introduccin de las Clases Android GridLayout y el Espacio


El propsito de la GridLayout es permitir vistas nio para ser colocados en una disposicin en cuadrcula. El
GridLayout consiste esencialmente en un nmero de lneas de cuadrcula horizontales y verticales invisibles
que sirven para dividir la vista de diseo en una serie de filas y columnas, con cada fila y columna de
interseccin que forma una clula que puede a su vez, contener uno o ms puntos de vista. Las lneas de la
cuadrcula se denominan ndices, que se numeran empezando en 0 para la lnea en la vanguardia del
diseo. Fila y columna de numeracin tambin comienza a 0 a partir de la esquina superior izquierda de la
cuadrcula.
El posicionamiento de una vista dentro de una clula se puede definir mediante el uso de la configuracin de
la gravedad sobre dicho vista nio. La gravedad de una vista nio puede, por ejemplo, ser configurado de tal

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.

Crear el proyecto GridLayout


Comience con el lanzamiento de Android Studio y crear un nuevo proyecto. En el cuadro de dilogo Nuevo
proyecto, entrando GridLayoutSample en el campo Nombre de la aplicacin y ebookfrenzy.com como el
ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y establecer el entorno SDK mnima
para API 14: Android 4.0 (IceCreamSandwich). Continuar para proceder a travs de las pantallas, que solicita
la creacin de una actividad en blanco denominada GridLayoutSampleActivity con un
activity_grid_layout_sample diseo correspondiente nombre y el nombre de recurso de men ajustado a
menu_grid_layout_sample.
Haga clic en el botn Finalizar para iniciar el proceso de creacin del proyecto.

Crear el GridLayout Instancia


Dentro de la ventana de herramientas del proyecto, vaya a la aplicacin -> res -> carpeta de diseo y haga
doble clic en el archivo activity_grid_layout_sample.xml para cargarlo en el Diseador Android Studio.
Con el diseo de muestra, seleccione el Hola Mundo! Vista de texto objeto y pulse el teclado tecla Supr para
eliminarlo de la disposicin.
El esquema de trazado se compone actualmente el nico de un gerente RelativeLayout a la que ahora
podemos agregar una instancia del gestor de GridLayout. Desde la seccin Presentaciones de la paleta
Designer, seleccione un administrador de GridLayout y arrastrar y soltar en la pantalla del dispositivo. El
diseo debe llenar la pantalla con mrgenes de relleno en cada lado como se muestra en la Figura 18-1:

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.

Adicin Vistas a clulas GridLayout


Para colocar objetos de vista en las clulas de un GridLayout, simplemente haga clic en la vista deseada en la
paleta y arrstrelo a la instancia GridLayout en el diseo de la lona pantalla del dispositivo. Como la vista
pasa sobre el GridLayout, la informacin aparecer que indica la colocacin de la vista si se cae en ese
punto. Comience haciendo clic y arrastrando una vista Botn de la paleta a la esquina superior derecha de la
GridLayout como se ilustra en la Figura 18-3:

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

Mover y eliminar filas y columnas


Tenga en cuenta que a medida que se han aadido filas y columnas adicionales, barras verdes adicionales
han aparecido en los mrgenes para representar las filas y columnas. Estas barras no son meramente
informativos. Filas y columnas enteras se pueden mover haciendo clic y arrastrando el bloque verde que
corresponde a una nueva posicin dentro del mismo eje. Haga clic en un bloque y seleccionando Eliminar en
el men resultante quitar toda la fila o columna de la GridLayout.

La implementacin de la fila de la clula y Spanning Columna


Para la siguiente fase de este tutorial, dos de los puntos de vista del botn ser modificada para abarcar
varias clulas. Para empezar, el botn de la derecha la mano en la fila superior se modificar para abarcar
ambas filas. Para ello, seleccione el botn de la disposicin y localice el diseo: la propiedad rowspan
aparece en el panel Propiedades. Una vez localizado, introduzca el valor de 2 en el campo como se destaca
en la Figura 18-7:

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

Cambio de la gravedad de un GridLayout Nio


Las propiedades de la gravedad de los puntos de vista de un nio GridLayout dictan el tamao y la posicin
de los puntos de vista relativos a la celda en la que esas opiniones estn contenidos. Por defecto, las vistas
aaden hasta ahora en este captulo se han creado para ser alineado con la esquina superior izquierda de las
celdas que contienen. Con el fin de hacer que la celda anterior abarca visible, la gravedad de los dos puntos
de vista Botn necesita ser cambiado para que los puntos de vista ocupan el espacio disponible.
Una opcin es para centrar la vista del nio dentro de la clula. Comience por seleccionar la vista del botn
superior derecha. En el panel Propiedades, busque el diseo: lnea de gravedad y haga clic en el campo de
valor central para desplegar una lista de opciones disponibles. En la lista, seleccione el valor vertical como se
muestra en la Figura 18-8:

Figura 18-8

Un subconjunto de propiedades de gravedad tambin se puede configurar utilizando el botn de la barra


Gravedad Diseador como se ilustra en la Figura 18-9:

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

19. Trabajar con el GridLayout Android usando Recursos


Disposicin XML
En el captulo anterior (titulado Uso del Administrador de Android GridLayout en Android Studio Designer)
introdujo los conceptos bsicos del gestor de Android GridLayout antes de explicar cmo crear un diseo de
interfaz de usuario basada GridLayout utilizando el modo de diseo de la herramienta Android Studio
Designer. Disear visualmente una interfaz de usuario basada en GridLayout no es, sin embargo, el nico
mtodo disponible de trabajar con la clase GridLayout. Estos diseos tambin pueden implementarse
escribiendo directamente el cdigo de Java o de forma manual la creacin de elementos en un archivo de
diseo de XML, el ltimo de los cuales es el tema de este captulo.
Contenido

1 GridLayouts en archivos de recursos XML

2 Adicin Vistas nio al GridLayout

3 Declarando Spanning celular, Gravedad y Mrgenes

4 Resumen

GridLayouts en archivos de recursos XML


Un GridLayout se declara dentro de un archivo XML utilizando el <GridLayout> etiqueta de elemento. Por
ejemplo:
<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: orientacin = "vertical"
herramientas: context = ". GridLayoutActivity">
</ GridLayout>

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

android: layout_height = "match_parent"


herramientas: context = ". GridLayoutActivity">
<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">

</ 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>

Adicin de Nios Vistas a la GridLayout


Visitas infantiles se pueden agregar a un GridLayout declarando los elementos dentro de la <GridLayout>
estructura en el archivo XML. Si son declarados no hay valores de fila y columna para un nio que se coloca
automticamente por la clase GridLayout basado en la configuracin del diseo y de la posicin de la vista en
el archivo XML. El siguiente cdigo XML coloca cuatro botones en el GridLayout arriba, con cada vista se
coloca en la esquina superior izquierda de la celda de encapsulacin:
<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"

178

android: layout_height = "wrap_content"


android: columnCount = "2"
android: rowCount = "2"
android: orientacin = "horizontal"
herramientas: context = ". GridLayoutActivity">
<Botn
android: id = "@ + / Identificacin del Button1"
android: layout_gravity = "left | top"
android: text = "Botn" />
<Botn
android: id = "@ + / Identificacin del button2"
android: layout_gravity = "left | top"
android: text = "Botn" />
<Botn
android: id = "@ + / Identificacin del button3"
android: layout_gravity = "left | top"
android: text = "Botn" />
<Botn
android: id = "@ + / Identificacin del button4"
android: layout_gravity = "left | top"
android: text = "Botn" />
</ GridLayout>

La disposicin anterior se representa visualmente como se ilustra en la Figura 19-1:

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:

id = "@ + / Identificacin del button5"


layout_column = "2"
layout_row = "1"
layout_gravity = "left | top"

179

android: text = "Botn" />

Declarando Spanning celular, Gravedad y Mrgenes


El hijo de un GridLayout se puede configurar para abarcar varias clulas usando el androide: layout_rowSpan
y Android: propiedades layout_columnSpan. La gravedad del nio se controla mediante el androide:
propiedad layout_gravity.
En el fragmento de XML a continuacin, una vista del botn est configurado para abarcar 3 columnas y filas
2 y para llenar el espacio disponible tanto horizontal como verticalmente:
<Botn
android:
android:
android:
android:
android:

id = "@ + / Identificacin del button4"


layout_columnSpan = "3"
layout_rowSpan = "2"
layout_gravity = "llenar"
text = "Botn" />

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:

id = "@ + / Identificacin del button3"


layout_gravity = "left | top"
layout_margin = "10DP"
text = "Botn" />

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

android: layout_columnSpan = "2"


android: layout_gravity = "fill_horizontal" />
<Botn
android:
android:
android:
android:
android:
android:

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

20. Una visin general y Android Estudio Ejemplo de


Manejo Android Evento
Mucho se ha cubierto en los captulos anteriores relacionados con el diseo de interfaces de usuario para
aplicaciones de Android. Un rea que todava tiene que ser cubiertos, sin embargo, implica la manera en que
la interaccin de un usuario con la interfaz de usuario desencadena la actividad subyacente para realizar una
tarea. En otras palabras, sabemos por los captulos anteriores cmo crear una interfaz de usuario que
contiene una vista de botn, pero no cmo hacer que algo suceda dentro de la aplicacin, cuando es tocado
por el usuario.
El objetivo principal de este captulo, por lo tanto, es proporcionar una visin general de la gestin de eventos
en aplicaciones de Android junto con un ejemplo de proyecto basado en Android Studio.Una vez que los
fundamentos de la gestin de eventos han sido cubiertos, el captulo siguiente cubrir el manejo en cuanto a
la deteccin de mltiples toques y toque de movimiento toque evento.
Contenido
1 Comprender Eventos Android

2 Usando el androide: Recursos onClick

3 detectores de eventos y mtodos de devolucin de llamada

4 Un ejemplo Manejo de Eventos

5 El diseo de la interfaz de usuario

6 el detector de eventos y mtodo de devolucin de llamada

7 El consumo de Eventos

8 Resumen

Entender Eventos Android


Eventos en Android pueden tomar una variedad de formas diferentes, pero por lo general se generan en
respuesta a una accin exterior. La forma ms comn de los acontecimientos, en particular para los
dispositivos tales como tabletas y telfonos inteligentes, implica algn tipo de interaccin con la pantalla
tctil. Tales eventos se clasifican en la categora de eventos de entrada.
El marco Android mantiene una cola de eventos en el que los eventos se colocan a medida que ocurren. Los
eventos se retiran de la cola en un primero en entrar, primero en salir (FIFO),. En el caso de un evento de
entrada tales como un toque en la pantalla, el evento se pasa a la vista posicionado en la ubicacin en la
pantalla donde el contacto se llev a cabo. Adems de la notificacin de eventos, la vista tambin se aprob
una gama de informacin (dependiendo del tipo de evento) acerca de la naturaleza del evento, como las
coordenadas del punto de contacto entre la punta del dedo del usuario y la pantalla.

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.

Utilizando el androide: Recursos onClick


Antes de explorar los detectores de eventos con ms detalle vale la pena sealar que un acceso directo est
disponible cuando lo nico que se requiere es un mtodo de devolucin de llamada que se llama cuando un
usuario "clic" en una visin botn en la interfaz de usuario. Considere la posibilidad de un diseo de interfaz
de usuario que contiene una vista botn denominado Button1 con el requisito de que cuando el usuario toca
el botn, un mtodo llamado buttonClick () declarada en la clase de actividad que se llama. Todo lo que se
requiere para implementar este comportamiento es escribir el mtodo buttonClick () (que toma como
argumento una referencia a la opinin de que desencaden el evento click) y aadir una sola lnea a la
declaracin de la vista botn en el archivo XML. Por ejemplo:
<Botn
android:
android:
android:
android:
android:

id = "@ + / Identificacin del Button1"


layout_width = "wrap_content"
layout_height = "wrap_content"
onClick = "buttonClick"
text = "Haga clic en m" />

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.

Los oyentes de eventos y mtodos de devolucin de llamada


En la actividad de ejemplo se indica ms adelante en este captulo los pasos necesarios para registrar un
detector de eventos y aplicar el mtodo de devolucin de llamada se tratarn en detalle.Antes de hacerlo, sin
embargo, vale la pena tomar algn tiempo para delinear los detectores de eventos que estn disponibles en el
marco de Android y los mtodos de devolucin de llamada asociados a cada uno.

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.

onCreateContextMenuListener - Escucha la creacin de un men contextual como el resultado de una


larga clic. Corresponde al mtodo de devolucin de llamada onCreateContextMenu (). La devolucin de
llamada se pasa al men, la opinin de que recibi el evento y un objeto de contexto men.

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.

Un ejemplo Manejo de Eventos


En el resto de este captulo, vamos a trabajar a travs de la creacin de un proyecto simple Android Estudio
diseado para demostrar la implementacin de un detector de eventos y el mtodo de devolucin de llamada
correspondiente para detectar cuando el usuario ha hecho clic en un botn. El cdigo dentro del mtodo de
devolucin de llamada se actualizar una vista de texto para indicar que el evento ha sido procesado.
Crear un nuevo proyecto en Android de estudio, entrar EventExample en el campo Nombre de la aplicacin y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
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 EventExampleActivity con archivos de diseo y recursos de
men correspondientes nombrados activity_event_example y menu_event_example respectivamente.

185

El diseo de la interfaz de usuario


El diseo de la interfaz de usuario para la clase EventExampleActivity en este ejemplo debe consistir en una
vista RelativeLayout, un botn y un TextView como se ilustra en la Figura 20-1.

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

<? Xml version = "1.0" encoding = "UTF-8"?>


<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
android: id = "@ + / Identificacin del myLayout"
android: layout_width = "fill_parent"
android: layout_height = "fill_parent">
<Botn
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del myButton"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_centerHorizontal = "true"
layout_centerVertical = "true"
text = "Pulse Me" />

<TextView
android:
android:
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del myTextView"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_above = "@ + / Identificacin del myButton"
layout_centerHorizontal = "true"
layout_marginBottom = "41dp"
text = "Estado"
textAppearance = "android:? attr / textAppearanceLarge" />

</ RelativeLayout>

Cambiar al modo de diseo y seleccione la etiqueta de estado en el diseo de la pantalla del


dispositivo. Cuando aparezca el icono de la bombilla, haga clic sobre l y seleccione el mensaje de
advertencia cadena I18N codificado para mostrar el dilogo de Recursos Extraer. En el cuadro de dilogo, el
nombre de la cadena status_string de recursos y haga clic en el botn Aceptar. Repita estos pasos para la
visualizacin por botones, esta vez nombrando el button_string recurso de cadena.
Con el diseo de la interfaz de usuario ya ha concluido, el siguiente paso es registrar el detector de eve ntos y
el mtodo de devolucin de llamada.

El detector de eventos y mtodo de devolucin de llamada


A los efectos de este ejemplo, un OnClickListener necesita ser registrada para la vista myButton. Esto se
logra mediante una llamada al mtodo setOnClickListener () de la vista de botn, que pasa a travs de un
nuevo objeto OnClickListener como argumento y la aplicacin del mtodo de devolucin de llamada onClick
(). Dado que esta es una tarea que slo debe realizarse cuando se crea la actividad, una buena ubicacin es
el mtodo onCreate () de la clase EventExampleActivity.
Si el archivo EventExampleActivity.java ya est abierto en una sesin editor, seleccinelo haciendo clic en la
pestaa en el panel del editor. Alternativamente ubicarlo dentro de la ventana de herramientas Proyecto
navegando a (app -> Java -> com.ebookfrenzy.eventexample -> EventExampleActivity) y haga doble clic en l

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

ejecutarse. El onLongClick () mtodo

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

21. Touch Android y multi-touch control de eventos en


Android Estudio
La mayora de los dispositivos basados en Android utilizan una pantalla tctil como interfaz principal entre el
usuario y el dispositivo. En el captulo anterior introdujo el mecanismo por el cual un toque en la pantalla se
traduce en una accin dentro de una aplicacin de Android corriendo. Hay, sin embargo, mucho ms que
tocar la gestin de eventos de responder a un solo toque del dedo sobre un objeto de vista. La mayora de los
dispositivos Android pueden, por ejemplo, detectar ms de un contacto a la vez. Tampoco son toques
limitados a un solo punto en la pantalla del dispositivo. Toques pueden, por supuesto, ser dinmico como el
usuario desliza uno o ms puntos de contacto a travs de la superficie de la pantalla.
Toques tambin pueden ser interpretados por una aplicacin como un gesto. Consideremos, por ejemplo, que
un golpe horizontal se suelen utilizar para pasar la pgina de un libro electrnico, o cmo un movimiento de
pellizco se puede utilizar para acercar y alejar una imagen que aparece en la pantalla.
El objetivo de este captulo es para resaltar el manejo de los detalles que implican movimiento y para explorar
el concepto de interceptar mltiples toques simultneos. El tema de la identificacin de los gestos distintos se
tratarn en el prximo captulo.
Contenido
1 Interceptar Touch Eventos

2 El objeto MotionEvent

3 acciones Touch Comprensin

4 Manejo de Mltiples Toques

5 Un ejemplo Multi-Touch de aplicaciones

6 El diseo de la interfaz de la actividad del usuario

7 Implementacin del Evento Listener Touch

8 Ejecutar el ejemplo de aplicacin

9 Resumen

Interceptar Eventos Touch


Toque eventos pueden ser interceptados por un objeto vista a travs del registro de un detector de eventos
onTouchListener y la aplicacin del mtodo de devolucin de llamada onTouch correspondiente (). El
siguiente cdigo, por ejemplo, asegura que cualquier toques en una instancia de vista RelativeLayout llamado
myLayout resultado de una llamada al mtodo onTouch ():
myLayout.setOnTouchListener (
nueva RelativeLayout.OnTouchListener () {
onTouch public boolean (Ver v, MotionEvent m) {

192

// Realizar tareas aqu


return true;
}
}
);

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.

Acciones Touch Comprensin


Un aspecto importante de la gestin de eventos tctil implica ser capaz de identificar el tipo de accin
realizada por el usuario. El tipo de accin asociada con un evento se puede conseguir haciendo una llamada
al mtodo del objeto MotionEvent que fue pasado a travs de al mtodo de devolucin de llamada onTouch ()
getActionMasked (). Cuando se produce el primer toque en una vista, el objeto MotionEvent contendr un tipo
de accin de ACTION_DOWN junto con las coordenadas del tacto. Cuando ese contacto se levanta de la
pantalla, se genera un evento ACTION_UP. Cualquier movimiento del contacto entre los acontecimientos
ACTION_DOWN y ACTION_UP estar representada por los acontecimientos ACTION_MOVE.
Cuando ms de un toque se realiza simultneamente en una vista, los toques se conocen como punteros. En
un

escenario

multi-touch,

punteros

comienzan

terminan

con

acciones

de

eventos

de

tipo

ACTION_POINTER_UP y ACTION_POINTER_DOWN respectivamente. Con el fin de identificar el ndice del


puntero que desencaden el evento, el mtodo de devolucin de llamada getActionIndex () del objeto
MotionEvent debe ser llamado.

Manejo de Mltiples Toques


En el captulo anterior comenz a explorar el manejo dentro del estrecho marco de un evento nico toque
evento. En la prctica, la mayora de los dispositivos Android poseen la capacidad de responder a mltiples
toques consecutivos (aunque es importante sealar que el nmero de toques simultneos que pueden ser
detectadas vara dependiendo del dispositivo).
Como se mencion anteriormente, cada toque en una situacin multi-touch es considerado por el marco de
Android sea un puntero. Cada puntero, a su vez, se hace referencia por un valor de ndice y le asigna un

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.

Un Multi-Touch Ejemplo de Aplicacin


La aplicacin de ejemplo creada en el resto de este captulo se har un seguimiento de hasta dos gestos
tctiles como se mueven a travs de una vista de diseo. Como se desencadenan los eventos para cada
contacto, las coordenadas, el ndice y el ID para cada contacto se mostrarn en la pantalla.
Crear un nuevo proyecto en Android de estudio, entrar MotionEvent en el campo Nombre de la aplicacin y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
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 MotionEventActivity con archivos de diseo y recursos de
men correspondientes nombrados activity_motion_event y menu_motion_event respectivamente.
Haga clic en el botn Finalizar para iniciar el proceso de creacin del proyecto.

El diseo de la interfaz de la actividad del usuario


La interfaz de usuario para la actividad exclusiva de la aplicacin debe consistir en una vista RelativeLayout
que contiene dos objetos TextView. Dentro de la ventana de herramientas del proyecto, vaya a la aplicacin > res -> trazado y haga doble clic en el archivo de recursos de diseo activity_motion_event.xml para cargar

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:

id = "@ + / Identificacin del textView2"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_centerHorizontal = "true"
layout_centerVertical = "true"
text = "Toque Dos Status" />

<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>

Cambiar al modo de diseo y seleccione el TextView superior en el diseo de la pantalla del


dispositivo. Cuando aparezca el icono de la bombilla, haga clic sobre l y seleccione el mensaje de
advertencia cadena I18N codificado para mostrar el dilogo de Recursos Extraer. En el cuadro de dilogo, el
nombre de la cadena status1_string de recursos y haga clic en el botn Aceptar. Repita estos pasos para el
segundo componente TextView, esta vez nombrando el status2_string recurso de cadena.

195

Figura 21-1

Implementacin del Evento Listener Touch

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);

Ejecutar la aplicacin Ejemplo


Desde el entorno de emulador de Android no soporta multi-touch, compilar y ejecutar la aplicacin en un
dispositivo Android fsica. Una vez lanzado, el experimento con toques simples y mltiples en la pantalla y
tenga en cuenta que la actualizacin de vistas de texto para reflejar los acontecimientos como se ilustra en la
Figura 21-2:

199

Figura 21-2

Resumen

Actividades recibir notificaciones de eventos de toque al registrar un detector de eventos onTouchListener e


implementar el mtodo de devolucin de llamada onTouch () que, a su vez, se pasa un objeto MotionEvent
cuando se le llama por el tiempo de ejecucin de Android. Este objeto contiene informacin sobre el tacto,
tales como el tipo de evento tctil, las coordenadas del tacto y un recuento del nmero de toques actualmente
en contacto con la vista. Cuando mltiples toques estn involucrados, cada punto de contacto se conoce
como un puntero con cada uno asignado un ndice y un ID. Mientras que el ndice de un toque puede cambiar
de un evento a otro, el ID no cambiar hasta que termine el toque.
En este captulo se ha trabajado a travs de la creacin de una aplicacin para Android ejemplo diseada
para mostrar las coordenadas y las acciones tipo de hasta dos toques simultneos en una pantalla del
dispositivo.
Tener toques cubiertos en general, el siguiente captulo (titulado Deteccin Comn Gestos usando Android
Studio y el Gesto Detector Clase ) se ver ms a fondo en la pantalla tctil de la gestin de eventos a travs
de la aplicacin de reconocimiento de gestos.

200

22. La deteccin de gestos comunes que utilizan Android


Studio y el Gesto Detector Clase
El trmino "gesto" se utiliza para definir una secuencia contigua de las interacciones entre la pantalla tctil y el
usuario. Un gesto tpico comienza en el punto en que la pantalla es primero toc y termina cuando el ltimo
dedo o dispositivo de puntero sale de la superficie de la pantalla. Cuando se utiliza correctamente, los gestos
pueden implementarse como una forma de comunicacin entre el usuario y la aplicacin. El birlar mociones
para pasar las pginas de un libro electrnico o un movimiento pellizcos que involucra a dos toques para
acercar o alejar una imagen son los principales ejemplos de las formas en que los gestos se pueden utilizar
para interactuar con una aplicacin.
El SDK de Android proporciona mecanismos para la deteccin de ambos gestos comunes y personalizados
dentro de una aplicacin. Gestos comunes implican interacciones como un grifo, doble toque, pulsacin larga
o una mocin deslizar ya sea en horizontal o una direccin vertical (denominada en la nomenclatura Android
como una aventura).
El objetivo de este captulo es explorar el uso de la clase GestureDetector Android para detectar gestos
comunes que se realizan en la pantalla de un dispositivo Android. El siguiente captulo, titulado El
reconocimiento de gestos de aplicacin Android personalizada con Android Estudio , cubrir la deteccin de
ms complejos, los gestos personalizados tales como movimientos circulares y pellizcos.
Contenido

1 La implementacin Deteccin Gesto Comn

2 Creacin de un proyecto de deteccin de gestos Ejemplo

3 Implementacin de la clase Listener

4 Creacin de la GestureDetectorCompat Instancia

5 Aplicacin de la (Mtodo onTouchEvent)

6 Prueba de la aplicacin

7 Resumen

La implementacin de Deteccin Gesto Comn


Cuando un usuario interacta con la pantalla de un dispositivo Android, el mtodo onTouchEvent () de la
aplicacin actualmente activa es llamado por el sistema y se hace pasar objetos MotionEvent que contienen
datos sobre el contacto del usuario con la pantalla. Estos datos pueden interpretarse de identificar si el
movimiento en la pantalla coincide con un gesto comn, como un grifo o un golpe. Esto puede lograrse con
muy poco esfuerzo de programacin haciendo uso de la clase Android GestureDetectorCompat. Esta clase
est diseada especficamente para recibir informacin de eventos de movimiento de la aplicacin y para
activar las llamadas a mtodos basados en el tipo de gesto comn, en su caso, detectado.

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.

Creacin de un proyecto de deteccin de gestos Ejemplo


El objetivo de este proyecto es detectar la gama de gestos comunes actualmente soportados por la clase
GestureDetectorCompat y para mostrar la informacin de estado para el usuario que indica el tipo de gesto
que se ha detectado.
Crear un nuevo proyecto en Android de estudio, entrar CommonGestures en el campo Nombre de la
aplicacin y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn
Siguiente.
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 CommonGesturesActivity con unos correspondientes
archivos de diseo y de recursos men nombrados activity_common_gestures y menu_common_gestures
respectivamente.
Haga clic en el botn Finalizar para iniciar el proceso de creacin del proyecto.
Una vez que el nuevo proyecto se ha creado, vaya a la aplicacin -> res -> diseo -> archivo
activity_common_gestures.xml en la ventana de herramientas del proyecto y haga doble clic en l para
cargarlo en la herramienta Diseador.

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.

La implementacin de la clase Listener


Como se ha sealado anteriormente, es necesario crear una clase que implementa la interfaz
GestureDetector.OnGestureListener

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;

public class CommonGesturesActivity extiende ActionBarActivity


implementa GestureDetector.OnGestureListener,
GestureDetector.OnDoubleTapListener {
privada gestureText TextView;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_common_gestures);
gestureText =
(TextView) findViewById (R.id.gestureStatusText);
}
.
.
.
}

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;

public class CommonGesturesActivity extiende ActionBarActivity


implementa GestureDetector.OnGestureListener,
GestureDetector.OnDoubleTapListener {
privada gestureText TextView;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_common_gestures);
gestureText =
(TextView) findViewById (R.id.gestureStatusText);
}
@ Override
onDown public boolean (evento MotionEvent) {
gestureText.setText ("onDown");
return true;
}
@ Override
onFling public boolean (MotionEvent event1, MotionEvent event2,
flotar velocityX, velocityY float) {
gestureText.setText ("onFling");
return true;
}
@ Override
public void onLongPress (evento MotionEvent) {
gestureText.setText ("onLongPress");
}
@ Override
onscroll public boolean (MotionEvent e1, e2 MotionEvent,
flotar distanceX, flotar distanceY) {
gestureText.setText ("onscroll");
return true;
}
@ Override
public void onShowPress (evento MotionEvent) {
gestureText.setText ("onShowPress");
}
@ Override
onSingleTapUp public boolean (evento MotionEvent) {
gestureText.setText ("onSingleTapUp");

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.

Creacin de la GestureDetectorCompat Instancia


Con la clase de actividad ahora actualizado para implementar las interfaces de escucha, el siguiente paso es
crear una instancia de la clase GestureDetectorCompat. Dado que esto slo debe realizarse una vez en el
punto que se crea la actividad, el mejor lugar para este cdigo est en el mtodo onCreate (). Desde tambin
queremos detectar dobles grifos, el cdigo tambin tiene que llamar al mtodo setOnDoubleTapListener () de
la instancia GestureDetectorCompat:

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

public class CommonGesturesActivity extiende ActionBarActivity


implementa GestureDetector.OnGestureListener,
GestureDetector.OnDoubleTapListener {
privada gestureText TextView;
privada gDetector GestureDetectorCompat;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_common_gestures);
gestureText =
(TextView) findViewById (R.id.gestureStatusText);
this.gDetector = new GestureDetectorCompat (este, esta);
gDetector.setOnDoubleTapListener (this);
}
.
.
}

La aplicacin de la onTouchEvent Mtodo ()

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

23. La implementacin de reconocimiento de gestos


Android personalizada con Android Estudio
En el captulo anterior mir los pasos involucrados en la deteccin de lo que se conoce como "gestos
comunes" desde una aplicacin Android. En la prctica, sin embargo, un gesto puede concebiblemente
involucrar a casi cualquier secuencia de movimientos tctiles en la pantalla de un dispositivo Android. En
reconocimiento de este hecho, el SDK de Android permite gestos personalizados de casi cualquier naturaleza
para ser definidos por el desarrollador de aplicaciones y se utilizan para activar eventos cuando es realizada
por el usuario. Este es un proceso de varias etapas, cuyos detalles son el tema de este captulo.
Contenido

1 El Gesto Android Application Builder

2 El GestureOverlayView Clase

3 La deteccin de gestos

4 Identificar gestos especficos

5 Creacin y ejecucin de la Gesture Application Builder

6 Creacin de un archivo Gestos

7 Extraer el archivo Gestos de la tarjeta SD

8 Crear el proyecto Ejemplo

9 Adicin de los Gestos archivo al proyecto

10 El diseo de la interfaz de usuario

11 Carga del Archivo Gestos

12 Registro del Oyente Evento

13 Implementacin del Mtodo onGesturePerformed

14 Prueba de la aplicacin

15 Configuracin de la GestureOverlayView

16 Gestos Interceptar

17 Deteccin de gestos Pinch

18 Un Gesto Pinch Ejemplo de proyecto

19 Resumen

El Gesto Android Application Builder


El SDK de Android permite a los desarrolladores disear gestos personalizados que luego se almacenan en
un archivo gesto incluido con un paquete de aplicaciones Android. Estos archivos gesto personalizado se
crean ms fcilmente utilizando la aplicacin Generador de Gesto que se incluye con el paquete de muestras
suministrado como parte del SDK de Android. La creacin de un archivo de gestos implica el lanzamiento de

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.

La identificacin de los gestos especficos


Cuando se detecta un gesto, el mtodo de devolucin de llamada onGesturePerformed se llama y pasa como
argumentos una referencia al objeto GestureOverlayView en que se detect el gesto, junto con un objeto
Gesto que contiene informacin sobre el gesto.
Con el acceso al objeto de gestos, el GestureLibrary puede ser utilizado para comparar el gesto detectado a
las contenidas en los gestos archivo previamente cargado en la aplicacin. El GestureLibrary informa la
probabilidad de que el gesto realizado por el usuario coincide con una entrada en el archivo de gestos
mediante el clculo de una puntuacin de prediccin para cada gesto.Una puntuacin de prediccin de 1,0 o
superior es generalmente aceptado para ser un buen partido entre un gesto almacenada en el archivo y la
realizada por el usuario en la pantalla del dispositivo.

Creacin y ejecucin de la Application Builder Gesto


La aplicacin Constructor Gesto se incluye por defecto con el perfil emulador AVD para la mayora de las
versiones del SDK. No es, sin embargo, preinstalado en la mayora de los dispositivos Android fsicas. Si la
utilidad es pre-instalado, aparecer en la lista junto con las otras aplicaciones instaladas en el dispositivo o
instancia AVD. En el caso de que no est instalado, se incluye el cdigo fuente de la utilidad entre los
ejemplos de SDK de Android estndar y por lo tanto puede ser importado como un proyecto Android Studio y
compila y ejecuta en cualquier dispositivo o emulador 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.

Creacin de un archivo Gestos


Una vez que la solicitud Constructor Gesto ha cargado, se debe indicar que no hay gestos an no se han
creado. Para crear un nuevo gesto, haga clic en el botn Agregar gesto situada en la parte inferior de la
pantalla del dispositivo, introduzca el nombre de Crculo Gesto en el cuadro de texto Nombre y luego "dibujar"
un gesto con un movimiento circular en la pantalla, como se ilustra en la Figura 23 -1. Suponiendo que el
gesto aparece como requerida (representada por la lnea amarilla en la pantalla del dispositivo), haga clic en
el botn Done para aadir el gesto para el archivo de gestos:

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

Extraer el archivo de gestos de la tarjeta SD


Como cada gesto fue creado dentro de la aplicacin Generador de Gesto, que esta en un archivo llamado
gestos ubicados en la tarjeta SD del emulador o dispositivo en el que la aplicacin se ejecuta. Antes de este
archivo se puede agregar a un proyecto Android de estudio, sin embargo, debe primero ser quit la tarjeta SD
y se guarda en el sistema de archivos local. Esto se logra ms fcilmente mediante el uso de la herramienta
de lnea de comandos adb. Abra una ventana del smbolo del Terminal o Comando, por lo tanto, y ejecutar el
siguiente comando:
adb devices

En el caso de que el comando adb no se encuentra, consulte Configuracin de un entorno de desarrollo


Estudio Android para obtener orientacin sobre la adicin de este a la variable de entorno PATH de su
sistema.
Una vez ejecutado, el comando listar todos los dispositivos fsicos activos e instancias AVD conectados al
sistema. La siguiente salida, por ejemplo, indica que tanto un dispositivo fsico y un emulador de AVD se han
detectado en el sistema de equipo de desarrollo:
Lista de dispositivos conectados
dispositivo emulador-5554
Dispositivo 74CE000600000001

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.

Crear el proyecto Ejemplo


Crear un nuevo proyecto en Android de estudio, entrar CustomGestures en el campo Nombre de la aplicacin
y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
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 CustomGesturesActivity con archivos de diseo y de
recursos men nombrados activity_custom_gestures y menu_custom_gestures correspondiente.
Haga clic en el botn Finalizar para iniciar el proceso de creacin del proyecto.

Adicin de los Gestos archivo al proyecto


Dentro de la ventana de la herramienta Android Proyecto de estudio, busque y haga clic en la carpeta res
(ubicado debajo app) y seleccione Nuevo -> Directorio en el men resultante. En el cuadro de dilogo Nuevo
Directorio, introduzca cruda como el nombre de la carpeta y haga clic en el botn Aceptar. Uso de la utilidad
de explorador de archivos apropiado para su tipo de sistema operativo, localizar los gestos archivo
previamente extrados de la tarjeta SD y copiar y pegar en la carpeta nueva prima en la ventana de
herramientas del proyecto.

El diseo de la interfaz de usuario


Esta aplicacin ejemplo llama para una interfaz de usuario muy simple que consiste en una vista LinearLayout
con un GestureOverlayView en capas en la parte superior de la misma para interceptar cualquier gestos
realizados por el usuario. Localice la aplicacin -> res -> diseo -> archivo activity_custom_gestures.xml y
haga doble clic en l para cargarlo en la herramienta Diseador.
Por defecto, Android Studio ha proporcionado un componente RelativeLayout como el elemento raz del
diseo de la interfaz de usuario por lo que este tendr que ser eliminado y reemplazado con un LinearLayout.
Cambie la herramienta Diseador de modo de texto utilizando la ficha Texto a lo largo del borde inferior del
panel y modificar el XML para el diseo para que coincida con que en la siguiente lista:
<LinearLayout
android: orientacin = "vertical"
android: layout_width = "fill_parent"
android: layout_height = "fill_parent"
xmlns: android = "http://schemas.android.com/apk/res/android">
</ LinearLayout>

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>

Carga del archivo Gestos


Ahora que el archivo de gestos se ha aadido al proyecto, el siguiente paso es escribir algo de cdigo para
que se cargue el archivo cuando la actividad se pone en marcha. Para los fines de este proyecto, el cdigo
para lograr este se colocar en el mtodo onCreate () de la clase CustomGesturesActivity situado en el
archivo de fuente CustomGesturesActivity.java como sigue:
com.ebookfrenzy.customgestures paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
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;
public
class
CustomGesturesActivity
OnGesturePerformedListener {

extiende

ActionBarActivity

privada gLibrary GestureLibrary;


@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_custom_gestures);

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).

Registrando el detector de eventos


Con el fin de la actividad para recibir la notificacin de que el usuario ha realizado un gesto en la pantalla, es
necesario registrar el detector de eventos OnGesturePerformedListener en la vista gLayout, una referencia a
la que se puede obtener con el mtodo findViewById como se indica en el siguiente cdigo fragmento:
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_custom_gestures);
gLibrary =
GestureLibraries.fromRawResource (esto, R.raw.gestures);
if (! gLibrary.load ()) {
acabado ();
}
GestureOverlayView GOverlay =
(GestureOverlayView) findViewById (R.id.gOverlay);
gOverlay.addOnGesturePerformedListener (this);
}

Implementacin del Mtodo onGesturePerformed


Todo lo que queda antes de que una prueba de funcionamiento inicial de la aplicacin se puede realizar es
implementar el mtodo de devolucin de llamada OnGesturePerformed. Este es el mtodo que se llama
cuando un gesto se realiza en el ejemplo GestureOverlayView:
com.ebookfrenzy.customgestures paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;

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

privada gLibrary GestureLibrary;


@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_custom_gestures);
gLibrary =
GestureLibraries.fromRawResource (esto, R.raw.gestures);
if (! gLibrary.load ()) {
acabado ();
}
GestureOverlayView GOverlay =
(GestureOverlayView) findViewById (R.id.gOverlay);
gOverlay.addOnGesturePerformedListener (this);
}
public void superposicin onGesturePerformed (GestureOverlayView, Gesto
gesto) {
ArrayList <Prediccin> predicciones =
gLibrary.recognize (gesto);
si (predictions.size ()> 0 && predictions.get (0) .score> 1,0) {
Accin String = predictions.get (0) .name;
Toast.makeText (esto, accin, Toast.LENGTH_SHORT) .Show ();
}
}
.
.
.
}

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.

Configuracin del GestureOverlayView


Por defecto, el GestureOverlayView est configurado para mostrar lneas amarillas durante gestos y
reconocer slo gestos de trazo individuales. Gestos Multi-accidente cerebrovascular pueden ser detectados
mediante el establecimiento de el androide: propiedad gestureStrokeType al mltiple.
Del mismo modo, el color utilizado para dibujar reconocido y gestos no reconocidos se puede definir a travs
del androide: gestureColor y android: propiedades uncertainGestureColor. Por ejemplo, para ocultar las lneas
gestuales y reconocer gestos multi-ictus, modifique el archivo activity_custom_gestures.xml en el proyecto de
ejemplo de la siguiente manera:
<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"

218

android: id = "@ + / Identificacin del GOverlay"


android: layout_gravity = "center_horizontal"
android: gestureColor = "# 00000000"
android: uncertainGestureColor = "# 00000000"
android: gestureStrokeType = "mltiple">
</android.gesture.GestureOverlayView>
</ LinearLayout>

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.

La deteccin de gestos Pinch


Antes de pasar por el manejo tctil de reconocimiento general y el gesto, en particular, el ltimo tema de este
captulo es el de la manipulacin de los gestos de pellizco. Si bien es posible crear y detectar una amplia
gama de gestos utilizando los pasos descritos en las secciones anteriores de este captulo es, de hecho, no
es posible detectar un gesto de pellizco (donde se utilizan dos dedos en un movimiento de estiramiento y
pellizcos, tpicamente para acercar y alejar de una visin o imagen) utilizando las tcnicas descritas hasta
ahora.
El mtodo ms simple para detectar gestos de pellizco es utilizar la clase ScaleGestureDetector Android. En
trminos generales, la deteccin de los gestos de pellizco implica los tres pasos siguientes:
1. Declaracin de una nueva clase que implementa la interfaz SimpleOnScaleGestureListener incluyendo el
onScale requerido (), onScaleBegin () y onScaleEnd () los mtodos de devolucin de llamada. 2. Creacin de
una instancia de la clase ScaleGestureDetector, pasando por una instancia de la clase creada en el paso 1
como argumento. 3. Implementar el mtodo de devolucin de llamada onTouchEvent () sobre la actividad que
encierra el cual, a su vez, llama al mtodo onTouchEvent () de la clase ScaleGestureDetector. En el resto de
este captulo, vamos a crear un ejemplo muy sencillo diseado para demostrar la aplicacin de
reconocimiento de gestos pizca.

Un gesto de pellizcar Ejemplo de proyecto


Crear un nuevo proyecto en Android de estudio, entrar PinchExample en el campo Nombre de la aplicacin y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.

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

24. Introduccin al uso de fragmentos en Android Estudio


A medida que avance a travs de los captulos de este libro se convertir cada vez ms evidente que muchos
de los conceptos de diseo detrs del sistema de Android fueron concebidos con el objetivo de promover la
reutilizacin de, y la interaccin entre los diferentes elementos que componen una aplicacin. Una de esas
reas que ser explorado en este captulo implica el uso de fragmentos. En este captulo se ofrecer una
visin general de los conceptos bsicos de fragmentos en trminos de lo que son y cmo pueden ser creados
y utilizados dentro de las aplicaciones. El siguiente captulo trabajar a travs de un tutorial diseado para
mostrar fragmentos en la accin en el desarrollo de aplicaciones en el Android de estudio, incluida la
aplicacin de la comunicacin entre los fragmentos.
Contenido

1 Qu es un fragmento?

2 Creacin de un fragmento

3 Adicin de un fragmento de una actividad utilizando el archivo XML Layout

4 Adicin y gestin de Fragmentos de Cdigo

5 Gestin de eventos Fragmento

6 Ejecucin Fragmento Comunicacin

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.

Adicin de un fragmento de una actividad utilizando el archivo XML


Layout
Los fragmentos pueden ser incorporados en una actividad ya sea por la escritura de cdigo Java o mediante
la incorporacin de fragmento en el archivo de diseo XML de la actividad.Independientemente del enfoque
utilizado, un punto clave a tener en cuenta es que cuando la biblioteca de soporte se utiliza para la
compatibilidad con versiones de Android de mayor edad, las actividades que utilizan fragmentos deben
implementarse como una subclase de FragmentActivity lugar de la clase de actividad tradicional:
com.example.myfragmentdemo paquete;
android.os.Bundle importacin;
android.support.v4.app.FragmentActivity importacin;
android.view.Menu importacin;
public class FragmentDemoActivity extiende FragmentActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_fragment_demo);
}
@ Override
public boolean onCreateOptionsMenu (men Men) {
getMenuInflater (). inflar (R.menu.activity_fragment_demo,
men);
return true;
}
}

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

Adicin y Gestin de Fragmentos de Cdigo


La facilidad de la adicin de un fragmento a una actividad a travs de archivo de diseo XML de la actividad
llega en el coste de la actividad no ser capaz de eliminar el fragmento en tiempo de ejecucin. Con el fin de
lograr el control dinmico de fragmentos durante el tiempo de ejecucin, esas actividades deben agregarse a
travs de cdigo. Esto tiene la ventaja de que los fragmentos se pueden aadir, eliminar e incluso hizo para
reemplazar el uno al otro de forma dinmica mientras la aplicacin se est ejecutando.

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

FragmentTwo secondFragment = new FragmentTwo ();


transaction.replace (R.id.LinearLayout1, secondFragment);
transaction.addToBackStack (null);
transaction.Commit ();

Gestin de eventos Fragmento


Como se mencion anteriormente, un fragmento es muy parecido a un sub-actividad con su propio diseo,
clase y ciclo de vida. Los componentes de vista (como botones y vistas de texto) dentro de un fragmento son
capaces de generar eventos al igual que los de una actividad regular. Esto plantea la cuestin de qu clase
recibe un evento desde un punto de vista en un fragmento; el fragmento de s mismo, o de la actividad en la
que est integrado el fragmento. La respuesta a esta pregunta depende de cmo se declara el controlador de
eventos.
En el captulo titulado Una visin general y Android Estudio Ejemplo de Android Manejo de Eventos , se
discutieron dos enfoques para la gestin de eventos. El primer mtodo consiste en configurar un detector de
eventos y el mtodo de devolucin de llamada en el cdigo de la actividad. Por ejemplo:
Botn Botn = (Button) findViewById (R.id.myButton);
button.setOnClickListener (
nueva Button.OnClickListener () {
public void onClick (Ver v) {
// Cdigo que se lleva a cabo cuando
// Se hace clic en el botn
}
}
);

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:

id = "@ + / Identificacin del Button1"


layout_width = "wrap_content"
layout_height = "wrap_content"
onClick = "onClick"
text = "Haga clic en m" />

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.

Ejecucin Fragmento Comunicacin


Una vez que uno o ms fragmentos estn incrustados dentro de una actividad, las posibilidades son buenas
de que alguna forma de comunicacin deber tener lugar tanto entre los fragmentos y la actividad y entre un
fragmento y otro. De hecho, los fragmentos no deben comunicarse directamente entre s. Toda la
comunicacin debe tener lugar a travs de la actividad de encapsulacin.

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

activityCallback.onButtonClick (arg1, arg2);


}

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

25. Usando fragmentos en Android Studio - Un Ejemplo


Como se indica en el captulo anterior, fragmentos proporcionan un mecanismo conveniente para la creacin
de mdulos reutilizables de funcionalidad de la aplicacin que consta de dos secciones de una interfaz de
usuario y el comportamiento correspondiente. Una vez creados, los fragmentos se pueden incrustar dentro de
las actividades.
Despus de haber explorado la teora general de los fragmentos en el captulo anterior, el objetivo de este
captulo es el de crear un ejemplo de aplicacin de Android utilizando Android Estudio diseado para
demostrar los pasos reales que participan tanto en la creacin y el uso de fragmentos, as como la
implementacin de la comunicacin entre un fragmento y otro dentro de una actividad.
Contenido

1 Sobre el Fragmento Ejemplo de Aplicacin

2 Crear el proyecto Ejemplo

3 Creacin de la Primera Disposicin Fragmento

4 Creacin de la Primera Clase Fragmento

5 Creacin de la Segunda Disposicin Fragmento

6 Adicin de los fragmentos de la Actividad

7 Realizacin de la barra de herramientas Fragmento Hable con la Actividad

8 Hacer el Talk Actividad al fragmento de texto

9 Prueba de la aplicacin

10 Resumen

Sobre el Fragmento Ejemplo de Aplicacin


La aplicacin creada en este captulo consistir en una sola actividad y dos fragmentos. La interfaz de usuario
para el primer fragmento contendr una barra de herramientas de tipo consisten en una vista EditarTexto, un
SeekBar y un botn, todos contenidos dentro de una vista RelativeLayout. El segundo fragmento constar
nicamente de un objeto TextView, tambin contenida dentro de una vista RelativeLayout.
Los dos fragmentos se incrustan dentro de la actividad principal de la aplicacin y de comunicaciones
implementada de forma que cuando se pulsa el botn en el primer fragmento, el texto entr en la vista
EditarTexto aparecer en el TextView del segundo fragmento usando un tamao de fuente dictada por la
posicin de la SeekBar en el primer fragmento.

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.

Crear el proyecto Ejemplo


Crear un nuevo proyecto en Android de estudio, entrar FragmentExample en el campo Nombre de la
aplicacin y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn
Siguiente.
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 FragmentExampleActivity con archivos de diseo y recursos
de

men

correspondientes

nombrados

activity_fragment_example

menu_fragment_example

respectivamente.
Haga clic en el botn Finalizar para iniciar el proceso de creacin del proyecto.

Creacin de la Primera Disposicin Fragmento


El siguiente paso es crear la interfaz de usuario para el primer fragmento que se utilizar dentro de nuestra
actividad.
Esta interfaz de usuario, por supuesto, residir en un archivo de diseo de XML para empezar, vaya hasta la
carpeta de diseo ubicado debajo de aplicacin -> res en la ventana de herramientas del proyecto. Una vez
localizado, haga clic en la entrada de diseo y seleccione Nuevo -> opcin del men archivo de recursos de
diseo como se ilustra en la Figura 25-1:

232
Figura 25-1

En el cuadro de dilogo resultante, nombre el toolbar_fragment diseo y cambiar el elemento raz de


LinearLayout a RelativeLayout antes de hacer clic en Aceptar para crear el nuevo archivo de recursos.
El nuevo archivo de recursos aparecer dentro de la herramienta Diseador listos para ser diseado. Cambie
el Diseador de modo de texto y modificar el XML para que se lea como se indica en la siguiente lista para
agregar tres nuevos elementos de la vista a la disposicin:
<? 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
android:
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del Button1"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_below = "@ + / Identificacin del seekBar1"
layout_centerHorizontal = "true"
layout_marginTop = "17dp"
text = "texto del cambio" />

<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:

id = "@ + / Identificacin del seekBar1"


layout_width = "match_parent"
layout_height = "wrap_content"
layout_alignParentLeft = "true"
layout_below = "@ + / Identificacin del editText1"
layout_marginTop = "14dp" />

</ 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

Creacin de la Primera Clase Fragmento


Adems de un diseo de interfaz de usuario, un fragmento tambin tiene que tener una clase asociada a ella
para hacer el trabajo real detrs de las escenas. Aadir una clase para este fin al proyecto desplegando la
aplicacin -> carpeta de Java bajo el proyecto FragmentExample en la ventana de herramientas del proyecto
y hacer clic derecho sobre el nombre del paquete dado al proyecto cuando se cre (en este caso
com.ebookfrenzy. fragmentexample). En el men resultante, seleccione la Nueva opcin -> Clase Java. En el
cuadro de dilogo Crear nueva clase resultante, nombrar el ToolbarFragment clase y haga clic en Aceptar
para crear la nueva clase.
Una vez que la clase se ha creado, se debe, por defecto, aparecer en el panel de edicin en el que se lea
como sigue:
com.ebookfrenzy.fragmentexample paquete;
/ **
* Creado por <nombre> en <fecha>.
* /
public class ToolbarFragment {
}

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.

La creacin de la Segunda Disposicin Fragmento


Aadir un segundo archivo nuevo recurso diseo XML Android al proyecto, la seleccin una vez ms un
RelativeLayout como el elemento raz. Nombre del text_fragment diseo y haga clic en Aceptar. Cuando las
cargas de diseo en la herramienta de diseo, cambiar al modo de texto y modificar el cdigo XML para
agregar un TextView a la disposicin fragmento de la siguiente manera:
<? 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">
<TextView
android:
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del textView1"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_centerHorizontal = "true"
layout_centerVertical = "true"
text = "Fragmento Dos"
textAppearance = "android:? attr / textAppearanceLarge" />

</ 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.

Adicin de los fragmentos para la Actividad


La actividad principal de la aplicacin tiene asociado un archivo de diseo XML denominado
activity_fragment_example.xml. A los efectos de este ejemplo, se aadirn los fragmentos a la actividad
mediante el <fragmento> elemento dentro de este archivo. Uso de la ventana de herramientas del proyecto,
vaya a la aplicacin -> res -> seccin de diseo del proyecto FragmentExample y haga doble clic en el archivo
activity_fragment_example.xml para cargar en la herramienta Android Studio Designer.
Con la herramienta de diseo en modo de diseo, seleccionar y eliminar el objeto TextView defecto desde el
diseo y desplcese hacia abajo la paleta hasta que la seccin personalizada est a la vista. Haga clic en el
<fragmento> entrada para mostrar una lista de los fragmentos disponibles dentro del proyecto actual como se
ilustra en la Figura 25-4:

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.

Hacer la barra de herramientas Fragmento Hable con la Actividad


Cuando el usuario toca el botn en la barra de herramientas del fragmento, la clase fragmento va a necesitar
para conseguir el texto desde el punto de vista EditarTexto y el valor actual de la SeekBar y enviarlos al

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:

public class ToolbarFragment extiende Fragmento implementa OnSeekBarChangeListener {


int esttica privada seekvalue = 10;
EditarTexto EditarTexto esttica privada;
ToolbarListener activityCallback;
interfaz pblica ToolbarListener {
onButtonClick void (int posicin, texto String) pblica;
}

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 () ());
}
.
.
.
}

La implementacin anterior resultar en un mtodo denominado onButtonClick () que pertenece a la clase de


actividad que se llama cuando se hace clic en el botn por el usuario. Todo lo que queda, por lo tanto, es
declarar que la clase de actividad implementa la interfaz ToolbarListener recin creado y para poner en
prctica el mtodo onButtonClick ().
Desde el Soporte Biblioteca Android est siendo utilizado para el apoyo fragmento en las versiones de
Android anteriores, la actividad tambin se debe cambiar a la subclase de FragmentActivity lugar de

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.

Hacer el Talk Actividad al fragmento de texto


Como se indica en Introduccin al uso de fragmentos en Android Estudio , una actividad puede comunicarse
con un fragmento mediante la obtencin de una referencia a la instancia de clase fragmento y luego llamar a
los mtodos pblicos en el objeto. Por lo tanto, dentro de la clase TextFragment ahora vamos a poner en
prctica un mtodo pblico nombrados changeTextProperties () que toma como argumentos un entero para el
tamao de fuente y una cadena para el nuevo texto que se mostrar. El mtodo usar estos valores para
modificar el objeto TextView. En el panel de edicin de Android de estudio, localizar y modificar el archivo
TextFragment.java aadir este nuevo mtodo y para agregar cdigo al mtodo onCreateView () para obtener
el ID del objeto TextView:
com.ebookfrenzy.fragmentexample paquete;
android.os.Bundle importacin;
android.support.v4.app.Fragment importacin;
android.view.LayoutInflater importacin;

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);
}
}

Cuando el fragmento TextFragment se coloc en el diseo de la actividad, se le dio un ID de text_fragment. El


uso de este ID, ahora es posible para la actividad para obtener una referencia a la instancia fragmento y
llamar a los changeTextProperties () en el objeto. Edite el archivo FragmentExampleActivity.java y modificar el
mtodo onButtonClick () de la siguiente manera:
public void onButtonClick (int tamao de fuente, texto String) {
TextFragment textFragment =
(TextFragment)
. getSupportFragmentManager () findFragmentById (R.id.text_fragment);
textFragment.changeTextProperties (tamao de fuente, 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

26. Un Maestro Android estudio / Detalle Flujo Tutorial


Una comprensin clara de cmo utilizar fragmentos (como se indica en los captulos anteriores) es esencial
para poder hacer uso de la plantilla de flujo Maestro / Detalle. En este captulo se aplicarn estas habilidades
para explicar el concepto de diseo de la interfaz de usuario Maestro / detalle antes de explora r en detalle los
elementos que conforman la plantilla de flujo de Maestro / Detalle incluido con Android Studio. Por ltimo, un
ejemplo de aplicacin se crear que muestra los pasos involucrados en la modificacin de la plantilla a las
necesidades especficas de los desarrolladores de aplicaciones.
Contenido

1 El Android Maestro / Detalle de Flujo

2 Creacin de un maestro / detalle de Flujo de Actividad

3 La anatoma del Maestro / Detalle Plantilla de Flujo

4 Modificacin del Maestro / Detalle Plantilla de Flujo

5 Cambio del modelo de contenido

6 Cambio del panel Detalle

7 Modificacin de la Clase WebsiteDetailFragment

8 Adicin de permisos Manifest

9 Ejecucin de la aplicacin

10 Resumen

El Android Maestro / Detalle de Flujo


Un flujo de maestro / detalle es un concepto de diseo de interfaz mediante el cual se muestra una lista de
elementos (en adelante, la lista maestra) para el usuario. Al seleccionar un elemento de la lista, informacin
adicional relacionada con ese tema se presenta al usuario dentro de un panel de detalles. Una aplicacin de
correo electrnico podra, por ejemplo, consistir en una lista maestra de mensajes recibidos consistentes en la
direccin del remitente y el asunto del mensaje. Tras la seleccin de un mensaje de la lista principal, el cuerpo
del mensaje de correo electrnico aparecera en el panel de detalles.
El tablet de tamao pantallas de dispositivos Android, la lista maestra aparece en un panel vertical estrecha a
lo largo del borde izquierdo de la pantalla. El resto de la pantalla est dedicada al panel de detalle en un
acuerdo conocido como el modo de dos paneles. Figura 26-1, por ejemplo, muestra el detalle / disposicin de
dos panel principal con tres elementos maestros cotizadas y el contenido del artculo tres que aparecen en el
panel de detalles:

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

Creacin de un maestro / detalle de Flujo de Actividad


En la siguiente seccin de este captulo, los diferentes elementos que componen la plantilla de flujo Maestro /
Detalle sern cubiertos con algn detalle. Esto se logra mejor mediante la creacin de un proyecto mediante
el / la plantilla de flujo Detalle Maestro utilizar mientras se trabaja a travs de la informacin. Este proyecto,
posteriormente, ser utilizado como la base para el tutorial al final del captulo.
Crear un nuevo proyecto en Android de estudio, entrar MasterDetailFlow en el campo Nombre de la aplicacin
y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
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).
Cuando la pantalla de configuracin de la actividad del cuadro de dilogo Nuevo proyecto aparece, seleccione
la opcin Master Flow / detalle como se ilustra en la Figura 26 325 3 antes de hacer clic en Siguiente una vez
ms:

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.

La anatoma del Maestro / Detalle Plantilla de Flujo


Una vez que un nuevo proyecto ha sido creado con la plantilla Master Flow / detalle, una serie de archivos de
recursos Java y XML de diseo se habr creado automticamente. Es importante obtener una comprensin
de estas diferentes archivos con el fin de ser capaz de adaptar la plantilla a las necesidades especficas. Una
revisin del proyecto dentro de la ventana de la herramienta Android Proyecto Estudio revelar los siguientes
archivos, donde <kind_name> se sustituye por el nombre de clase de objetos que se especific cuando el
proyecto fue creado (este ser "Sitio Web" en el caso del ejemplo MasterDetailFlow proyecto):

<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> ListFragment.java - La clase Java que acompaa al activity_ <kind_name> _list.xml


archivo de recursos fragmento. Esta clase contiene una serie de mtodos que sirven para identificar y
resaltar la seleccin actual lista principal del usuario.

<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>.

activity_ <kind_name> _detail.xml - La disposicin de recursos XML que acompaa a la <kind_name>


ActivityDetail.java archivo de clase utilizado en dispositivos de pantalla pequea. Por defecto, este
contiene una instancia FrameLayout al que se aadir elementos de la interfaz de usuario declarados por
el <kind_name> FragmentDetail clase.

<Kind_name> DetailFragment.java - La clase Java que acompaa al fragment_ <kind_name>


_detail.xml archivo de recursos XML. El cdigo de este mtodo carga los datos asociados con la lista
maestra y muestra el contenido de la <kind_name> _detail.xml archivo fragment_ al usuario.

fragment_ <kind_name> _detail.xml - El <kind_name> _detail interfaz de usuario para el panel de


detalle que se muestra en el mtodo de la clase <kind_name> DetailFragment onCreateView (). Por
defecto, este contiene una sola instancia de objeto TextView y se utiliza tanto en dos modos de pantalla y
panel pequeos.

DummyContent.java - Un archivo de clase destinado a proporcionar datos de ejemplo para la


plantilla. Esta clase o bien se puede modificar para satisfacer las necesidades de la aplicacin, o
sustituido en su totalidad. Por defecto, el contenido proporcionado por esta clase consiste simplemente en
una serie de elementos de cuerda.

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

Modificacin del Maestro / Detalle Plantilla de Flujo


Mientras que la estructura de la plantilla de Master Flow / detalle puede parecer confuso al principio, los
conceptos quedarn ms claras como la plantilla predeterminada se modifica en lo que resta de este
captulo. Como resultar evidente, gran parte de la funcionalidad proporcionada por la plantilla puede
permanecer sin cambios durante muchos requisitos de implementacin maestro / detalle.
En el resto de este captulo, el proyecto MasterDetailFlow ser modificado de tal manera que la lista principal
muestra una lista de nombres de sitios web y el panel de detalles alterado para contener un objeto WebView
lugar del TextView actual. Cuando un sitio web se ha seleccionado por el usuario, la pgina web
correspondiente, posteriormente, cargar y mostrar en el panel de detalles.

Cambiar el modelo contenido


El contenido para el ejemplo en su forma actual se define por el archivo de clase DummyContent. Comienza,
por lo tanto, al seleccionar el archivo DummyContent.java (ubicado en la ventana de herramientas de
Proyectos en la aplicacin -> Java -> com.ebookfrenzy.masterdetailflow -> carpeta ficticio) y revisar el
cdigo. En la parte inferior del archivo es una declaracin de una clase llamada DummyItem que actualmente
es capaz de almacenar dos objetos String que representa una cadena de contenido y un ID. El proyecto
actualizado, por el contrario, ser necesario cada objeto material que contiene una cadena de ID, una cadena
para el nombre del sitio web, y una cadena de la direccin URL correspondiente de la pgina web. Para
agregar estas caractersticas, modificar la clase DummyItem para que se lea de la siguiente manera:

public class esttica DummyItem {


Identificacin del public String;
website_name public String;
website_url public String;

256

DummyItem pblica (id String, String website_name,


Website_url String)
{
this.id = Identificacin;
this.website_name = website_name;
this.website_url = website_url;
}
@ Override
public String toString () {
volver website_name;
}
}

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.

Cambio del panel Detalle


La informacin detallada se muestra al usuario cuando se selecciona un elemento de la lista principal est
representada a travs de la disposicin contenida en el archivo fragment_website_detail.xml. Por defecto,
este contiene una visin nica en la forma de un TextView. Desde la clase TextView no es capaz de mostrar

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

Modificacin de la Clase WebsiteDetailFragment


En este punto, el panel de detalle interfaz de usuario ha sido modificado pero la clase Java correspondiente
todava est diseada para trabajar con un objeto TextView en lugar de un WebView.Cargue el cdigo fuente
de esta clase haciendo doble clic en el archivo WebsiteDetailFragment.java en la ventana de herramientas del
proyecto. Dentro del archivo de origen localizar el mtodo onCreateView (), que queda redactado como se
indica en el siguiente listado:

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

pblica Vista onCreateView (inflado LayoutInflater, ViewGroup


contenedor, Bulto 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) {
((WebView) rootView.findViewById (R.id.website_detail))
.loadUrl (mItem.website_url);
}
volver rootView;
}
}

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.

Adicin de permisos Manifest


El paso final es agregar el permiso de Internet a la aplicacin a travs del archivo de manifiesto. Esto
permitir que el objeto WebView para acceder a Internet y descargar pginas web. Busque y cargar el archivo
AndroidManifest.xml en la ventana de herramientas Proyecto (app -> manifiesta) y haga doble clic en l para
cargarlo en el editor. Una vez cargado, aada la lnea permiso adecuado para el archivo:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.example.masterdetailflow.masterdetailflow">
<Usa-permiso android: name = "android.permission.INTERNET" />
<Application
android:
android:
android:
android:

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

27. Creacin y administracin de desbordamiento Mens


en Android Estudio
Un espacio de diseo de la interfaz de usuario que an no ha sido cubierto en este libro se relaciona con el
concepto de mens dentro de una aplicacin Android. Mens proporcionan un mecanismo para ofrecer
opciones adicionales para el usuario ms all de los componentes de vista que estn presentes en el diseo
de interfaz de usuario. Aunque hay un nmero de diferentes sistemas de men disponibles para el
desarrollador de aplicaciones Android, este captulo se centrar en el men de desbordamiento ms
comnmente utilizado.

262
Contenido

1 El men de desbordamiento

2 Creacin de un men de desbordamiento

3 Visualizacin de un men de desbordamiento

4 Respondiendo a Men Elemento Selecciones

5 Creacin de grupos de artculos checkable

6 Crear el proyecto Ejemplo

7 Modificacin del men Descripcin

8 Modificacin de la (Mtodo onOptionsItemSelected)

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

Creacin de un men de desbordamiento


Los elementos de un men se pueden declarar dentro de un archivo XML, que luego se infla y se muestra al
usuario en la demanda. Esto implica el uso de la etiqueta <Men> elemento, que contiene un <item> subelemento para cada elemento del men. El siguiente XML, por ejemplo, define un men que consta de dos
elementos de men relacionados con opciones de color:
<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"
herramientas: contexto =
".MenuExampleActivity">
<Item
android: id = "@ + / Identificacin del menu_red"
android: orderInCategory = "1"
aplicacin: showAsAction = "nunca"
android: title = "@ string / red_string" />
<Item
android: id = "@ + / Identificacin del menu_green"
android: orderInCategory = "2"
aplicacin: showAsAction = "nunca"
android: title = "@ string / green_string" />
</ Men>

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

herramientas: context = ". MainActivity">


<Item android: id = "@ + id / action_settings"
android: title = "@ string / action_settings"
android: orderInCategory = "100"
aplicacin: showAsAction = "no" />

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.

Visualizacin de un men de desbordamiento


Un men de desbordamiento se crea reemplazando el mtodo onCreateOptionsMenu () de la actividad
correspondiente y luego inflar archivo XML del men. Por ejemplo, el cdigo siguiente crea el men de
contenido en un archivo XML men nombrados menu_menu_example:
@ Override
public boolean onCreateOptionsMenu (men Men) {
. getMenuInflater () inflar (R.menu.menu_menu_example, men);
return true;
}

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.

Respondiendo a Men Elemento Selecciones


Una vez que el men se ha implementado, la pregunta que surge es cmo la aplicacin recibe una
notificacin cuando el usuario realiza selecciones de elementos de men. Todo lo que una actividad tiene que
hacer para recibir notificaciones de seleccin de men es reemplazar el mtodo onOptionsItemSelected
(). Pasa como argumento de este mtodo es una referencia al elemento de men seleccionado. El mtodo
GetItemID () puede entonces ser llamado en el elemento para obtener el ID que pueden, a su vez, se utiliza
para identificar qu elemento fue seleccionado. Por ejemplo:
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
switch (item.getItemId ()) {
caso R.id.menu_red:
// Elemento Roja fue seleccionada
return true;
caso R.id.menu_green:
// Elemento verde fue seleccionado
return true;
por defecto:
volver super.onOptionsItemSelected (punto);
}

265

Creacin de grupos de artculos checkable


Adems de configurar los elementos de men independientes, tambin es posible crear grupos de elementos
de men. Esto es de uso particular cuando se crea elementos de men checkable mediante el cual slo uno
de una serie de opciones se pueden seleccionar en cualquier momento. Los elementos de men se pueden
asignar a un grupo envolvindolos en el <grupo> etiqueta. El grupo se declara como comprobable mediante el
androide: propiedad checkableBehavior, estableciendo el valor a cualquiera individual, todas o ninguna. El
siguiente cdigo XML declara que dos elementos de men constituyen un grupo en el que slo un elemento
puede ser seleccionado en un momento dado:
<Xmlns men: android = "http://schemas.android.com/apk/res/android">
<Androide grupo: checkableBehavior = "single">
<Item
android: id = "@ + / Identificacin del menu_red"
android: orderInCategory = "1"
aplicacin: showAsAction = "nunca"
android: title = "@ string / red_string" />
<Item
android: id = "@ + / Identificacin del menu_green"
android: orderInCategory = "2"
aplicacin: showAsAction = "nunca"
android: title = "@ string / green_string" />
</ Grupo>
</ Men>

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);
}
}

Crear el proyecto Ejemplo


Para ver el men de desbordamiento en la accin, crear un nuevo proyecto en Android de estudio, entrar
MenuExample en el campo Nombre de la aplicacin y ebookfrenzy.com como el ajuste de dominio de la
empresa antes de hacer clic en el botn Siguiente.
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 MenuExampleActivity con archivos de diseo y de recursos
men nombrados activity_menu_example y menu_menu_example correspondiente.
Cuando se ha creado el proyecto, vaya a la aplicacin -> res -> carpeta de diseo en la ventana de
herramientas de proyecto y haga doble clic en el archivo activity_menu_example.xml para cargar en la
herramienta Android Studio Designer. Cambie la herramienta al modo, haga doble clic en el fondo de la
disposicin (el rea que representa la vista RelativeLayout) Disear e introduzca layoutView en el campo id
del panel emergente.

Modificacin del men Descripcin


Dentro de la ventana de herramientas del proyecto, busque la aplicacin del proyecto -> res -> Men ->
archivo menu_example.xml y haga doble clic en l para cargarlo en el panel de edicin.Eliminar el elemento
de men Ajustes predeterminados aadido por Android Studio y luego aadir nuevos elementos como grupo
comprobable para que el archivo XML se estructura de la siguiente manera:
<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"
herramientas: context = ". MenuExampleActivity">
<Androide grupo: checkableBehavior = "single">
<Item
android: id = "@ + / Identificacin del menu_red"
android: orderInCategory = "1"
aplicacin: showAsAction = "nunca"
android: title = "@ string / red_string" />
<Item
android: id = "@ + / Identificacin del menu_green"
android: orderInCategory = "2"
aplicacin: showAsAction = "nunca"

267

android: title = "@ string / green_string" />


<Item
android:
android:
android:
android:

id = "@ + / Identificacin del menu_yellow"


orderInCategory = "3"
showAsAction = "nunca"
title = "@ string / yellow_string" />

<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>

"1.0" encoding = "UTF-8"?>


=
=
=
=
=
=
=

"nombre_apl"> MenuExample </ string>


"hello_world"> Hola, mundo! </ String>
"menu_settings"> Configuracin </ string>
"red_string"> Rojo </ string>
"green_string"> Verde </ string>
"yellow_string"> amarillo </ string>
"blue_string"> Blue </ string>

Modificacin de la (Mtodo onOptionsItemSelected)


Cuando los elementos se seleccionan del men, se llama el mtodo reemplazado onOptionsItemsSelected ()
de la actividad de la aplicacin. El papel de este mtodo ser identificar qu elemento fue seleccionado y
cambiar el color de fondo de la vista de diseo con el color correspondiente. Busque y haga doble clic en la
aplicacin -> Java -> com.ebookfrenzy.menuexample - archivo> MenuExampleActivity y modificar el mtodo
de la siguiente manera:
com.ebookfrenzy.menuexample paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.RelativeLayout importacin;
public class MenuExampleActivity extiende ActionBarActivity {
.
.
.

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

28. Animacin de interfaces de usuario en Android


Studio usando el Marco Transiciones
El marco Transiciones Android fue introducido como parte de la versin Android 4.4 KitKat y est diseada
para hacer ms fcil para usted, como un desarrollador de Android, para agregar efectos de animacin a las
opiniones que conforman las pantallas de las aplicaciones. Como se indica en ambos este y posteriores
captulos, efectos animados tales como hacer las visitas en una interfaz de usuario se desvanecen
suavemente dentro y fuera de la vista y deslizarse suavemente a nuevas posiciones en la pantalla se puede
implementar con slo unos simples lneas de cdigo cuando utilizando el marco Transiciones en Android
Studio.
Contenido

1 Presentacin de Transiciones y escenas Android

2 Usando Interpoladores con transiciones

3 Trabajo con transiciones de escena

4 Transiciones y TransitionSets en cdigo personalizado

5 Transiciones y TransitionSets en XML personalizados

6 Trabajar con Interpoladores

7 Creacin de un interpolador personalizada

8 Uso del mtodo beginDelayedTransition

9 Resumen

Presentacin de Transiciones y escenas Android


Las transiciones permiten que los cambios realizados en el diseo y el aspecto de los puntos de vista en una
interfaz de usuario para ser animados en tiempo de ejecucin de la aplicacin. Aunque hay un nmero de
diferentes formas de implementar las transiciones desde dentro de cdigo de la aplicacin, tal vez el ms
potente mecanismo implica el uso de escenas. Una escena representa o bien toda la disposicin de una
pantalla de interfaz de usuario, o un subconjunto de la disposicin (representado por una ViewGroup).
Para llevar a cabo las transiciones que utilizan este enfoque, las escenas estn definidos que reflejan los dos
estados de interfaz de usuario diferentes (que pueden ser considerados como el "antes" y "despus" de
escenas). Una escena, por ejemplo, puede consistir en una edicin de textos, Button y TextView colocado en
la parte superior de la pantalla. La segunda escena podra quitar la vista del botn y mover los objetos
restantes TextEdit y TextView a la parte inferior de la pantalla para hacer espacio para la introduccin de una
instancia MapView. Utilizando el marco de transicin, los cambios entre estas dos escenas pueden ser

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.

Usando Interpoladores con transiciones


El marco Transiciones hace un uso extensivo del marco Animacin Android para aplicar efectos de
animacin. Este hecho es en gran parte incidental al utilizar transiciones ya que la mayora de esta obra
sucede detrs de las escenas, protegiendo as el desarrollador de algunas de las complejidades del marco de
Animacin. Un rea donde algn conocimiento del marco de Animacin es beneficioso cuando se utiliza
Transiciones, sin embargo, implica el concepto de interpoladores.
Interpoladores son una caracterstica del marco Android Animacin que permite animaciones para ser
modificados en un nmero de formas predefinidas. En la actualidad el marco de Animacin proporciona las
siguientes interpoladores, todos los cuales estn disponibles para su uso en la personalizacin de
transiciones:

AccelerateDecelerateInterpolator - Por defecto, la animacin se realiza a una velocidad constante. El


AccelerateDecelerateInterpolator se puede utilizar para causar la animacin para comenzar lentamente y
luego acelerar en el medio antes de desaceleracin hacia el final de la secuencia.

AccelerateInterpolator - Como su nombre lo indica, el AccelerateInterpolator comienza la animacin


lentamente y se acelera a un ritmo determinado, sin desaceleracin al final.

AnticipateInterpolator - El AnticipateInterpolator proporciona un efecto similar al de una honda. La vista


se mueve animados en la direccin opuesta a la animacin configurada por una corta distancia antes de

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.

AnticipateOvershootInterpolator - combina el efecto proporcionado por el AnticipateInterpolator con el


objeto animado rebasamiento y luego regresar a la posicin de destino en la pantalla.

BounceInterpolator - Causas de la vista de animacin para rebotar en destino en su posicin de destino.

CycleInterpolator - Configura la animacin se repita un nmero determinado de veces.

DecelerateInterpolator - El DecelerateInterpolator hace que la animacin para comenzar rpidamente y


luego desacelerarse por un factor especificado ya que se acerca el final.

LinearInterpolator - Se utiliza para especificar que la animacin es que se realiza a una velocidad
constante.

OvershootInterpolator - Causas de la vista animada a rebasar la posicin de destino especificado antes


de regresar. El rebasamiento se puede configurar mediante la especificacin de un valor de tensin.

Como se demostrar en este y posteriores captulos, interpoladores pueden especificarse tanto en los
archivos de cdigo y XML.

Trabajo con transiciones de escena


Las escenas pueden ser representados por el contenido de un archivo de diseo de Android Estudio XML. La
siguiente XML, por ejemplo, podra ser usado para representar una escena que consiste en tres vistas botn
dentro de un padre RelativeLayout:
<? Xml version = "1.0" encoding = "UTF-8"?>
<RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android"
android: id = "@ + / Identificacin del RelativeLayout1"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: orientacin = "vertical">
<Botn
android:
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del Button1"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_alignParentLeft = "true"
layout_alignParentTop = "true"
onClick = "goToScene2"
text = "@ string / one_string" />

<Botn
android:
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del button2"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_alignParentRight = "true"
layout_alignParentTop = "true"
onClick = "goToScene1"
text = "@ string / two_string" />

<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);

Transiciones y TransitionSets en cdigo personalizado


Los ejemplos descritos hasta ahora en este captulo se han utilizado los ajustes de transicin predeterminada
en la que el cambio de tamao, la decoloracin y el movimiento estn animadas utilizando el comportamiento
pre-configurada. Estos pueden ser modificados mediante la creacin de transiciones personalizadas que a
continuacin se hace referencia durante el proceso de transicin. Las animaciones se clasifican ya sea como
lmites de cambio (en relacin a los cambios en la posicin y el tamao de una vista) y se desvanecen
(relativa a la visibilidad o no de una vista).
Una sola transicin puede ser creado como sigue:
MyChangeBounds Transicin = new ChangeBounds ();

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);

Transiciones y TransitionSets en XML personalizados


Mientras transiciones personalizadas se pueden implementar en el cdigo, a menudo es ms fcil hacerlo a
travs de archivos de transicin XML utilizando los <fade> y <> changeBounds etiquetas junto con algunas
opciones adicionales. El siguiente cdigo XML incluye una sola transicin changeBounds:
<? Xml version = "1.0" encoding = "UTF-8"?>
<ChangeBounds />

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

<ChangeBounds android: duracin = "5000">

Mltiples transiciones pueden ser agrupados juntos usando el elemento <transitionSet>:


<? Xml version = "1.0" encoding = "UTF-8"?>
<TransitionSet
xmlns: android = "http://schemas.android.com/apk/res/android">
<Desvanecimiento
android: duracin = "2000"
android: fadingMode = "fade_out" />
<changeBounds
android: duracin = "5000">
<> objetivos
<Androide objetivo: targetId = "@ id / button2" />
</ objetivos>
</ ChangeBounds>
<Desvanecimiento
android: duracin = "2000"
android: fadingMode = "fade_in" />
</ TransitionSet>

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);

De forma predeterminada, los efectos de transicin dentro de un TransitionSet se llevan a cabo en


paralelo. Encomendar al marco de transicin para realizar la secuencialmente animaciones, aadir el
androide apropiado: transitionOrdering alojamiento hasta el elemento transitionSet del archivo de recursos:
<? Xml version = "1.0" encoding = "UTF-8"?>
<TransitionSet
xmlns: android = "http://schemas.android.com/apk/res/android"
android: transitionOrdering = "secuencial">

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.

Trabajar con Interpoladores


Como se discuti previamente, interpoladores se pueden utilizar para modificar el comportamiento de una
transicin en una variedad de formas y pueden ser fijados, bien en cdigo o por medio de la configuracin
dentro de un archivo de recursos XML transicin.
Cuando se trabaja en el cdigo, nuevas instancias del interpolador se pueden crear mediante una llamada al
mtodo constructor de la clase interpolador requerida y, en su caso, pasando a travs de valores para
modificar adicionalmente el comportamiento interpolador:

AccelerateDecelerateInterpolator ()

AccelerateInterpolator (factor de flotacin)

AnticipateInterpolator (tensin de flotacin)

AnticipateOvershootInterpolator (tensin de flotacin)

BounceInterpolator ()

CycleInterpolator (ciclos float)

DecelerateInterpolator (factor de flotacin)

LinearInterpolator ()

OvershootInterpolator (tensin de flotacin)

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

Creacin de un interpolador personalizada


Un interpolador personalizado debe ser declarado en un archivo XML independiente y se almacena en la
carpeta res / anim del proyecto. El nombre del archivo XML se utilizar por el sistema Android como el ID de
recurso para el interpolador personalizado.
Dentro del archivo de recursos XML interpolador costumbre, la sintaxis debera decir lo siguiente:
<? Xml version = "1.0" encoding = "UTF-8"?>
<InterpolatorElement
xmlns:
android
=
android: atributo = "valor" />

"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

Utilizar el mtodo beginDelayedTransition


Tal vez la forma ms simple de animacin interfaz de usuario basada Transicin implica el uso del mtodo
beginDelayedTransition () de la clase TransitionManager. Este mtodo se pasa una referencia a la vista de la
raz de la ViewGroup que representa la escena para la que se requiere la animacin. Los cambios posteriores
en los puntos de vista dentro de esa visin sub entonces sern animados utilizando la configuracin por
defecto de transicin:
myLayout = (ViewGroup) findViewById (R.id.myLayout);
TransitionManager.beginDelayedTransition (myLayout);
// Realizar cambios en la escena

Si se requiere un comportamiento que no sea el comportamiento de la animacin por defecto, simplemente


pasar una transicin configurado adecuadamente o instancia TransitionSet a travs de la llamada al mtodo:
TransitionManager.beginDelayedTransition (myLayout, myTransition);

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

29. Un Android Estudio Transicin Tutorial usando


beginDelayedTransition
En el captulo anterior, titulado Interfaces Animacin de usuario en Android estudio utilizando el Marco de las
transiciones , ofreci una introduccin a la animacin de interfaces de usuario utilizando el marco
Transiciones Android. En este captulo se utiliza un enfoque basado en el tutorial para demostrar transiciones
Android en accin utilizando el mtodo beginDelayedTransition () de la clase TransitionManager.
El siguiente captulo crear un ejemplo ms complejo que utiliza archivos de diseo y archivos de recursos de
transicin para animar la transicin de una escena a otra dentro de una aplicacin.
Contenido

1 Crear el proyecto Android Estudio TransitionDemo

2 Preparacin de los archivos de proyecto

3 Ejecucin beginDelayedTransition Animacin

4 Personalizacin de la Transicin

5 Resumen

Crear el proyecto Android Estudio TransitionDemo


Crear un nuevo proyecto en Android de estudio, entrar TransistionDemo en el campo Nombre de la aplicacin
y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y activar el ajuste de 19 API SDK
mnimo: Android 4.4 (KitKat). Continuar para proceder a travs de las pantallas, que solicita la creacin de
una actividad en blanco denominada TransitionDemoActivity con archivos de diseo y de recursos men
nombrados activity_transition_demo y menu_transition_demo respectivamente.

Preparacin de los archivos de proyecto


El primer ejemplo de animacin de transicin se llevar a cabo mediante el uso del mtodo
beginDelayedTransition () de la clase TransitionManager. El primer paso, sin embargo, es asignar una
identificacin a la vista de los elementos de diseo de los padres en el diseo de la interfaz de usuario creada
para nosotros por Android Studio. Si Android Estudio no se carga automticamente el archivo, busque y haga
doble clic en la aplicacin -> res -> diseo -> archivo activity_transition_demo.xml en el panel de ventana de
herramientas Proyecto para cargar en la herramienta Diseador.Una vez cargado, cambie al modo y haga
doble clic Disear en el fondo del lienzo vista que representa el contenedor RelativeLayout padres y, en el
panel resultante, nombre el diseo de vista @ + / Identificacin del myLayout y pulse Enter para confirmar el
cambio.

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.

Ejecucin beginDelayedTransition Animacin


El objetivo de la fase inicial de este tutorial es implementar un controlador tctil de modo que cuando los grifos
de usuario en el diseo La vista botn se mueve a la esquina inferior derecha de la pantalla y aumenta de
tamao.
Busque el archivo TransitionDemoActivity.java (ubicado en la ventana de herramientas Proyecto en aplicacin
-> Java -> com.ebookfrenzy.transitiondemo) y modificar el mtodo onCreate () para implementar el manejador
onTouch:
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;
public class TransitionDemoActivity extiende ActionBarActivity {
ViewGroup myLayout;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_transition_demo);
myLayout = (ViewGroup) findViewById (R.id.myLayout);
myLayout.setOnTouchListener (
nueva RelativeLayout.OnTouchListener () {
public boolean onTouch (Ver v,
MotionEvent m) {
handleTouch ();
return true;
}
}
);
}
.
.
.
}

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

public void handleTouch () {


Ver view = findViewById (R.id.myButton1);
TransitionManager.beginDelayedTransition (myLayout);
RelativeLayout.LayoutParams
params
=
new
RelativeLayout.LayoutParams
(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule (RelativeLayout.ALIGN_PARENT_RIGHT,
RelativeLayout.TRUE);
params.addRule (RelativeLayout.ALIGN_PARENT_BOTTOM,
RelativeLayout.TRUE);
params.width = 500;
params.height = 350;
view.setLayoutParams (params);
}
.
.
.
}

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

Ver view = findViewById (R.id.myButton1);


Transicin changeBounds = new ChangeBounds ();
changeBounds.setDuration (3000);
changeBounds.setInterpolator (nueva BounceInterpolator ());
TransitionManager.beginDelayedTransition (myLayout,
changeBounds);
TransitionManager.beginDelayedTransition (myLayout);
RelativeLayout.LayoutParams
params
=
new
RelativeLayout.LayoutParams
(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule (RelativeLayout.ALIGN_PARENT_RIGHT,
RelativeLayout.TRUE);
params.addRule (RelativeLayout.ALIGN_PARENT_BOTTOM,
RelativeLayout.TRUE);
params.width = 500;
params.height = 350;
view.setLayoutParams (params);
}

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

30. Ejecucin Escena Android Transiciones - Un Estudio


Android Tutorial
En este captulo se basar en la teora se describe en el captulo titulado Interfaces Animacin de usuario en
Android Studio usando el Marco Transiciones trabajando a travs de la creacin de un proyecto diseado
para demostrar la transicin de una escena a otra utilizando el marco de Transicin Android.
Contenido

1 Una visin general del Proyecto de Transicin de escena

2 Crear el proyecto Android Studio SceneTransitions

3 Identificacin y Preparacin del contenedor raz

4 Diseo de la Primera Escena

5 Diseo de la Segunda Escena

6 Introduccin de la Primera Escena

7 Cargando Escena 2

8 La aplicacin de las transiciones

9 Agregar el archivo de Transicin

10 Carga y Manejo del Set Transition

11 Configuracin de transiciones adicionales

12 Resumen

Una visin general del Proyecto de Transicin de escena


La aplicacin creada en este captulo consistir en dos escenas, cada una representada por un archivo de
recursos de diseo XML. Una transicin se utilizar entonces para animar los cambios de una escena a
otra. La primera escena constar de tres puntos de vista de los botones. La segunda escena contendr dos
de los botones de la primera escena colocado en diferentes ubicaciones en la pantalla. El tercer botn estar
ausente de la segunda escena. Una vez que la transicin ha sido implementado, el movimiento de los dos
primeros botones se anima con un efecto de rebote. El tercer botn se desvanecen suavemente a la vista
como las transiciones de la aplicacin de nuevo a la primera escena de la segunda.

Crear el proyecto SceneTransitions Android Estudio


Crear un nuevo proyecto en Android de estudio, entrar SceneTransitions en el campo Nombre de la aplicacin
y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y activar el ajuste de 19 API SDK
mnimo: Android 4.4 (KitKat). Continuar para proceder a travs de las pantallas, que solicita la creacin de

288
una actividad en blanco denominada SceneTransitionsActivity con archivos de diseo y men nombrados
activity_scene_transitions y menu_scene_transitions correspondiente.

Identificacin y Preparacin del contenedor raz


Cuando se trabaja con transiciones es importante identificar el contenedor raz de las escenas. Este es
esencialmente el contenedor de diseo matriz en la que las escenas se van a mostrar. Cuando se cre el
proyecto, Android Estudio creado un archivo de recursos de diseo en la aplicacin -> res -> carpeta de
diseo llamado activity_scene_transitions.xml y que contiene un nico contenedor RelativeLayout y
TextView. Cuando se inicia la aplicacin, este es el primer diseo que se mostrar al usuario en la pantalla
del dispositivo y para los fines de este ejemplo, el contenedor RelativeLayout dentro de este diseo actuar
como el contenedor raz de las dos escenas.
Comience por localizar el archivo de recursos de diseo activity_scene_transitions.xml y cargarlo en la
herramienta Android Studio Designer. Cambiar al modo de diseo si es necesario, seleccione la opcin "Hello
World!" Objeto TextView y eliminarlo de la disposicin con la tecla Suprimir del teclado. Haga doble clic en el
fondo de la disposicin y en el panel resultante cambie la propiedad ID del objeto de @ + / Identificacin del
rootContainer.

El diseo de la Primera Escena


La primera escena se va a consistir en una disposicin relativa que contiene tres vistas de botn. Cree este
archivo de recursos de diseo haciendo clic derecho sobre la aplicacin -> res -> entrada de diseo en la
ventana de herramientas del proyecto y seleccionando Nuevo -> archivo de recursos Disposicin ... opcin de
men. En el cuadro de dilogo resultante, el nombre del archivo y seleccione scene1_layout RelativeLayout
como el elemento raz antes de hacer clic en Aceptar.
Cuando el archivo de diseo de nueva creacin ha cargado en la herramienta Diseador arrastrar una vista
Botn de la seccin Widgets de la paleta al lienzo de diseo y colquelo en la esquina superior izquierda de la
vista de diseo de modo que las propiedades alignParentLeft y alignParentTop se muestran como se ilustra
en la Figura 30-1. Suelta el botn de vista en esta posicin, haga doble clic en l y cambiar la propiedad de
texto a "One". Seleccione el icono de bombilla, haga clic en el mensaje I18N y extraer la cadena en un
recurso denominado one_string.

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

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


android: layout_width = "match_parent" android: layout_height = "match_parent">
<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"
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>

El diseo de la Segunda Escena


La segunda escena es simplemente una versin modificada de la primera escena. El primer y segundo
botones seguirn presentes, pero se encuentra en la parte inferior curvas a derecha e izquierda de la
disposicin respectivamente. El tercer botn, por otro lado, ya no estar presente en la segunda escena.
A los efectos de evitar la duplicacin de esfuerzos, el archivo de diseo para la segunda escena se crea
copiando y modificando el archivo scene1_layout.xml. Dentro de la ventana de herramientas del proyecto,
busque la aplicacin -> res -> diseo -> archivo scene1_layout.xml, haga clic derecho sobre l y seleccione la
opcin de men Copiar. Haga clic en la carpeta de diseo, esta vez seleccionando la opcin de men Pegar y
cambiar el nombre del archivo a scene2_layout.xml cuando se le pida que lo haga.
Haga doble clic en el nuevo archivo scene2_layout.xml para cargar en la herramienta Designer y cambiar al
modo de diseo si es necesario. Seleccione y elimine el botn "Tres" y mover el primer y segundo botones a
la ubicaciones inferior izquierda esquina inferior derecha y como se ilustra en la Figura 30-3:

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>

Al entrar en la Primera Escena


Si la solicitud fuera a ser ejecutado ahora, se mostrar slo el diseo en blanco representado por el archivo
activity_scene_transitions.xml. Algunos cdigo debe, por lo tanto, ser aadido al mtodo onCreate () situado
en el archivo de SceneTransitionsActivity.java de modo que la primera escena se presenta cuando se crea la
actividad. Esto se puede lograr de la siguiente manera:
com.ebookfrenzy.scenetransitions paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.transition.Scene importacin;
android.transition.Transition importacin;
android.transition.TransitionManager importacin;
android.view.ViewGroup importacin;
android.view.View importacin;
public class SceneTransitionsActivity extiende ActionBarActivity {
ViewGroup rootContainer;
Scene1 escena;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_scene_transitions);
rootContainer =

294

(ViewGroup) findViewById (R.id.rootContainer);


scene1 = Scene.getSceneForLayout (rootContainer,
R.layout.scene1_layout, este);
scene1.enter ();
}
.
.
}

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

La aplicacin de las transiciones


El primer y segundo botones se han configurado para llamar a mtodos nombrados goToScene2 y
goToScene1 respectivamente cuando se selecciona. Como sugieren los nombres de los mtodos, es la
responsabilidad de estos mtodos para desencadenar las transiciones entre las dos escenas. Aadir estos
dos mtodos dentro del archivo SceneTransitionsActivity.java para que se lean como sigue:
public void goToScene2 (Ver vista)
{
TransitionManager.go (scene2);
}
public void goToScene1 (Ver vista)
{
TransitionManager.go (scene1);
}

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.

Agregar el archivo de Transicin


Todos los efectos de transicin para este proyecto se implementar dentro de un archivo de recursos XML
transicin individual. Como se indica en el captulo titulado Interfaces Animacin de usuario en Android Studio
usando el Marco de Transitions , los archivos de recursos de transicin deben ser colocados en la aplicacin > res -> carpeta de transicin del proyecto. Comienza, por lo tanto, haciendo clic derecho sobre la carpeta res
en la ventana de herramientas del proyecto y seleccionando Nuevo -> opcin de men Directorio. En el
cuadro de dilogo resultante, nombre de la nueva transicin carpeta y haga clic en el botn Aceptar. Haga clic
derecho sobre la carpeta nueva transicin, esta vez seleccionando la Nueva -> opcin Archivo y el nombre de
la nueva transition.xml archivo.
Con el archivo transition.xml recin creado seleccionado y cargado en el panel de edicin, agregue el
siguiente contenido XML para agregar un conjunto de transicin que permite la animacin de transicin de
cambio de lmites con el establecimiento de un atributo de duracin:
<? Xml version = "1.0" encoding = "UTF-8"?>
<TransitionSet
xmlns: android = "http://schemas.android.com/apk/res/android">
<changeBounds
android: duracin = "2000">
</ ChangeBounds>
</ TransitionSet>

296

Cargando y Manejo del Set Transition


Aunque un archivo de recursos de transicin ha sido creado y poblado con una transicin de cambio de
lmites, esto no tendr ningn efecto hasta que se aade algo de cdigo para cargar las transiciones en una
instancia de TransitionManager y hacer referencia a ella en los cambios de escena. Los cambios para lograr
esto son los siguientes:
com.ebookfrenzy.scenetransitions paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.transition.Scene importacin;
android.transition.Transition importacin;
android.transition.TransitionInflater importacin;
android.transition.TransitionManager importacin;
android.view.ViewGroup importacin;
android.view.View importacin;
public class SceneTransitionsActivity extiende ActionBarActivity {
ViewGroup rootContainer;
Scene1 escena;
Scene2 escena;
TransitionMgr Transicin;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_scene_transitions);
rootContainer =
(ViewGroup) findViewById (R.id.rootContainer);
transitionMgr = TransitionInflater.from (este)
.inflateTransition (R.transition.transition);
scene1 = Scene.getSceneForLayout (rootContainer,
R.layout.scene1_layout, este);
scene2 = Scene.getSceneForLayout (rootContainer,
R.layout.scene2_layout, este);
scene1.enter ();
}
public void goToScene2 (Ver vista)
{
TransitionManager.go (scene2, transitionMgr);
}
public void goToScene1 (Ver vista)
{

297

TransitionManager.go (scene1, transitionMgr);


}
.
.
}

Cuando la aplicacin es ahora ejecutar los dos botones se deslizarn suavemente a sus nuevas posiciones
durante la transicin.

Configuracin de transiciones adicionales


Con el archivo de transicin integrado en el proyecto, cualquier nmero de transiciones adicionales se puede
aadir al archivo sin la necesidad de hacer ms cambios en el cdigo fuente de Java de la actividad. Tome,
por ejemplo, los siguientes cambios en el archivo transition.xml para aadir un interpolador de rebote a la
transicin de cambio de lmites, introducen una transicin de fundido de entrada dirigido al tercer botn y
cambiar las transiciones de tal manera que se llevan a cabo de forma secuencial:
<? Xml version = "1.0" encoding = "UTF-8"?>
<TransitionSet
xmlns: android = "http://schemas.android.com/apk/res/android"
android: transitionOrdering = "secuencial">

<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

31. Una visin general de Intenciones en Android


Estudio
En esta etapa del libro, debe quedar claro que las aplicaciones de Android se componen, entre otras cosas,
de una o ms actividades. Un rea que todava tiene que ser cubierto en extenso detalle, sin embargo, es el
mecanismo por el que una actividad puede desencadenar el lanzamiento de otra actividad. Como se indica
brevemente en el captulo titulado La Anatoma de una aplicacin Android Android estudio , esto se logra
principalmente mediante Intenciones.
Antes de trabajar a travs de algunos ejemplos de implementaciones basadas Android estudio de las
intenciones en los siguientes captulos, el objetivo de este captulo es proporcionar una visin general de las
intenciones en forma de intenciones explcitas y las intenciones implcitas, junto con una introduccin a los
filtros de intencin.
Contenido

1 Una visin general de Intenciones

2 Intentos explcitos

3 Devolver datos a partir de una actividad

4 Intentos implcitos

5 Uso de Intencin Filtros

6 Comprobacin Intencin disponibilidad

7 Resumen

Una visin general de Intenciones


Intenciones (android.content.Intent) son el sistema de mensajera por el que una actividad es capaz de lanzar
otra actividad. Una actividad puede, por ejemplo, emitir una intencin de solicitar la puesta en marcha de otra
actividad contenida dentro de la misma aplicacin. Intenciones tambin, sin embargo, van ms all de este
concepto al permitir una actividad para solicitar los servicios de cualquier otra actividad apropiada registrado
en el dispositivo para el que se configuran los permisos. Consideremos, por ejemplo, una actividad contenida
dentro de una aplicacin que requiere una pgina web que se carga y se muestra al usuario. En lugar de la
aplicacin de tener que contener una segunda actividad para realizar esta tarea, el cdigo slo puede enviar
una intencin al tiempo de ejecucin de Android que solicita los servicios de cualquier actividad que ha
registrado la capacidad de mostrar una pgina web. El sistema de ejecucin coincidir con la solicitud de las
actividades disponibles en el dispositivo y, o bien poner en marcha la actividad que corresponda o, en el caso
de mltiples partidos, permitir al usuario decidir qu actividad va a utilizar.
Intentos tambin permiten la transferencia de datos desde el envo de la actividad a la actividad receptora. En
el escenario anteriormente descrito, por ejemplo, la actividad enviando tendra que enviar la direccin URL de

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>

Devolver datos a partir de una actividad


Como el ejemplo de la seccin gradas anteriores, mientras que los datos se transfieren a ActivityB, no hay
manera de que los datos se devuelven a la primera actividad (que llamaremos ActivityA).Esto puede, sin
embargo, puede lograr mediante el lanzamiento de ActivityB como una subactividad de ActivityA. Una
actividad que se inicia como una subactividad iniciando la intencin con una llamada al mtodo
startActivityForResult () en lugar de utilizar startActivity (). Adems del objeto intencin, este mtodo tambin
se pasa un valor de cdigo de solicitud que se puede utilizar para identificar los datos de retorno cuando los
rendimientos sub-actividad. Por ejemplo:
startActivityForResult (i, REQUEST_CODE);

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

Intencin i = new Intent (Intent.ACTION_VIEW,


Uri.parse ("http://www.ebookfrenzy.com"));

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 uso de Intencin Filtros


Intencin filtros son el mecanismo por el cual las actividades de "anuncian" acciones y datos soportados
manejo de capacidades al proceso de resolucin de la intencin Android. Continuando con el ejemplo en la
seccin anterior, una actividad capaz de mostrar pginas web incluira una seccin de filtro intencin en su
archivo de manifiesto indicando apoyo a las solicitudes de tipo intencin ACTION_VIEW sobre los datos del
esquema http.
Es importante tener en cuenta que tanto las actividades de envo y recepcin deben haber solicitado permiso
para que el tipo de accin a realizar. Esto se logra mediante la adicin de <usos-permisos> etiquetas a los
archivos de manifiesto para ambas actividades. Por ejemplo, las siguientes lneas se manifiestan solicitar
permiso para acceder a la base de datos de Internet y contactos:
<Usa-permiso android: name = "android.permission.READ_CONTACTS" />
<Usa-permiso android: name = "android.permission.INTERNET" />

El

archivo

AndroidManifest.xml

siguiente

ilustra

una

configuracin

para

una

WebViewActivity con filtros intencin y permisos habilitados para el acceso a Internet:


<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfreny.WebView"
android: versionCode = "1"
android: VersionName = "1.0">
<Usa-Android SDK: minSdkVersion = "10" />
<Usa-permiso android: name = "android.permission.INTERNET" />
<Application
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl">
<Actividad
android: label = "@ string / nombre_apl"
android: name = ". WebViewActivity">
<Intencin de filtro>
<Accin android: name = "android.intent.action.VIEW" />

actividad

llamada

304

<Categora android: name = "android.intent.category.DEFAULT" />


<Androide datos: Esquema = "http" />
</ Intencin de filtro>
</ Actividad>
</ Application>
</ Manifiesto>

Comprobacin de Intencin disponibilidad


En general, es prudente asumir que una actividad estar disponible para un propsito en particular, sobre
todo porque la ausencia de una accin de juego normalmente como resultado la aplicacin de
estrellarse. Afortunadamente, es posible identificar la disponibilidad de una actividad para una intencin
especfica antes de que se enva al sistema de tiempo de ejecucin. El siguiente mtodo se puede utilizar
para identificar la disponibilidad de una actividad para un tipo de accin intencin especificado:
isIntentAvailable public static boolean (contexto Contexto, accin String) {
ltima PackageManager PackageManager = context.getPackageManager ();
intencin Intencin final = nueva Intencin (accin);
Lista <ResolveInfo> list =
packageManager.queryIntentActivities (intencin,
PackageManager.MATCH_DEFAULT_ONLY);
volver list.size ()> 0;
}

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

32. Intentos explcitos Android - Un Estudio Android


Ejemplo
El captulo titulado Una visin general de Intenciones en Android estudio cubri la teora de la utilizacin de
los intentos para poner en marcha actividades. En este captulo se pondr en prctica esta teora a travs de
la creacin de una aplicacin de ejemplo.
El ejemplo de proyecto de aplicacin Android estudio creado en este captulo demostrar el uso de una
intencin explcita para iniciar una actividad, incluida la transferencia de datos entre el envo y la recepcin de
las actividades. El siguiente captulo ( Intenciones implcitos Android - Un Ejemplo Android Estudio )
demostrar el uso de las intenciones implcitas.
Contenido

1 Creacin de la explcita intencin Ejemplo de Aplicacin

2 Disear el diseo de interfaz de usuario para ActivityA

3 Creacin de la segunda clase de actividad

4 Diseo del diseo de interfaz de usuario para ActivityB

5 Revisar el archivo de manifiesto de aplicacin

6 Creacin de la Intencin

7 Extraccin de datos de Intencin

8 Lanzamiento ActivityB como Sub-Actividad

9 Devolver datos de un Sub-Actividad

10 Prueba de la aplicacin

11 Resumen

Creacin de la explcita intencin Ejemplo de Aplicacin


Lanzamiento Android Studio y crear un nuevo proyecto, entrando ExplicitIntent en el campo Nombre de la
aplicacin y ebookfrenzy.com como escenario de dominio de la empresa antes de hacer clic en el botn
Siguiente.
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 ActivityA con una disposicin correspondiente llamado
activity_a y un archivo de recurso de men menu_activity_a con nombre.
Haga clic en Finalizar para crear el nuevo proyecto.

307

Disear el diseo de interfaz de usuario para ActivityA


La interfaz de usuario para ActivityA consistir en una vista RelativeLayout contiene EditarTexto (texto sin
formato), TextView y vistas botn llamado editText1, textView1 y el botn 1, respectivamente. Uso de la
ventana de herramientas del proyecto, busque el archivo de recursos activity_a.xml para ActivityA (ubicado
debajo de aplicacin -> res -> diseo) y haga doble clic en l para cargarlo en la herramienta Android Studio
Designer. Cualquiera de disear el trazado en el modo de diseo, o cambiar al modo de texto e introduzca el
siguiente XML. Tenga en cuenta que el "Preguntar" texto que aparece en la vista botn se ha extrado de un
recurso de cadena denominado ask_text.
Si el diseo de la interfaz de usuario usando la herramienta de diseo en modo de diseo, asegrese de
editar el XML despus de aadir la propiedad manejador onClick para la vista Button1, y tenga en cuenta la
propiedad del ancho diseo del componente EditView se ha establecido en 200dp:
<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 = ". ActivityA">
<TextView
android:
android:
android:
android:
android:
android:
android:

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

Creacin de la segunda clase de actividad


Cuando el botn "Hacer Pregunta" es tocado por el usuario, la intencin ser emitido solicitando que se puso
en marcha una segunda actividad en la que una respuesta puede ser introducido por el usuario. El siguiente

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.

Disear el diseo de interfaz de usuario para ActivityB


Los nicos elementos que se requieren para la interfaz de usuario de la segunda actividad son un Texto sin
formato EditarTexto, TextView y vista Button. Con estos requisitos en mente, modificar el diseo activity_b.xml
en la herramienta de diseo, ya sea visualmente utilizando el modo de diseo o introduciendo directamente el
siguiente cdigo XML en modo texto. Tenga en cuenta que el texto en el botn (que dice "Respuesta
Question") se ha extrado a un answer_text recurso de cadena que se llama:

310

<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 = ". ActivityB">
<Botn
android:
android:
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del Button1"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_below = "@ + / Identificacin del editText1"
layout_centerHorizontal = "true"
layout_marginTop = "86dp"
onClick = "onClick"
text = "@ string / answer_text" />

<TextView
android:
android:
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del textView1"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_alignParentTop = "true"
layout_centerHorizontal = "true"
layout_marginTop = "35dp"
text = "Texto grande"
textAppearance = "android:? attr / textAppearanceLarge" />

<EditarTexto
android:
android:
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del editText1"


layout_width = "300DP"
layout_height = "wrap_content"
layout_below = "@ + / Identificacin del textView1"
layout_centerHorizontal = "true"
layout_marginTop = "66dp"
ems = "10"
InputType = "text" />

</ 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

Revisando el archivo de manifiesto de aplicacin


Para que ActivityA para ser capaz de lanzar ActivityB utilizando una intencin, es necesario que una entrada
para ActivityB estar presente en el archivo AndroidManifest.xml. Localiza el archivo dentro de la ventana de
herramientas Proyecto (app -> manifiesta), haga doble clic en l para cargarlo en el editor y verifique que
Android Studio ha aadido automticamente una entrada para la actividad:

312

<? Xml version = "1.0" encoding = "UTF-8"?>


<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.explicitintent">
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
<Actividad
android: name = ". ActivityA"
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>
<Actividad
android: name = ". ActivityB"
android: label = "@ string / title_activity_activity_b">
</ Actividad>
</ Application>
</ Manifiesto>

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

public class ActivityA extiende ActionBarActivity {


@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_a);
}
public void onClick (Ver vista) {
Intencin i = new Intent (esto, ActivityB.class);
ltima EditarTexto editText1 = (EditarTexto)
findViewById (R.id.editText1);
. String MiCadena = editText1.getText toString () ();
i.putExtra ("QString", miCadena);
startActivity (i);
}
.
.
.
}

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.

La extraccin de datos Intencin


Ahora que ActivityB est siendo lanzado desde ActivityA, el siguiente paso es extraer el valor de datos de
Cuerda incluido en la intencin y asignarlo al objeto TextView en la interfaz de usuario ActivityB. Esto implica
agregar algo de cdigo para el mtodo de ActivityB onCreate () en el archivo de origen ActivityB.java:
com.ebookfrenzy.explicitintent paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.content.Intent importacin;
android.view.View importacin;
android.widget.TextView importacin;
android.widget.EditText importacin;
public class ActivityB extiende Actividad {

314

public void onCreate (Bundle savedInstanceState) {


super.onCreate (savedInstanceState);
setContentView (R.layout.activityb);
Bundle extras = getIntent () getExtras (.);
if (extras == null) {
retorno;
}
Cadena QString = extras.getString ("QString");
ltima TextView TextView = (TextView)
findViewById (R.id.textView1);
textView.setText (QString);
}
}

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.

Lanzamiento ActivityB como Sub-Actividad


Para que ActivityB para poder devolver datos a ActivityA, ActivityB debe iniciarse como un sub-actividad de
ActivityA. Esto significa que la llamada a startActivity () en el mtodo ActivityA onClick () necesita ser
reemplazado con una llamada a startActivityForResult (). A diferencia del mtodo startActivity (), que lleva slo
el objeto intencin como argumento, startActivityForResult () requiere que un cdigo de solicitud tambin
puede pasar a travs. El cdigo de peticin puede ser cualquier valor de nmero y se utiliza para identificar
qu sub-actividad est asociada con qu conjunto de datos de retorno. A los efectos de este ejemplo, se
utilizar un cdigo de solicitud de 5, que nos da una clase ActivityA modificado que dice lo siguiente:
public class ActivityA extiende ActionBarActivity {
private static int request_code final = 5;
@ Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.main);
}
public void onClick (Ver vista) {
Intencin i = new Intent (esto, ActivityB.class);
ltima EditarTexto editText1 = (EditarTexto)
findViewById (R.id.editText1);
. String MiCadena = editText1.getText toString () ();
i.putExtra ("QString", miCadena);
startActivityForResult (i, request_code);
}

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.

Volviendo datos de un Sub-Actividad


ActivityB ahora se lanz como un sub-actividad de ActivityA, que ha su vez ha modificado para manejar datos
devueltos por ActivityB. Todo lo que queda es modificar ActivityB.java para aplicar el mtodo de acabado () y
para agregar cdigo para el mtodo onClick (), que se llama cuando se toca el botn "Responder
pregunta". El mtodo de acabado () se activa cuando un salidas de actividad (por ejemplo, cuando el usuario
selecciona el botn de retroceso en el dispositivo):
public void onClick (Ver vista) {
acabado ();
}
@ Override
acabado public void () {
Intencin de datos = new Intent ();
EditarTexto editText1 = (EditarTexto) findViewById (R.id.editText1);
. Cadena ReturnString = editText1.getText toString () ();
data.putExtra ("returnData", ReturnString);
setResult (RESULT_OK, datos);
super.finish ();

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

33. Intentos implcitos Android - Un Estudio Android


Ejemplo
En este captulo, una aplicacin de ejemplo se crear en Android Estudio diseado para demostrar la
aplicacin prctica de las intenciones implcitas. El objetivo ser crear y enviar un intento solicitando que el
contenido de una pgina web en particular se carga y se muestra al usuario. Desde la aplicacin de ejemplo
en s mismo no contendr una actividad capaz de realizar esta tarea, se emitir una intencin implcita de
modo que el algoritmo de resolucin intencin Android puede ser contratado para identificar y poner en
marcha una actividad adecuada desde otra aplicacin. Esto es ms probable que sea una actividad desde el
navegador web Chrome incluido con el sistema operativo Android.
Despus de haber lanzado con xito el navegador integrado, se crear un nuevo proyecto que tambin
contiene una actividad capaz de mostrar pginas web. Esta ser instalado en el dispositivo o emulador y se
utiliza para demostrar lo que sucede cuando dos actividades coinciden con los criterios para una intencin
implcita.
Contenido

1 Crear el Android Estudio implcita Intencin Proyecto Ejemplo

2 El diseo de la interfaz de usuario

3 Crear la intencin implcita

4 Adicin de un segundo Actividad Matching

5 Adicin de la Web de la interfaz de usuario

6 Obtencin de la URL Intencin

7 Modificacin del archivo MyWebView Proyecto Manifiesto

8 Instalacin del paquete MyWebView en un dispositivo

9 Prueba de la aplicacin

10 Resumen

Crear el Android Estudio implcita Intencin Proyecto Ejemplo


Lanzamiento Android Studio y crear un nuevo proyecto, entrando ImplicitIntent en el campo Nombre de la
aplicacin y ebookfrenzy.com como escenario de dominio de la empresa antes de hacer clic en el botn
Siguiente.
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 ImplicitIntentActivity con unos correspondientes archivos de
diseo y de recursos men nombrados activity_implicit_intent y menu_implicit_intent respectivamente.
Haga clic en Finalizar para crear el nuevo proyecto.

318

El diseo de la interfaz de usuario


La interfaz de usuario para la clase ImplicitIntentActivity es muy simple, que consiste nicamente en una vista
RelativeLayout y un botn. Dentro de la ventana de herramientas del proyecto, busque la aplicacin -> res ->
diseo -> archivo activity_implicit_intent.xml y haga doble clic en l para cargarlo en la herramienta
Diseador. Visualmente construir la interfaz de usuario en modo de diseo de manera que se asemeja a la
figura 33-1, o introduzca la siguiente XML en modo texto. Ntese que en ambos casos, el texto en el botn
("Mostrar Pgina Web") ha sido extrado de un recurso de cadena denominado button_text:
<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 = "com.ebookfrenzy.implicitintent.ImplicitIntentActivity">
<Botn
android:
android:
android:
android:
android:
android:
android:

id = "@ + / Identificacin del Button1"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_centerHorizontal = "true"
layout_centerVertical = "true"
text = "@ string / button_text"
onClick = "showWebPage" />

</ 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

Creacin de la Intencin Implcita


Como se ha sealado anteriormente, la intencin implcita ser creado y emitido desde dentro de un mtodo
llamado showWebPage () que, a su vez, debe ser implementado en la clase ImplicitIntentActivity, el cdigo
que se encuentra en el archivo de origen ImplicitIntentActivity.java. Localiza el archivo en la ventana de
herramientas Proyecto y haga doble clic en l para cargarlo en un panel de edicin. Una vez cargado,
modifique el cdigo para agregar el mtodo showWebPage () junto con algunas importaciones necesarias:
com.ebookfrenzy.implicitintent paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.net.Uri importacin;
android.content.Intent importacin;
android.view.View importacin;
public class ImplicitIntentActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_implicit_intent);
}
public void showWebPage (Ver vista) {
Intencin Intencin = new Intent (Intent.ACTION_VIEW,
Uri.parse ("http://www.ebookfrenzy.com"));
startActivity (intencin);
}
.
.
.
}

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

Adicin de un segundo Actividad Matching


El resto de este captulo se utilizar para demostrar el efecto de la presencia de ms de una actividad
instalado en el dispositivo de bsqueda de los requisitos para una intencin implcita. Para lograr esto, una
segunda aplicacin se crear y se instala en el dispositivo o emulador. Comienza, por lo tanto, mediante la
creacin de un nuevo proyecto dentro de Android Studio con el nombre de la aplicacin se establece en
MyWebView, utilizando las opciones de configuracin misma SDK utilizados al crear el proyecto ImplicitIntent
anteriormente en este captulo. Seleccione una actividad en blanco y, cuando se le solicite, el nombre del
MyWebViewActivity actividad y el diseo de la disposicin y recurso de men archivos activity_my_web_view
y menu_my_web_view.

Adicin de la Web de la interfaz de usuario


La interfaz de usuario de la nica actividad que figura en el nuevo proyecto MyWebView va a consistir en una
instancia del widget WebView Android. Dentro de la ventana de herramientas del proyecto, busque el archivo
activity_my_web_view.xml contiene la descripcin de interfaz de usuario para la actividad y haga doble clic en
l para cargarlo en la herramienta Diseador. Con la herramienta de diseo en modo Diseo, seleccione el
widget predeterminado TextView y sacarlo de la disposicin con la tecla Suprimir del teclado. Interruptor
Designer para el modo texto y editar el XML para eliminar las propiedades de relleno y elemento TextView
para que el archivo es el 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"
herramientas: context = ". MyWebViewActivity">
</ RelativeLayout>

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

Haga doble clic en la instancia WebView y cambiar el ID de @ + / Identificacin del webView1.

La obtencin de la URL Intencin


Cuando se crea el objeto intencin implcita para mostrar una ventana del navegador web, la URL de la
pgina Web que se muestra se incluir en el objeto de la intencin dentro de un objeto Uri. La tarea del
mtodo onCreate () dentro de la clase MyWebViewActivity es extraer esta Uri del objeto intencin, convertirlo
en una cadena URL y asignarlo al objeto WebView. Para implementar esta funcionalidad, modificar el mtodo
onCreate () en MyWebViewActivity.java para que se lea de la siguiente manera:
com.ebookfrenzy.mywebview paquete;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
java.net.URL importacin;
android.net.Uri importacin;
android.content.Intent importacin;
android.webkit.WebView importacin;

322

public class MyWebViewActivity extiende ActionBarActivity {


@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_my_web_view);
Intencin Intencin = getIntent ();
Datos Uri = intent.getData ();
Url URL = null;
tratar {
url = new URL (data.getScheme (),
data.getHost (),
data.getPath ());
} Catch (Exception e) {
e.printStackTrace ();
}
WebView web View = (WebView) findViewById (R.id.webView1);
webView.loadUrl (url.toString ());
}
}

El nuevo cdigo aadido a la onCreate () mtodo realiza las siguientes tareas:

Obtiene una referencia a la intencin que caus esta actividad que se puso en marcha

Extrae los datos del objeto Uri intencin

Convierte los datos de Uri a un objeto URL

Obtiene una referencia al objeto WebView en la interfaz de usuario

Carga la URL en la vista web, convirtiendo la URL a una cadena en el proceso

La parte de codificacin del proyecto MyWebView ha finalizado. Todo lo que queda es modificar el archivo de
manifiesto.

Modificacin del archivo MyWebView Proyecto Manifiesto


Hay una serie de cambios que se deben hacer para el archivo de manifiesto MyWebView antes de que pueda
ser probado. En el primer caso, se necesitar la actividad que pedir permiso para acceder a Internet (ya que
tendr que cargar una pgina web). Esto se logra mediante la adicin de la lnea de permiso adecuado para
el archivo de manifiesto:
<Usa-permiso android: name = "android.permission.INTERNET" />

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.

Instalacin del paquete MyWebView en un dispositivo


Antes de la MyWebViewActivity se puede utilizar como receptor de una intencin implcita, que primero se
debe instalar en el dispositivo. Esto se logra mediante la ejecucin de la aplicacin de la manera
normal. Debido a que el archivo de manifiesto no contiene ni la android.intent.action.MAIN ni las directivas
android.intent.category.LAUNCHER, sin embargo, Android Estudio no sabe si debe o no iniciar la actividad
una vez que la aplicacin se ha instalado en el dispositivo. En consecuencia, Android Estudio mostrar el
cuadro de dilogo Editar configuracin se ilustra en la Figura 33-3 cuando se ejecuta la aplicacin, solicitando
instrucciones sobre cmo proceder una vez que el paquete de la aplicacin se ha instalado.

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

34. Intentos de difusin y receptores de radiodifusin en


Android Estudio
Adems de proporcionar un mecanismo para el lanzamiento de las actividades de aplicacin, los intentos
tambin se utilizan como una forma de transmitir ancho mensajes del sistema a otros componentes en el
sistema. Esto implica la implementacin de Broadcast Intenciones y receptores de radiodifusin, los cuales
son el tema de este captulo.
Contenido
1 Una visin general de Difusin Intenciones

2 Una visin general de los receptores de radiodifusin

3 La obtencin de resultados de un Broadcast

4 Sticky Broadcast Intenciones

5 El Ejemplo Broadcast Intencin

6 Crear el ejemplo de aplicacin

7 Creacin y envo de la Intencin Broadcast

8 Creacin del Receptor Broadcast

9 Configuracin de un receptor de radiodifusin en el archivo de manifiesto

10 Prueba del Ejemplo Broadcast

11 El escuchar por transmisiones del sistema

12 Resumen

Una visin general de Difusin Intenciones


Intentos de difusin son objetos Intencin que se emiten a travs de una llamada a los sendBroadcast (),
sendStickyBroadcast () o sendOrderedBroadcast () de la clase de actividad (este ltimo se utilice cuando se
requieren resultados de la emisin). Adems de proporcionar un sistema de mensajera y eventos entre los
componentes de la aplicacin, los intentos de transmisin tambin son utilizados por el sistema Android de
notificar a las aplicaciones interesadas acerca de los eventos del sistema clave (como la fuente de
alimentacin externa o los auriculares estn conectados o desconectados).
Cuando se crea una intencin de difusin, debe incluir una cadena de accin adems de los datos opcionales
y una cadena de categora. Al igual que con las intenciones estndar, se agrega datos a un intento de difusin
utilizando pares clave-valor en conjunto con el mtodo putExtra () del objeto de la intencin. La categora de
cadena opcional se puede asignar a una intencin de difusin a travs de una llamada al mtodo
AddCategory ().

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);

Una visin general de los receptores de radiodifusin


Una aplicacin a la escucha de las intenciones de difusin especficas mediante el registro de un receptor de
radiodifusin. Receptores de radiodifusin se implementan mediante la ampliacin de la clase Android
BroadcastReceiver y reemplazando el mtodo OnReceive (). El receptor de radiodifusin puede entonces ser
registrado, ya sea en el cdigo (por ejemplo dentro de una actividad), o dentro de un archivo de
manifiesto. Parte de la aplicacin de inscripcin implica la creacin de filtros de intencin para indicar las
intenciones de difusin especficos se requiere el receptor para escuchar. Esto se logra haciendo referencia a
la cadena de accin de la intencin de difusin. Cuando se detecta una emisin a juego, se llama al mtodo
OnReceive () del receptor de radiodifusin, momento en el que el mtodo tiene 5 segundos en el que realizar
las tareas necesarias antes de regresar. Es importante sealar que un receptor de radiodifusin no necesita
estar funcionando todo el tiempo. En el caso de que se detecte un intento juego, el sistema de ejecucin de
Android se iniciar automticamente el receptor de radiodifusin antes de llamar al mtodo OnReceive ().
El siguiente cdigo esboza una plantilla Receptor Broadcast subclase:
com.example.broadcastdetector paquete;

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:

<? Xml version = "1.0" encoding = "UTF-8"?>


<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.example.broadcastdetector.broadcastdetector"
android: versionCode = "1"
android: VersionName = "1.0">
<Usa-Android SDK: minSdkVersion = "17" />
<Application
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl">
<Androide receptor: name = "MyReceiver">
<Intencin de filtro>
<Accin android: name = "com.example.Broadcast">
</ Action>
</ Intencin de filtro>
</ Receptor>
</ Application>
</ Manifiesto>

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:

IntentFilter filtro = new IntentFilter ("com.example.Broadcast");

331

MyReceiver receptor = new MyReceiver ();


registerReceiver (receptor, filtro);

Cuando ya no se requiere un receptor de emisin registrados en el cdigo, puede no registrado a travs de


una llamada al mtodo unregisterReceiver () de la clase de actividad, pasando a travs de una referencia a l
objeto receptor como argumento. Por ejemplo, el siguiente cdigo anular el registro del receptor de
radiodifusin anteriormente:

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

La obtencin de resultados a partir de un Broadcast


Cuando se enva un intento de difusin utilizando el mtodo sendBroadcast (), no hay manera para la
actividad de iniciacin para recibir resultados de cualesquiera receptores de radiodifusin que recogen la
emisin. En el caso de que se requieren resultados de retorno, es necesario utilizar el mtodo
sendOrderedBroadcast () en su lugar. Cuando se enva un intento de difusin utilizando este mtodo, se
entrega en orden secuencial para cada receptor de radiodifusin con un inters registrado.
El mtodo sendOrderedBroadcast () se llama con una serie de argumentos, incluyendo una referencia a otro
receptor de radiodifusin (conocido como el receptor de resultado), que es para ser notificado cuando todos
los dems receptores de radiodifusin han manejado la intencin, junto con un conjunto de referencias de
datos en la que los receptores pueden colocar datos de resultados.Cuando todos los receptores de
radiodifusin se les ha dado la oportunidad de manejar la emisin, el mtodo OnReceive () del receptor
resultado se llama y se pasa los datos del resultado.

Sticky Broadcast Intenciones


De forma predeterminada, los intentos de difusin desaparecen una vez que se han enviado y manejado por
cualquier receptores de radiodifusin interesados. Un intento de difusin puede, sin embargo, se define como
"pegajoso". Una intencin pegajoso, y los datos contenidos en el mismo, permanece presente en el sistema
despus de que se ha completado. Los datos almacenados en un intento emisin persistente se pueden
obtener a travs del valor de retorno de una llamada al mtodo registerReceiver (), utilizando los argumentos
habituales (referencias al receptor de radiodifusin y los objetos de filtro intencin). Muchas de las

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.

El Ejemplo Broadcast Intencin


El resto de este captulo se trabajar a travs de la creacin de un ejemplo basado en Android Estudio de las
intenciones de difusin en accin. En el primer caso, una sencilla aplicacin ser creado con el propsito de
emitir una intencin de difusin personalizado. Un receptor de radiodifusin correspondiente a continuacin,
se cre que mostrar un mensaje en la pantalla del dispositivo Android cuando se detecta la emisin. Por
ltimo, el receptor de radiodifusin ser modificado para detectar la notificacin por el sistema de alimentacin
externa que se ha desconectado del dispositivo.

Crear el ejemplo de aplicacin


Lanzamiento Android Studio y crear un nuevo proyecto, entrando SendBroadcast en el campo Nombre de la
aplicacin y ebookfrenzy.com como escenario de dominio de la empresa antes de hacer clic en el botn
Siguiente.
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 SendBroadcastActivity con archivos de diseo y de recursos
men nombrados activity_send_broadcast correspondiente y menu_send_broadcast respectivamente.
Una

vez

que

el

nuevo

proyecto

se

ha

creado,

localizar

cargar

el

archivo

de

diseo

activity_send_broadcast.xml situado en la ventana de herramientas Proyecto en aplicacin -> res ->


disposicin y, con la herramienta de diseo en modo de diseo, reemplace el objeto TextView con miras
Button. Mueva el botn para el centro de la pantalla, haga doble clic en l y establecer la propiedad de texto
para que diga "Enviar Broadcast". Una vez que el valor de texto se ha establecido, utilice el icono de men
bombilla para extraer la cadena en un button_text recurso con nombre.
Con el botn an seleccionado en el diseo, busque la propiedad onClick en el panel Propiedades y
configurarlo para llamar a un mtodo llamado broadcastIntent. Un atajo til para la bsqueda de propiedades
es hacer clic en la barra de herramientas del panel Propiedades y comience a escribir los primeros caracteres
del nombre de la propiedad. Esto har que el sistema de bsqueda y comenzar la seleccin de los mejores
resultados para el nombre de la propiedad.

333

Creacin y envo de la Intencin Broadcast


Despus de haber creado el marco para la aplicacin SendBroadcast, ahora es el momento de implementar
el cdigo para enviar la intencin de difusin. Esto implica la realizacin del procedimiento broadcastIntent ()
especificada previamente como objetivo onClick del botn de vista de la interfaz de usuario. Busque y haga
doble clic en el archivo SendBroadcastActivity.java y modificarlo para agregar el cdigo para crear y enviar la
intencin de difusin. Una vez modificado, el cdigo fuente de esta clase debera decir lo siguiente:
com.ebookfrenzy.sendbroadcast 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 SendBroadcastActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_send_broadcast);
}
public void broadcastIntent (Ver vista)
{
Intencin Intencin = new Intent ();
intent.setAction ("com.ebookfrenzy.sendbroadcast");
intent.addFlags (Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast (intencin);
}
.
.
.
}

Tenga

en

cuenta

que,

en

este

caso,

la

cadena

de

accin

para

la

intencin

es

com.ebookfrenzy.sendbroadcast. Cuando se crea la clase receptor de radiodifusin en secciones posteriores


de este captulo, es esencial que la declaracin de filtro intencin coincide con esta cadena de accin.
Con esto concluye la creacin de la aplicacin para enviar la intencin de difusin. Todo lo que queda es la
construccin de un receptor de radiodifusin a juego.

334

Crear el Receptor Broadcast


Con el fin de crear el receptor de radiodifusin, una nueva clase tiene que ser creado que subclases de la
superclase BroadcastReceiver. Crear un nuevo proyecto con el nombre de la aplicacin se establece en
BroadcastReceiver y el nombre de dominio de la empresa establecida en com.ebookfrenzy, esta vez
seleccionando la opcin Agregar Sin actividad antes de hacer clic en Finalizar.
Dentro de la ventana de herramientas del proyecto, vaya a aplicaciones -> Java y haga clic derecho sobre el
nombre del paquete. En el men que aparece, seleccione Nuevo -> Otros -> opcin de men Receptor
Broadcast, nombre el MyReceiver clase y asegurarse de que las opciones exportados y habilitados son
seleccionados.
Una vez creado, Android Studio cargar automticamente el nuevo archivo de clase MyReceiver.java en el
editor en el que se leer como sigue:
com.ebookfrenzy.broadcastreceiver paquete;
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) {
// TODO: Este mtodo se llama cuando el BroadcastReceiver est recibiendo
// Una emisin de Intencin.
throw new UnsupportedOperationException ("Todava no implementado");
}
}

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 ();
}
}

El cdigo para el receptor de radiodifusin se ha completado.

Configuracin de un receptor de radiodifusin en el archivo de manifiesto


En comn con otros proyectos para Android, BroadcastReceiver ha asociado un fichero de manifiesto llamado
AndroidManifest.xml.
Este archivo es necesario para dar a conocer la presencia del receptor de radiodifusin y debe incluir un filtro
intencin de especificar los intentos de difusin en la que el receptor se encuentra interesado. Cuando la
clase BroadcastReceiver fue creado en la seccin anterior, Android estudio aade automticamente a
<Receptor> para el archivo de manifiesto. Todo lo que queda, por lo tanto, es aadir un <intencin de filtro>
elemento dentro de la etiqueta <Receptor> Declaracin apropiadamente configurado para la cadena de
accin personalizada:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.broadcastreceiver.broadcastreceiver">
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
<Receptor
android: name = ". MyReceiver"
android: enabled = "true"
android: exportado = "true">
<Intencin de filtro>
<Accin
android: name = "com.ebookfrenzy.sendbroadcast">
</ Action>
</ Intencin de filtro>
</ Receptor>
</ Application>
</ Manifiesto>

Con el archivo de manifiesto completado, el ejemplo de difusin est listo para ser probado.

336

Probando el Ejemplo Broadcast


Con el fin de probar el emisor y el receptor de radiodifusin, comenzar mediante la ejecucin de la aplicacin
BroadcastReceiver en un dispositivo Android fsica o AVD. Cuando aparezca el cuadro de dilogo Editar
configuracin, seleccione la opcin No poner en marcha la actividad de manera que se ha instalado la
actividad, pero no en marcha y hacer clic en el botn Ejecutar. La instalacin correcta del paquete se
informar en la ventana de herramientas Android Estudio Run:
Carga de archivos
ruta
de
acceso
local:
C:
\
Users
\
Neil
\
AndroidStudioProjects
\
BroadcastReceiver \ app \ build \ salidas \ apk \ app-debug.apk
ruta remota: /data/local/tmp/com.ebookfrenzy.broadcastreceiver
Instalacin com.ebookfrenzy.broadcastreceiver
DISPOSITIVO
shell
de
comandos:
pm
instalar
-r
"/data/local/tmp/com.ebookfrenzy.broadcastreceiver"
pkg: /data/local/tmp/com.ebookfrenzy.broadcastreceiver
xito

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.

Escuchando transmisiones del sistema


La etapa final de este ejemplo es modificar el filtro de intencin para la BroadcastReceiver escuchar tambin
por la intencin del sistema que se emite cuando la energa externa est desconectada del dispositivo. La
accin

que

el

receptor

tiene

que

estar

escuchando

en

este

contexto

es

android.intent.action.ACTION_POWER_DISCONNECTED. El archivo de manifiesto modificado para el


proyecto BroadcastReceiver debe, por lo tanto, ahora se lea como sigue:
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.broadcastreceiver.broadcastreceiver">
<Androide aplicacin: allowBackup = "true"
android: label = "@ string / nombre_apl"
android: icon = "@ estirable / ic_launcher"
android: theme = "@ style / AppTheme">
<Receptor

337

android: name = ". MyReceiver"


android: enabled = "true"
android: exportado = "true">
<Intencin de filtro>
<Accin
android: name = "com.ebookfrenzy.sendbroadcast">
</ Action>
<Accin
android: name = "android.intent.action.ACTION_POWER_DISCONNECTED">
</ Action>
</ Intencin de filtro>
</ Receptor>
</ Application>
</ Manifiesto>

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 ();
}

Pruebe el receptor de volver a instalar el paquete BroadcastReceiver modificado. Al tocar el botn de la


aplicacin SendBroadcast ahora debe dar lugar a un nuevo mensaje que contiene la cadena de accin
personalizada:
Intencin Broadcast detecta com.ebookfrenzy.sendbroadcast

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

35. Hilos e hilo Android Manipuladores - Un Estudio


Android Tutorial
El prximo captulo ser el primero de una serie de captulos destinados a introducir el uso de los Servicios de
Android para realizar tareas de aplicaciones en segundo plano. Es imposible, sin embargo, para comprender
plenamente los pasos involucrados en la implementacin de servicios sin obtener primero una comprensin
bsica del concepto de roscar en aplicaciones de Android. Hilos y manipuladores de rosca son, por lo tanto, el
tema de este captulo. Una vez que los fundamentos de la rosca en Android se han cubierto, la teora se pone
en prctica en la forma de un tutorial proyecto Android Studio usando threading.

Contenido

1 Una visin general de los Hilos

2 El hilo principal de la aplicacin

3 Manipuladores Thread

4 Un bsico que rosca Ejemplo

5 Creacin de un nuevo hilo

6 La implementacin de un manejador de Tema

7 Al pasar un mensaje a los Handler

8 Resumen

Una visin general de los Hilos


Los hilos son la piedra angular de cualquier sistema operativo multitarea y pueden ser considerados como
mini-procesos que se ejecutan dentro de un proceso principal, cuyo objetivo es permitir al menos la apariencia
de rutas de ejecucin paralelas dentro de las aplicaciones.

El hilo principal de la aplicacin


La primera vez que se inicia una aplicacin para Android, el sistema de ejecucin crea un hilo en el que todos
los componentes 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.
Cualquier componente dentro de una aplicacin que realiza una tarea mucho tiempo usando el hilo principal
har que toda la aplicacin que parecen encerrar hasta que se complete la tarea.Normalmente, esto se
traducir

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.

Un Roscado Ejemplo bsico


El resto de este captulo se trabajar a travs de algunos ejemplos sencillos destinados proporcionan una
introduccin bsica a las roscas. El primer paso ser poner de relieve la importancia de la realizacin de
tareas que consumen mucho tiempo en un hilo separado del hilo principal. Comienza, por lo tanto, mediante
la creacin de un nuevo proyecto en Android de estudio, entrar ThreadExample en el campo Nombre de la
aplicacin y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn
Siguiente.
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 ThreadExampleActivity, utilizando los valores por defecto
para los archivos de recursos de diseo y de men.
Haga clic en Finalizar para crear el nuevo proyecto
Cargue el archivo activity_thread_example.xml para el proyecto en la herramienta Diseador. Haga doble clic
en el componente TextView y cambiar el ID para el fin de @ + / Identificacin del myTextView. A continuacin,
haga clic y arrastre el TextView para que se coloca en el centro de la tela de la pantalla.
Aadir un punto de vista botn a la interfaz de usuario, situado directamente debajo del objeto TextView
existente como se ilustra en la Figura 35-1:

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:

<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 = ". ThreadExampleActivity">
<TextView
android: text = "@ string / hello_world"

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>

A continuacin, cargar el archivo ThreadExampleActivity.java en un panel de edicin y agregar cdigo para


implementar el mtodo buttonClick () que se llamar cuando la vista del botn es tocado por el usuario. Dado
que el objetivo aqu es demostrar el problema de la realizacin de tareas largas en el hilo principal, el cdigo
simplemente hacer una pausa durante 20 segundos antes de mostrar un texto diferente en el objeto
TextView:

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.

Crear un nuevo hilo


Con el fin de crear un nuevo tema, el cdigo que se ejecutar en ese hilo tiene que ser colocado en el mtodo
Run () de una instancia Ejecutable. Un nuevo objeto Thread entonces se debe crear, que pasa a travs de
una referencia a la instancia Ejecutable al constructor. Por ltimo, el mtodo start () del objeto hilo tiene que
ser llamado para iniciar el hilo conductor. Para llevar a cabo la tarea dentro del mtodo buttonClick (), por lo
tanto, los siguientes cambios deben hacerse:

public void buttonClick (Ver vista)


{

344

Ejecutable ejecutable = new Ejecutable () {


public void run () {
larga endTime = System.currentTimeMillis ()
+ 20 * 1000;
while (System.currentTimeMillis () <endTime) {
sincronizado (este) {
tratar {
espere (endTime System.currentTimeMillis ());
} Catch (Exception e) {}
}
}
}
};
MyThread Tema = new Thread (ejecutable);
mythread.start ();
}

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.

La implementacin de un manejador de Tema


Manipuladores de rosca se implementan en el hilo principal de una aplicacin y se utilizan principalmente para
hacer cambios a la interfaz de usuario en respuesta a los mensajes enviados por otros subprocesos que se
ejecutan dentro del proceso de la aplicacin.
Los manipuladores son subclases de la clase Handler Android y se puede utilizar ya sea mediante la
especificacin de un Ejecutable para ser ejecutado cuando sea requerido por el hilo, o reemplazando el
mtodo de devolucin de llamada handleMessage () dentro de la subclase Handler que se llamar cuando los
mensajes se envan al controlador de un hilo.
Para los fines de este ejemplo, un controlador ser implementado para actualizar la interfaz de usuario desde
dentro de la rosca prefabricada. Desde dentro de Android de estudio, cargar el archivo en el editor
ThreadExampleActivity.java Android Studio y modificar el cdigo para agregar una instancia Handler a la
actividad:

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.

Al pasar un mensaje a los Handler


Mientras que el ejemplo anterior provoc una llamada al handleMessage () devolucin de llamada manejador,
no aprovechar el objeto de mensaje para enviar datos al controlador. En esta fase del tutorial, el ejemplo se
modificar ms para pasar los datos entre el hilo y el manejador. En primer lugar, el hilo actualizado en el
mtodo buttonClick () obtendr la fecha y hora del sistema en formato de cadena y almacenar esa
informacin en un objeto Bundle. A continuacin, se realiz una llamada al mtodo obtainMessage () del
objeto controlador para obtener un objeto de mensaje de la piscina mensaje. Por ltimo, se agregar el
paquete al objeto de mensaje antes de ser enviado a travs de una llamada al mtodo sendMessage () del
objeto controlador:
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;
java.text.SimpleDateFormat importacin;
java.util.Date importacin;
java.util.Locale importacin;
public class ThreadExampleActivity extiende ActionBarActivity {
.
.

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

36. Entender Servicios Android comenzado y Bound


La clase de servicio de Android est diseado especficamente para permitir que las aplicaciones para iniciar
y llevar a cabo las tareas de fondo. A diferencia de los receptores de radiodifusin, que se pretende llevar a
cabo una tarea rpida y luego la salida, los servicios estn diseados para realizar tareas que tardan mucho
tiempo en completarse (como la descarga de un archivo a travs de una conexin a Internet o el streaming de
msica para el usuario), pero no requieren una interfaz de usuario.
En este captulo, una visin general de los diferentes tipos de servicios disponibles sern cubiertos, incluidos
los servicios iniciados, servicios ligados y servicios intencin. Una vez que estos fundamentos han sido
cubiertas, captulos posteriores trabajarn a travs de una serie de ejemplos basados en Android Estudio de
los servicios en la accin.
Contenido

1 Servicios Comenzado

2 Servicio de Intencin

3 Servicio Bound

4 La Anatoma de un servicio

5 Controlar Destruidos Opciones de reinicio de servicio

6 Declaracin de un servicio en el archivo de manifiesto

7 Inicio de un servicio que se ejecuta en el inicio del sistema

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 ().

OnDestroy () - Se llama cuando se est destruyendo el servicio.

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.

Controlar Opciones Servicio Reinicie Destroyed


Se requiere que el mtodo de devolucin de llamada onStartCommand () para devolver un valor entero para
definir lo que debera suceder en relacin con el servicio en el caso de que es destruido por el sistema de
ejecucin de Android. Valores de retorno posibles para estos mtodos son los siguientes:

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.

Declarar un servicio en el archivo de manifiesto


Para que un servicio sea utilizable, que primero debe ser declarado dentro de un archivo de manifiesto. Esto
implica la incorporacin de un elemento <service> configurado adecuadamente en un <application> entrada
existente. Como mnimo, el elemento <service> debe contener una propiedad que se declara el nombre de la
clase del servicio, como se ilustra en el siguiente fragmento de XML:
<Application
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl">
<Actividad
android: label = "@ string / nombre_apl"
android: name = ". TestActivity">
<Intencin de filtro>
<Accin android: name = "android.intent.action.MAIN" />
<Categora android: name = "android.intent.category.LAUNCHER" />
</ Intencin de filtro>
</ Actividad>
<Androide servicio: name = "MyService>
</ Service>
</ Application>
</ Manifiesto>

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.

Inicio de un servicio que se ejecuta en el inicio del sistema


Dada la naturaleza de fondo de los servicios, no es raro que un servicio a necesita ser iniciado cuando un
sistema basado en Android primero arranca. Esto puede lograrse mediante la creacin de un receptor de
radiodifusin

con

un

filtro

intencin

configurado

para

escuchar

para

el

sistema

android.intent.action.BOOT_COMPLETED intencin. Cuando se detecta un intento tal, el receptor de


radiodifusin sera simplemente invocar el servicio necesario y luego regresar. Tenga en cuenta que tal
receptor de radiodifusin tendr que solicitar el permiso android.permission.RECEIVE_BOOT_COMPLETED
para poder funcionar.

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

37. La implementacin de un servicio de Android Iniciado


en Android Estudio
En el captulo anterior cubierto una considerable cantidad de informacin relacionada con los servicios de
Android y, en este punto, el concepto de servicios puede parecer un poco abrumador. Con el fin de reforzar la
informacin en el captulo anterior, este captulo va a funcionar a travs de un tutorial Android Estudio
destinado a introducir gradualmente los conceptos de implementacin del servicio iniciado.
Dentro de este captulo, una aplicacin de ejemplo se crear y se utiliza como base para la implementacin
de un servicio de Android. En el primer caso, el servicio se crear mediante la clase IntentService. Este
ejemplo se extender posteriormente a demostrar el uso de la clase de servicio. Por ltimo, se llevarn a cabo
los pasos necesarios para la realizacin de tareas en un hilo separado cuando se utiliza la clase de
servicio. Tener servicios iniciados tratados en este captulo, el siguiente captulo, titulado Bound Servicios de
Ejecucin locales en Android estudio , se centrar en la implementacin de servicios con destino y la
comunicacin cliente-servicio.
Contenido

1 Crear el proyecto Ejemplo

2 Creacin de la clase de servicio

3 Agregar el Servicio al archivo de manifiesto

4 Inicio del servicio

5 Prueba del Ejemplo IntentService

6 Uso de la clase de servicio

7 Creacin de la Nueva Servicio

8 Modificacin de la interfaz de usuario

9 Ejecucin de la aplicacin

10 Creacin de un nuevo hilo para las tareas de servicio

11 Resumen

Crear el proyecto Ejemplo


Lanzamiento Android Studio y siga los pasos habituales para crear un nuevo proyecto, entrando
ServiceExample en el campo Nombre de la aplicacin y ebookfrenzy.com como escenario de dominio de la
empresa antes de hacer clic en el botn Siguiente.
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 ServiceExampleActivity utilizando los valores por defecto de
las opciones restantes.

356

Creacin de la clase de servicio


Antes de escribir ningn cdigo, el primer paso es agregar una nueva clase al proyecto para contener el
servicio. El primer tipo de servicio que se muestra en este tutorial es que basarse en la clase
IntentService. Como se indica en el captulo anterior ( Understanding Android Iniciado y Servicios Bound ), el
propsito de la clase IntentService es proporcionar al programador con un mecanismo conveniente para la
creacin de servicios que realizan tareas de forma asincrnica en un subproceso independiente de la
aplicacin de llamada.
Agregar

una

nueva

clase

al proyecto

haciendo

clic

derecho

sobre

el

nombre

del

paquete

com.ebookfrenzy.servicexample ubicado debajo de aplicaciones -> Java en la ventana de herramientas y


seleccionar el Proyecto Nuevo -> opcin de men Java Class. En el cuadro de dilogo Crear nueva clase
resultante, nombre de la nueva MyIntentService clase. Por ltimo, haga clic en el botn Aceptar para crear la
nueva clase.
Opina sobre el nuevo archivo MyIntentService.java en el editor de Android estudio donde se leer como
sigue:
com.ebookfrenzy.serviceexample paquete;
/ **
* Creado por <nombre> en <fecha>.
* /
public class MyIntentService {
}

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");
}
}

Aadiendo el Servicio para el archivo de manifiesto


Antes de que un servicio puede ser invocada, en primer lugar hay que aadir al archivo de manifiesto de la
aplicacin a la que pertenece. Como mnimo, esto implica la adicin de un elemento <service> junto con el
nombre de la clase del servicio.
Haga doble clic en el archivo AndroidManifest.xml (app -> manifiesta) para el proyecto actual para cargarlo en
el editor y modificar el cdigo XML para aadir el elemento de servicio como se muestra en el siguiente
listado:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.serviceexample">
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
<Actividad
android: ". ServiceExampleActivity" name =
android: label = "@ string / nombre_apl">
<Intencin de filtro>
<Accin android: name = "android.intent.action.MAIN" />

358

<Categora android: name = "android.intent.category.LAUNCHER" />


</ Intencin de filtro>
</ Actividad>
<Androide servicio: ". MyIntentService" name = />
</ Application>
</ Manifiesto>

Inicio del servicio


Ahora que el servicio ha sido implementado y declarada en el archivo de manifiesto, el siguiente paso es
agregar cdigo para iniciar el servicio cuando la aplicacin se inicia. Como suele ser el caso, el lugar ideal
para tal cdigo es el mtodo de devolucin de llamada onCreate () de la clase de actividad (que, en este
caso, se puede encontrar en el archivo ServiceExampleActivity.java). Localice y cargue el archivo en el editor
y modificar el mtodo onCreate () para agregar el cdigo para iniciar el servicio:
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;
public class ServiceExampleActivity extiende ActionBarActivity {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_service_example);
Intencin Intencin = new Intent (esto, MyIntentService.class);
StartService (intencin);
}
.
.
.
}

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 ().

Probando el Ejemplo IntentService


El servicio basado ejemplo IntentService se ha completado y listo para ser probado. Dado que el mensaje
mostrado por el servicio aparecer en el panel LogCat, es importante que este se configura en el entorno
Android Studio.
Comienza mostrando la ventana de herramientas Android utilizando el botn de men de herramientas
situada en la esquina izquierda de la barra de estado o la Alt-6 atajo de teclado. Dentro de la ventana de la

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.

Utilizando la clase de servicio


Mientras que la clase IntentService permite un servicio para ser implementado con la codificacin mnima, hay
situaciones en las que se requiera la flexibilidad y la naturaleza sincrnica de la clase de servicio. Como se
pondr de manifiesto en esta seccin, se trata de un poco de trabajo de programacin adicional para
implementar.
Con el fin de evitar la introduccin de demasiados conceptos a la vez, y como demostracin de los riesgos
inherentes a la realizacin de tareas de servicios que consumen mucho tiempo en el mismo hilo como la
aplicacin de llamada, el servicio de ejemplo creado aqu no se ejecutar la tarea de servicio en un nuevo hilo
, en lugar de confiar en el hilo principal de la aplicacin. Creacin y gestin de un nuevo hilo dentro de un
servicio se tratarn en la prxima fase del tutorial.

Cmo crear un nuevo servicio


A los efectos de este ejemplo, se aadir una nueva clase al proyecto que la subclase de la clase de
servicio. Haga clic derecho, por lo tanto, en el nombre del paquete que aparece debajo de aplicacin -> Java
en la ventana de herramientas del proyecto y seleccione Nuevo -> Servicio -> opcin de men Servicio. Crear
una nueva clase llamada MyService tanto con las opciones exportados y habilitados seleccionados.
El requisito mnimo para crear un servicio operativo es poner en prctica el mtodo de devolucin de llamada
onStartCommand () que se llamar cuando el servicio se est iniciando. Adems, el mtodo onBind () debe
devolver un valor nulo para indicar al sistema Android que este no es un servicio unido. Para los fines de este

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>

La modificacin de la interfaz de usuario


Como se har evidente cuando la aplicacin se ejecuta, en su defecto para crear un nuevo hilo para el
servicio para realizar tareas crea un problema de usabilidad grave. Con el fin de poder apreciar plenamente la
magnitud de este problema, que va a ser necesario aadir una vista Button a la interfaz de usuario de la
actividad ServiceExampleActivity y configurarlo para llamar a un mtodo cuando "clic" por el usuario.
Localice y cargue el archivo activity_service_example.xml en la ventana de herramientas Proyecto (app -> res
-> diseo -> activity_service_example.xml). Elimine el TextView y aadir una vista Button al diseo. Haga
doble clic en el nuevo botn y cambiar el texto para leer "Iniciar servicio". Utilice el men del icono de la luz de
bulbo para extraer la cadena en un recurso denominado button_text.
Con an seleccionado el nuevo botn, busque la propiedad onClick en el panel Propiedades y asignarle un
mtodo llamado buttonClick. Al finalizar, el XML para el diseo de la interfaz de usuario debe ser similar a 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
"com.ebookfrenzy.serviceexample.serviceexample.ServiceExampleActivity">
<Botn
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / button_string"
android: id = "@ + / Identificacin del botn"
android: layout_alignParentTop = "true"
android: layout_alignParentLeft = "true"
android: layout_alignParentStart = "true"
android: onClick = "buttonClick" />
</ RelativeLayout>

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.

Crear un nuevo hilo de Tareas de Servicios


Como se indica en Temas Android y manipuladores de hilo - Un Estudio Tutorial Android , la primera vez que
se inicia una aplicacin para Android, el sistema de ejecucin crea un hilo en el que todos los componentes

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

38. Implementar Servicios Bound Locales en Android


Estudio
Como se describe en detalle en los captulos anteriores, los servicios con destino, a diferencia de los servicios
iniciados, proporcionan un mecanismo para implementar la comunicacin entre un servicio de Android y uno o
ms componentes de cliente. El objetivo de este captulo es construir en la vista general de los servicios con
destino previstos en Comprensin Android Iniciado y Bound Servicios antes de embarcarse en un ejemplo de
implementacin de un servicio consolidado local en accin.
Contenido

1 Comprender Bound Servicios

2 Servicio Bound Opciones de interaccin

3 Un Android Estudio Local Bound Servicio Ejemplo

4 Adicin de un servicio Bound con el Proyecto

5 Aplicacin de la Carpeta

6 La unin del Cliente al Servicio

7 Finalizacin del Ejemplo

8 Prueba de la aplicacin

9 Resumen

Comprensin Bound Servicios


En comn con los servicios iniciados, los servicios con destino se proporcionan para permitir que las
aplicaciones para realizar tareas en segundo plano. A diferencia de servicios iniciados, sin embargo, mltiples
componentes de cliente se pueden unir a un servicio de atado y, una vez consolidado, que interactuar con el
servicio utilizando una variedad de mecanismos diferentes. Servicios Bound se crean como subclases de la
clase de servicio de Android y deben, como mnimo, aplicar el mtodo onBind (). Los componentes de cliente
se unen a un servicio a travs de una llamada al mtodo bindService (). La primera solicitud de enlace a un
servicio consolidado resultar en una llamada a ese mtodo onBind de servicio () (solicitud de enlace
posterior no desencadenar una onBind () llamada). Los clientes que deseen unirse a un servicio tambin
deben

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.

Bound Servicio Opciones de interaccin


Hay dos mecanismos recomendados para la implementacin de la interaccin entre los componentes de
cliente y un servicio de encuadernado. En el caso de que el servicio lmite es local y privado a la misma

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.

Un servicio Ejemplo Bound Android Estudio Local


La aplicacin de ejemplo creada en el resto de este captulo consistir en una sola actividad y un servicio de
encuadernado. El objetivo del servicio es atado para obtener la hora actual del sistema y devolver esa
informacin a la actividad en la que se mostrar al usuario. El servicio con destino ser local y privado a la
misma aplicacin que la actividad.
Lanzamiento Android Studio y siga los pasos habituales para crear un nuevo proyecto, que entra en
LocalBound en el campo Nombre de la aplicacin y ebookfrenzy.com como el dominio de la empresa
establecer antes de hacer clic en el botn Siguiente.
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 LocalBoundActivity con los campos que quedan
establecidos a los valores predeterminados.
Una vez que el proyecto ha sido creado, el siguiente paso es agregar una nueva clase de actuar como el
servicio de encuadernado.

Adicin de un servicio Bound con el Proyecto


Para agregar una nueva clase al proyecto, haga clic en el nombre del paquete (que se encuentra bajo la
aplicacin -> Java -> com.ebookfrenzy.localbound) dentro de la ventana de herramientas del proyecto y
seleccione Nuevo -> Servicio -> opcin de men Servicio. Especifique BoundService 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. Por defecto Android Estudio cargar el archivo BoundService.java en el
editor, donde se leer como sigue:
com.ebookfrenzy.localbound paquete;
android.app.Service importacin;
android.content.Intent importacin;
android.os.IBinder importacin;

367

public class BoundService extiende Servicio {


BoundService pblico () {
}
@ Override
pblica IBinder onBind (intencin Intencin) {
// TODO: Devolver el canal de comunicacin con el servicio.
throw new UnsupportedOperationException ("Todava no implementado");
}
}

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 ().

La unin del Cliente al Servicio


A los efectos de este tutorial, el cliente es la instancia LocalBoundActivity de la aplicacin en ejecucin. Como
se seal anteriormente, a fin de obligar con xito a un servicio y recibir el objeto IBinder devuelto por el
mtodo del servicio onBind (), es necesario para crear una subclase ServiceConnection y aplicar
onServiceConnected () y onServiceDisconnected () los mtodos de devolucin de llamada. Edite el archivo
LocalBoundActivity.java y modificarlo de la siguiente manera:
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;

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:

text = "@ string / hello_world"


layout_width = "wrap_content"
layout_height = "wrap_content"
layout_centerVertical = "true"
layout_centerHorizontal = "true"

372

android: id = "@ + / Identificacin del myTextView" />


<Botn
android:
android:
android:
android:
android:
android:
android:
android:

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

39. Android Servicios Bound remoto - Un Estudio


Android Tutorial
En esto, el captulo final dedicado a los servicios de Android, una aplicacin de ejemplo se desarrollar para
demostrar el uso de una configuracin de mensajero y manejador para facilitar la interaccin entre un cliente y
un servicio con destino remoto.

Contenido
1 Cliente de Comunicacin Servicio Remoto

2 Crear el ejemplo de aplicacin

3 El diseo de la interfaz de usuario

4 Implementacin del Servicio Bound remoto

5 Configuracin de un servicio remoto en el archivo de manifiesto

6 Lanzamiento y unin al servicio remoto

7 El envo de un mensaje al Servicio Remoto

8 Resumen

Cliente Comunicacin Servicio Remoto


Como se indica en el captulo anterior, la interaccin entre un cliente y un servicio local puede implementarse
mediante la devolucin al cliente un objeto IBinder contiene una referencia al objeto de servicio. En el caso de
servicios remotos, sin embargo, este enfoque no funciona debido a que el servicio remoto se ejecuta en un
proceso diferente y, como tal, no se puede alcanzar directamente desde el cliente.
En el caso de servicios remotos, una configuracin de Messenger y Handler debe ser creado que permite a
los mensajes que se transmiten a travs de lmites de proceso entre el cliente y el servicio.
En concreto, el servicio crea una instancia de Handler que se llamar cuando se recibe un mensaje del
cliente. En trminos de la inicializacin, es el trabajo del manejador para crear un objeto Mensajero que, a su
vez, crea un objeto IBinder que se devuelve al cliente en el mtodo onBind (). Este objeto IBinder es utilizado
por el cliente para crear una instancia del objeto Messenger y, posteriormente, para enviar mensajes al
controlador de servicio. Cada vez que un mensaje es enviado por el cliente, se llama al mtodo
handleMessage () del controlador, que pasa a travs del objeto de mensaje.
El ejemplo sencillo creado en este captulo consistir en una actividad y un servicio consolidado que se
ejecutan en procesos separados. El mecanismo del mensajero / Handler se utilizar para enviar una cadena
al servicio, que luego mostrar esa cadena en un mensaje Toast.

375

Crear el ejemplo de aplicacin


Lanzamiento Android Studio y siga los pasos para crear un nuevo proyecto, entrando RemoteBound en el
campo Nombre de la aplicacin y ebookfrenzy.com como escenario de dominio de la empresa antes de hacer
clic en el botn Siguiente.
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 RemoteBoundActivity con archivos de diseo y recursos de
men correspondientes nombrados activity_remote_bound y menu_remote_bound.

El diseo de la interfaz de usuario


Busque el archivo activity_remote_bound.xml en la ventana de herramientas del proyecto y haga doble clic en
l para cargarlo en la herramienta Diseador. Con la herramienta de diseo en modo de diseo, eliminar la
instancia TextView defecto y arrastrar y soltar un widget de botn de la paleta de manera que se coloca en el
centro de la distribucin. Haga doble clic en el botn y cambiar la propiedad de texto que diga "Enviar
mensaje". Extraer la cadena usando el men de la bombilla de un nuevo recurso de cadena llamado
button_text.
A continuacin, encienda Designer para el modo de texto y modifique el elemento Button para declarar una
propiedad onClick:
<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
"com.ebookfrenzy.remotebound.remotebound.RemoteBoundActivity">

<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>

Implementacin del Servicio Bound remoto


Con el fin de implementar el servicio con destino a distancia para este ejemplo, agregar una nueva clase al
proyecto haciendo clic derecho sobre el nombre del paquete (ubicado debajo de aplicacin -> Java) dentro de

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.

Configuracin de un servicio remoto en el archivo de manifiesto


Con el fin de representar la comunicacin entre un cliente y un servicio remoto con precisin, ser necesario
configurar el servicio para ejecutar en un proceso separado del resto de la aplicacin. Esto se logra mediante
la adicin de un androide: Propiedad proceso dentro de la <servicio> para el servicio en el archivo de
manifiesto. Con el fin de lanzar un servicio remoto, tambin es necesario proporcionar un filtro de intencin
para el servicio. Para llevar a cabo estos cambios, modificar el archivo AndroidManifest.xml agregar las
entradas necesarias:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.remotebound">
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
<Actividad
android: name = ". RemoteBoundActivity"
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 = ".
android:
android:
android:
</ Service>
</ Service>
</ Application>
</ Manifiesto>

RemoteService"
enabled = "true"
exportado = "true"
proceso = ": my_process">

378

Lanzamiento y unin al servicio remoto


Al igual que con un servicio de encuadernado local, el componente de cliente necesita implementar una
instancia de la clase ServiceConnection con onServiceConnected () y onServiceDisconnected ()
mtodos. Tambin en comn con los servicios locales, el mtodo onServiceConnected () se pasar el objeto
IBinder devuelto por el mtodo onBind () del servicio remoto que se utiliza para enviar mensajes al controlador
de servidor. En el caso de este ejemplo, el cliente es RemoteBoundActivity, el cdigo para la que est
ubicado en RemoteBoundActivity.java. Cargue este archivo y modificarlo para agregar la clase
ServiceConnection y una variable para almacenar una referencia al objeto Mensajero recibido junto con un
indicador booleano para indicar si o no se establece la conexin:

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);
}

El envo de un mensaje al Servicio Remoto


Todo lo que queda antes de probar la aplicacin es poner en prctica el mtodo sendMessage () en la clase
RemoteBoundActivity que est configurado para ser llamado cuando el botn en la interfaz de usuario es
tocado por el usuario. Este mtodo tiene que comprobar que el servicio est conectado, crear un objeto de
paquete que contiene la cadena que se mostrar por el servidor, agregarlo a un objeto de mensaje y enviarlo
al servidor:
public void sendMessage (Ver vista)
{
si el retorno (isBound!);
Msg Mensaje = Message.obtain ();
Haz Bundle = new Bundle ();
bundle.putString ("MiCadena", "mensaje recibido");
msg.setData (paquete);
tratar {
myService.send (msg);
} Catch (RemoteException e) {

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

40. Una visin general de las bases de datos SQLite


Android en Android Estudio
Las aplicaciones mviles que no necesitan para almacenar al menos una cierta cantidad de datos
persistentes son pocos y distantes entre s. El uso de bases de datos es un aspecto esencial de la mayora de
las aplicaciones, que van desde aplicaciones que estn basadas en datos casi en su totalidad, a los que
simplemente necesitan almacenar pequeas cantidades de datos, tales como la puntuacin que prevalece de
un juego.
La importancia del almacenamiento de datos persistente se hace an ms evidente si se tiene en cuenta el
ciclo de vida un tanto transitoria de la aplicacin tpica Android. Con el siempre presente riesgo de que el
sistema de ejecucin Android terminar un componente de aplicacin para liberar recursos, una estrategia
integral de almacenamiento de datos para evitar la prdida de datos es un factor clave en el diseo e
implementacin de cualquier estrategia de desarrollo de aplicaciones.
En este captulo se ofrecer una visin general del sistema de gestin de base de datos SQLite incluido con
el sistema operativo Android, junto con un resumen de las clases del SDK de Android que se proporcionan
para facilitar persistente SQLite basada en almacenamiento de base de datos desde una aplicacin
Android. Antes de profundizar en los detalles de SQLite en el contexto de desarrollo de Android, sin embargo,
una breve descripcin de las bases de datos SQL y ser cubierto.

Contenido
1 Tablas de base de datos Comprensin

2 La introduccin de esquemas de bases de datos

3 columnas y tipos de datos

4 filas de bases de datos

5 Presentacin de claves principales

6 Qu es SQLite?

7 Structured Query Language (SQL)

8 Tratando SQLite en un dispositivo virtual de Android (AVD)

9 Clases Android SQLite Java

9.1 Cursor

9.2 SQLiteDatabase

9.3 SQLiteOpenHelper

9.4 ContentValues

10 Resumen

382

La comprensin de las Tablas de base de datos


Las tablas de bases de datos proporcionan el nivel ms bsico de la estructura de datos en una base de
datos. Cada base de datos puede contener varias tablas y cada tabla est diseada para mantener la
informacin de un tipo especfico. Por ejemplo, una base de datos puede contener una tabla de clientes que
contiene el nombre, direccin y nmero de telfono para todos los clientes de una empresa en particular. La
misma base de datos tambin puede incluir una tabla de productos utilizados para almacenar las
descripciones de los productos con cdigos de los productos asociados a los artculos vendidos por la
empresa.
Cada tabla de una base de datos se le asigna un nombre que debe ser nico en la base de datos en
particular. A nombre de la tabla, una vez asignado a una tabla en una base de datos, slo podr volver a
utilizarse en el contexto de una base de datos diferente.

La introduccin de esquemas de bases de datos


Base de datos de esquema definen las caractersticas de los datos almacenados en una tabla de base de
datos. Por ejemplo, el esquema de tabla para una tabla de base de datos cliente podra definir que el nombre
del cliente es una cadena de no ms de 20 caracteres de longitud, y que el nmero de telfono del cliente es
un campo de datos numrico de un determinado formato.
Esquema tambin se utilizan para definir la estructura de las bases de datos completas y la relacin entre las
diversas tablas contenidas en cada base de datos.

Las columnas y tipos de datos


Es til en esta etapa para empezar a ver una tabla de base de datos como similar a una hoja de clculo
donde se almacenan los datos en filas y columnas.
Cada columna representa un campo de datos en la tabla correspondiente. Por ejemplo, el nombre, direccin y
datos de telfono campos de una tabla son todas las columnas.
Cada columna, a su vez, se define para contener un cierto tipo de datos que determina el tipo de datos de la
columna puede contener. Una columna diseada para almacenar nmeros sera, por lo tanto, se define como
un tipo de datos numrico.

Filas de base de datos


Cada nuevo registro que se guarda en una tabla se almacena en una fila. Cada fila, a su vez, consta de las
columnas de datos asociados con el registro guardado.
Una vez ms, tenga en cuenta la analoga de hoja de clculo descrito anteriormente en este captulo. Cada
entrada en una tabla de clientes es equivalente a una fila de una hoja de clculo y cada columna contiene los
datos para cada cliente (nombre, direccin, telfono, etc.). Cuando se agrega un nuevo cliente a la mesa, se

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.

La introduccin de claves principales


Cada tabla de base de datos debe contener uno o ms columnas que se pueden utilizar para identificar a
cada fila de la tabla nica. Esto se conoce en la terminologa de base de datos como la clave principal. Por
ejemplo, una tabla puede utilizar una columna de nmero de cuenta bancaria como la clave
principal. Alternativamente, una mesa cliente puede utilizar el nmero de seguro social del cliente como la
clave principal.
Las claves primarias permiten que el sistema de gestin de base de datos para identificar una fila especfica
en una tabla nica. Sin una clave principal no sera posible recuperar o eliminar una fila especfica en una
mesa porque no puede haber certeza de que la fila correcta ha sido seleccionada. Por ejemplo, supongamos
que exista una mesa donde el apellido del cliente haba sido definida como la clave principal. Imagnese
entonces el problema que pudiera surgir si ms de un cliente llamado "Smith" se registraron en la base de
datos. Sin alguna forma garantizada para identificar de forma nica una fila especfica, sera imposible
garantizar se est accediendo a la informacin correcta, en un momento dado.
Las claves primarias pueden comprender una sola columna o varias columnas en una tabla. Para calificar
como una sola columna de clave principal, no hay dos filas pueden contener a juego valores de clave
principal. Al utilizar varias columnas para construir una clave principal, los valores de columna individuales no
tienen que ser nico, pero todas las columnas combinadas deben ser nicos.

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 .

Structured Query Language (SQL)


Se accede a los datos en bases de datos SQLite usando un lenguaje de alto nivel conocido como Structured
Query Language. Esto normalmente se abrevia a SQL y secuela pronunciada. SQL es un lenguaje estndar
utilizado por la mayora de los sistemas de gestin de bases de datos relacionales. SQLite conforma
principalmente con el estndar SQL-92.
SQL es esencialmente un lenguaje muy simple y fcil de usar diseado especficamente para permitir la
lectura y escritura de datos de bases de datos. Porque SQL contiene un pequeo conjunto de palabras clave,
se puede aprender rpidamente. Adems, la sintaxis SQL es ms o menos idntico entre la mayora de las
implementaciones de DBMS, as que despus de haber aprendido de SQL para un sistema, es probable que
sus habilidades se trasladarn a otros sistemas de gestin de base de datos.
Mientras que algunos enunciados bsicos de SQL se utilizarn dentro de este captulo, una descripcin
detallada de SQL est fuera del alcance de este libro. Sin embargo, hay muchos otros recursos que
proporcionan una mejor visin general de SQL de lo que podramos esperar para ofrecer en un solo captulo
aqu.

Tratando SQLite en un dispositivo virtual de Android (AVD)


Para los lectores no familiarizados con las bases de datos en general y SQLite en particular, buceo derecho a
la

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

Para insertar registros en la tabla:


sqlite> insertar en los valores de contactos (nombre, direccin, telfono) ("David
Smith", "123 Main Street, California", "123-555-2323");
sqlite> insertar en los valores ("Mark Parques", "10 Upping Street, Idaho", "444-4441212") contactos (nombre, direccin, telfono);

Para recuperar todas las filas de una tabla:


sqlite> select * from contactos;
1 | David Smith | 123 Main Street, California | 123-555-2323
2 | Marcar Parques | 10 Upping Street, Idaho | 444-444-1212

Para extraer una fila que cumpla con criterios especficos:


sqlite> select * from contactos donde name = "Marca Parques";
2 | Marcar Parques | 10 Upping Street, Idaho | 444-444-1212

Para salir del entorno interactivo sqlite3:


sqlite> .Salir

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

Clases Android SQLite Java


SQLite es, como se mencion anteriormente, escrito en el lenguaje de programacin C, mientras que las
aplicaciones de Android se desarrollan principalmente utilizando Java. Para cerrar esta "brecha de lenguaje",
el SDK de Android incluye un conjunto de clases que proporcionan una capa de Java en la parte superior del
sistema de gestin de base de datos SQLite. El resto de este captulo proporcionar una descripcin bsica
de cada una de las clases principales dentro de esta categora. Ms detalles acerca de cada clase se pueden
encontrar en la documentacin en lnea Android.

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:

close () - Libera todos los recursos utilizados por el cursor y la cierra.

getCount () - Devuelve el nmero de filas que aparecen en el conjunto de resultados.

moveToFirst () - Se desplaza a la primera fila en el conjunto de resultados.

moveToLast () - Se desplaza a la ltima fila del conjunto de resultados.

MoveToNext () - Se desplaza a la siguiente fila del conjunto de resultados.

mover () - Se mueve por un desplazamiento especificado desde la posicin actual del conjunto de
resultados.

llegar <tipo> () - Devuelve el valor de la <tipo> especificada contenida en el ndice de la columna


especificada de la fila en la posicin actual del cursor (variaciones consisten en getString (), getInt (),
getShort (), getFloat () y getDouble ()).

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:

insert () - Inserta una nueva fila en una tabla de base de datos.

delete () - Elimina filas de una tabla de base de datos.

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.

close () - Cierra la base de datos.

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

41. Un Android Estudio TableLayout y TableRow Tutorial


Cuando el trabajo se inici en el siguiente captulo de este libro ( Un Tutorial de base de datos SQLite Android
estudio ) fue pensado originalmente que incluira los pasos para disear el diseo de la interfaz de usuario de
la aplicacin de ejemplo de base de datos. Rpidamente se hizo evidente, sin embargo, que la mejor manera
de implementar la interfaz de usuario era hacer uso de los puntos de vista Android TableLayout y TableRow y
que esta rea temtica se mereca un captulo autnomo. Como resultado de ello, este captulo se centrar
nicamente en el diseo de interfaz de usuario de la aplicacin de base de datos completa en el siguiente
captulo, y al hacerlo, tomar algn tiempo para introducir los conceptos bsicos de los diseos de tabla en
Android Studio.

Contenido

1 Los TableLayout y TableRow Disposicin Vistas

2 Crear el proyecto de base de datos

3 Agregar el TableLayout a la interfaz de usuario

4 Agregar y configurar los filastabla

5 Adicin de la barra de botones a la Disposicin

6 Ajuste de los mrgenes de diseo

7 Resumen

Los TableLayout y TableRow Disposicin Vistas


El propsito de la vista de contenedores TableLayout es permitir que elementos de la interfaz de usuario que
se organizarn en la pantalla en un formato de tabla consta de filas y columnas. Cada fila dentro de un
TableLayout est ocupado por una instancia de TableRow, que, a su vez, est dividida en clulas, con cada
celda que contiene una nica vista nio (que puede ser en s mismo un recipiente con mltiples ver a los
nios).
El nmero de columnas de una tabla es dictado por la fila con el mayor nmero de columnas y, por defecto, el
ancho de cada columna se define por la clula ms amplia en esa columna. Las columnas pueden ser
configurados para ser retrctil o estirable (o ambos) de tal manera que cambian de tamao con relacin a la
TableLayout padre. Adems, una nica clula puede estar configurado para abarcar varias columnas.
Considere el diseo de la interfaz de usuario se muestra en la Figura 41-1:

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.

Crear el proyecto de base de datos


Iniciar Android Studio y crear un nuevo proyecto, entrando base de datos en el campo Nombre de la
aplicacin y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn
Siguiente.
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 DatabaseActivity con archivos de diseo y recursos de
men correspondientes nombrados activity_database y menu_database respectivamente.

Agregar el TableLayout a la interfaz de usuario


Busque el archivo activity_database.xml en la ventana de herramientas Proyecto (app -> res -> diseo) y
haga doble clic en l para cargarlo en la herramienta Diseador. Por defecto, Android Studio ha utilizado un
RelativeLayout como elemento de diseo raz en la interfaz de usuario. Esto necesita ser reemplazado por un
LinearLayout orientado verticalmente. Con la herramienta de diseo en modo de texto, reemplace el cdigo
XML con el siguiente:
<LinearLayout
android: orientacin = "vertical"
android: layout_width = "fill_parent"
android: layout_height = "fill_parent"
xmlns: android = "http://schemas.android.com/apk/res/android">

</ 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

Agregar y configurar los filastabla


Ahora que el TableLayout ha sido aadido a la disposicin de la interfaz de usuario, tres casos TableRow
necesitan ser aadido como nios. Desde la paleta Diseador, busque la entrada TableRow enumerados en
Layouts y arrastrar y soltar una instancia directamente sobre la parte superior de la entrada TableLayout en el
panel rbol de componentes. Repita este paso para agregar dos filastabla ms para que el rbol de
componentes coincide Figura 41-5:

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.

Adicin de la barra de botones a la Disposicin


El siguiente paso es aadir un LinearLayout (Horizontal) vista a la vista LinearLayout padres, situada
inmediatamente debajo de la vista TableLayout. Arrastre y suelte un (Horizontal) LinearLayout instancia de la
seccin de Presentaciones de la paleta Diseador y colquelo directamente sobre la entrada LinearLayout
(vertical) en el panel rbol de componentes.
Arrastre y suelte tres objetos Button en el nuevo LinearLayout y asignar recursos de cadena para cada botn
que deca "Aadir", "Buscar" y "Borrar", respectivamente.
Con la nueva visin horizontal lineal diseo seleccionado en el rbol de componentes, haga clic en el botn
de la gravedad en la barra de herramientas de diseo (Figura 41-7) y seleccione la opcin Centro de
gravedad para que los botones estn centrados horizontalmente dentro de la pantalla:

395

Figura 41-7

Antes de continuar, compruebe tambin la jerarqua de la disposicin en el panel rbol de componentes,


teniendo mucho cuidado para asegurar la vista los nombres de identificacin coinciden con los de la figura
siguiente:

Figura 41-8

396

Ajuste de los mrgenes de diseo


Todo lo que queda es ajustar algunos de los parmetros de diseo. Comience haciendo clic en la primera
entrada TableRow en el panel rbol de componentes para que se seleccione. Mantenga presionada la tecla
Ctrl del teclado y haga clic en la segunda y tercera filastabla manera que se seleccionan los tres
elementos. En el panel Propiedades, busque la disposicin: margen categora de propiedad y, una vez
localizado, despliegue la categora y cambiar la configuracin de todos a 10DP como se muestra en la Figura
41-9:

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

android: text = "@ string / id_string"


android: id = "@ + / Identificacin del TextView" />
<TextView
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: textAppearance = "android:? attr / textAppearanceLarge"
android: text = "No asignado"
android: id = "@ + / Identificacin del productID" />
</ TableRow>
<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"
android: text = "@ string / product_string"
android: id = "@ + / Identificacin del textView3" />
<EditarTexto
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: id = "@ + / Identificacin del productName" />
</ TableRow>
<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"
android: text = "@ string / quantity_string"
android: id = "@ + / Identificacin del textView2" />
<EditarTexto
android:
android:
android:
android:
android:
</ TableRow>
</ TableLayout>

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

android: layout_margin = "10DP">


<Botn
android:
android:
android:
android:

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

42. Un Tutorial de base de datos SQLite Android Estudio


El captulo titulado Una visin general de las bases de datos SQLite Android en Android estudio cubri los
principios bsicos de la integracin de almacenamiento de base de datos relacional en las aplicaciones de
Android utilizando el sistema de gestin de base de datos SQLite. En el captulo anterior tom un desvo
menor en el territorio de disear TableLayouts dentro de la herramienta Android Studio Designer, en el curso
de la cual se cre la interfaz de usuario para una aplicacin de ejemplo de base de datos. En este captulo, el
trabajo sobre el proyecto de aplicacin de base de datos se continuar con el objetivo ltimo de completar el
ejemplo de base de datos.

Contenido

1 Sobre la base de datos Ejemplo Android Estudio

2 Creacin del modelo de datos

3 Implementacin del manejador de datos


o

3.1 El mtodo Add Handler

3.2 El mtodo de control de la consulta

3.3 El mtodo Delete Handler

4 Aplicacin de los Mtodos Actividad de eventos

5 Prueba de la aplicacin

6 Resumen

Sobre la base de datos Ejemplo Android Estudio


Como es probable que evidente por el diseo de la interfaz de usuario diseada en el captulo anterior, el
proyecto de ejemplo es una sencilla aplicacin de entrada de datos y recuperacin diseada para permitir al
usuario aadir, consultar y eliminar entradas de base de datos. La idea detrs de esta aplicacin es permitir el
rastreo de inventario de productos.
El nombre de la base de datos ser productID.db que, a su vez, contendr una nica tabla de productos con
nombre. Cada registro de la tabla de base de datos contendr un identificador de producto nico, una
descripcin del producto y la cantidad de ese elemento de productos actualmente en la accin, lo que
corresponde

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

Entero Tecla / Primaria / Incremento automtico

nombre del producto

Texto

la cantidad de producto Entero

Tabla 42-1

Creacin del modelo de datos


Una vez finalizado, la aplicacin consistir en una actividad y una clase de manejador de base de datos. El
controlador de base de datos ser una subclase de SQLiteOpenHelper y proporcionar una capa abstracta
entre la base de datos SQLite subyacente y la clase de actividad, con la actividad pidiendo al manejador de la
base de datos para interactuar con la base de datos (aadir, eliminar y consulta de las entradas de base de
datos). Para poner en prctica esta interaccin de una manera estructurada, tendr una tercera clase a
implementar para contener los datos de entrada de la base de datos, ya que se pasa entre la actividad y el
manejador. Esto es en realidad una clase muy simple capaz de mantener los valores de identificacin del
producto, nombre del producto y la cantidad del producto, junto con mtodos get y set para acceder a estos
valores. Las instancias de esta clase, entonces se pueden crear en el manejador de la actividad y la base de
datos y pasaron un lado a otro segn sea necesario. Esencialmente, esta clase puede ser pensado como la
representacin del modelo de base de datos.
Dentro Android de estudio, navegar dentro de la ventana de la herramienta Proyecto de aplicacin -> Java y
haga clic derecho en el nombre del paquete. En el men emergente, seleccione Nuevo -> Java Class opcin
y, en el cuadro de dilogo Crear nueva clase, el nombre del producto de clase antes de hacer clic en el botn
Aceptar.
Una vez creado el archivo de origen Product.java se cargar automticamente en el editor de Android
Studio. Una vez cargado, modificar el cdigo para aadir el apropiado miembros de datos y mtodos:
com.ebookfrenzy.database paquete;
public class Producto {
int _id privado;
_productname private String;
int _quantity privado;
Producto pblica () {
}
Producto pblica (int id, productname String, int cantidad) {
this._id = Identificacin;
this._productname = productname;
this._quantity = cantidad;
}
Producto pblica (String productname, int cantidad) {

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.

Implementar el manejador de datos


El manejador de datos se llevar a cabo por una subclase de la clase Android SQLiteOpenHelper y, como se
indica en una visin general de las bases de datos SQLite Android en Android Estudio , aadiendo el
constructor, onCreate () y ONUPGRADE () mtodos. Desde ser necesario que el manejador de aadir,
consultar y eliminar datos en nombre del componente de la actividad, tambin tendr que ser aadido a la
clase mtodos correspondientes.
Comience por la adicin de una segunda nueva clase al proyecto para que acte como controlador, esta vez
llamado MyDBHandler. Una vez que la nueva clase se ha creado, modificarlo para que se lea de la siguiente
manera:
com.ebookfrenzy.database paquete;
android.database.sqlite.SQLiteDatabase importacin;
android.database.sqlite.SQLiteOpenHelper importacin;

403

public class MyDBHandler extiende SQLiteOpenHelper {


@ Override
public void onCreate (db SQLiteDatabase) {
}
@ Override
public void ONUPGRADE (SQLiteDatabase db, int OldVersion,
int newVersion) {
}
}

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.

El mtodo Add Handler


El mtodo para insertar los registros de base de datos ser nombrado addProduct () y tendr como
argumento una instancia de nuestra clase modelo de datos del producto. Un objeto ContentValues se crear
en el cuerpo del mtodo y ceb con pares clave-valor para las columnas de datos extrados del objeto del
producto. A continuacin, una referencia a la base de datos se obtiene a travs de una llamada a
getWritableDatabase () seguido de una llamada al mtodo insert () del objeto de base de datos
devuelto. Finalmente, una vez se ha realizado la insercin, la base de datos necesita ser cerrado:
public void addProduct (producto) {
Valores ContentValues = new ContentValues ();
values.put (COLUMN_PRODUCTNAME, product.getProductName ());
values.put (COLUMN_QUANTITY, product.getQuantity ());

405

SQLiteDatabase db = this.getWritableDatabase ();


db.insert (TABLE_PRODUCTS, nulos, valores);
db.Close ();
}

El mtodo de control de la consulta


El mtodo para consultar la base de datos ser nombrado findProduct () y tendr como argumento un objeto
String que contiene el nombre del producto que se encuentra. El uso de esta cadena, se construir una
sentencia SQL SELECT para encontrar todos los registros coincidentes en la tabla. A los efectos de este
ejemplo, slo entonces se devolver el primer partido, contenida dentro de una nueva instancia de la clase
modelo de datos del producto:
findProduct pblica Producto (String productname) {
String query = "SELECT * FROM" + TABLE_PRODUCTS + "WHERE" + COLUMN_PRODUCTNAME +
"= \" "+ productname +" \ "";
SQLiteDatabase db = this.getWritableDatabase ();
Cursor cursor = db.rawQuery (consulta, null);
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;
}
db.Close ();
producto de regresar;
}

El mtodo Delete Handler


El mtodo de eliminacin ser nombrado deleteProduct () y aceptar como argumento la entrada que desea
eliminar en la forma de un objeto de producto. El mtodo utilizar una sentencia SQL SELECT para buscar la
entrada basada en el nombre del producto y, si se encuentra, elimina de la tabla. El xito o no de la
eliminacin se reflejarn en un valor de retorno de Boole:
deleteProduct public boolean (String productname) {
resultado booleano = false;

406

String query = "SELECT * FROM" + TABLE_PRODUCTS + "WHERE" + COLUMN_PRODUCTNAME +


"= \" "+ productname +" \ "";
SQLiteDatabase db = this.getWritableDatabase ();
Cursor cursor = db.rawQuery (consulta, null);
Producto = nuevo producto ();
si (cursor.moveToFirst ()) {
product.setID (Integer.parseInt (cursor.getString (0)));
db.delete (TABLE_PRODUCTS, column_id + "=?",
new String [] {String.valueOf (product.getID ())});
cursor.close ();
resultado = true;
}
db.Close ();
resultado regresar;
}

La implementacin de los mtodos activos de eventos


La ltima tarea antes de probar la aplicacin es cablear los controladores de eventos onClick en los tres
botones de la interfaz de usuario e implementar mtodos correspondientes para esos eventos.Localice y
cargue el archivo activity_database.xml en la herramienta de diseo, cambiar al modo de texto y localizar y
modificar los tres elementos de botn para aadir propiedades OnClick:
<Botn
android:
android:
android:
android:
android:

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

public void removeProduct (Ver vista) {


MyDBHandler dbHandler = new MyDBHandler (esto, null,
null, 1);
resultado booleano = dbHandler.deleteProduct (
. productBox.getText toString () ());
si (resultado)
{
idView.setText ("Registro eliminado");
productBox.setText ("");
quantityBox.setText ("");
}
ms
idView.setText ("No Match Found");
}
.
.
.
}

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

43. La comprensin de Proveedores de Contenido


Android en Android Estudio
En el captulo anterior trabaj a travs de la creacin de un proyecto de ejemplo basado en Android Estu dio
diseado para almacenar datos utilizando una base de datos SQLite. Cuando se implementa de esta manera,
los datos es privada para la aplicacin y, como tal, inaccesibles para otras aplicaciones que se ejecutan en el
mismo dispositivo. Si bien esto puede ser el comportamiento deseado para muchos tipos de aplicaciones,
situaciones inevitablemente surgen por lo que los datos almacenados en nombre de una aplicacin podra ser
de beneficio para otras aplicaciones. Un buen ejemplo de ello son los datos almacenados por la aplicacin
incorporados contactos en un dispositivo Android. Si bien la aplicacin Contactos es el principal responsable
de la gestin de datos de libreta de direcciones del usuario, estos datos tambin se hace accesible a
cualquier otra aplicacin que podran necesitar acceso a estos datos. Este intercambio de datos entre las
aplicaciones de Android se logra a travs de la implementacin de los proveedores de contenidos.

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

4 El contenido del resolver

5 El <proveedor> Elemento Manifiesto

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

Cuando la aplicacin de la insercin, consulta, actualizar y eliminar mtodos en el proveedor de contenido,


ser la responsabilidad de estos mtodos para identificar si el URI entrante se dirige a una fila especfica en
una tabla, o referencias mltiples filas y actuar en consecuencia. Potencialmente, esto puede ser una tarea
compleja, dado que un URI puede extenderse a mltiples niveles. Este proceso puede, sin embargo, puede
aliviar significativamente, haciendo uso de la clase UriMatcher como se describe en el captulo siguiente.

El contenido del resolver


El acceso a un proveedor de contenidos se logra a travs de un objeto ContentResolver. Una aplicacin
puede obtener una referencia a su contenido resolver haciendo una llamada al mtodo getContentResolver ()
de la contexto de aplicacin.
El objeto de contenido de resolucin contiene un conjunto de mtodos que reflejan las del proveedor de
contenidos (insercin, consulta, borrar, etc). La aplicacin simplemente hace que las llamadas a los mtodos,
especificando la URI del contenido sobre el que la operacin se va a realizar. La resolucin de contenidos y

412
objetos de proveedores de contenido a continuacin, se comunican para realizar la tarea solicitada en nombre
de la aplicacin.

El <proveedor> Elemento Manifiesto


Para que un proveedor de contenido sea visible dentro de un sistema Android, que debe ser declarada en el
archivo de manifiesto de Android para la aplicacin en la que reside. Esto se logra mediante el <proveedor>
elemento, el cual debe contener los siguientes elementos:

android:

autoridad - La

autoridad

URI

completa

del

proveedor

de

contenido. Por

ejemplo

com.example.mydbapp.mydbapp.myprovider.

android: nombre - El nombre de la clase que implementa el proveedor de contenidos. En la mayora de


los casos, este utilizar el mismo valor que la autoridad.

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

44. Un proveedor de contenido de Android Estudio


Ejemplo
Como se indica en el captulo anterior, los proveedores de contenidos proporcionan un mecanismo a travs
del cual los datos almacenados por una aplicacin de Android pueden ser accesibles a otras
aplicaciones. Despus de haber proporcionado una visin terica de los proveedores de contenidos, este
captulo continuar la cobertura de los proveedores de contenidos, ampliando el proyecto de base de datos
creada en el captulo titulado Un Tutorial de base de datos SQLite Android Estudio para implementar acceso
basado en proveedor de contenido de la base de datos.

Contenido

1 Copia del proyecto de base de datos

2 Agregar el Proveedor de Contenido del paquete

3 Creacin de la Clase Proveedor de Contenido

4 La construccin de la Autoridad y contenido URI

5 Implementacin URI Coincidencia en el Proveedor de Contenido

6 Aplicacin del Proveedor de Contenido onCreate () Mtodo

7 Aplicacin de la insercin Proveedor de Contenido Mtodo ()

8 La implementacin de la consulta Proveedor de Contenido Mtodo ()

9 La implementacin de la actualizacin Proveedor de Contenido Mtodo ()

10 Implementacin del Proveedor de Contenido eliminar Mtodo ()

11 Declaracin del proveedor de contenidos en el archivo de manifiesto

12 Modificacin de la base de datos Handler

13 Resumen

Copia del proyecto de base de datos


Con el fin de mantener intacto el proyecto de base de datos original, vamos a hacer una copia de seguridad
del proyecto antes de modificarlo para implementar el soporte del proveedor de contenido de la aplicacin. Si
el proyecto de base de datos est actualmente abierto en Android de estudio, cerrarla con el Archivo ->
opcin de men Cerrar proyecto.
Usando el sistema de explorador de archivos para su tipo de sistema operativo, vaya al directorio que
contiene los proyectos de Android Studio (que normalmente ser una carpeta llamada AndroidStudioProjects
situados en su directorio personal). Dentro de esta carpeta, copie la carpeta del proyecto de base de datos a
una nueva carpeta llamada DatabaseOriginal.

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.

Agregar el Proveedor Contenido del paquete


El siguiente paso es aadir un nuevo paquete para el proyecto de base de datos en la que se crear la clase
proveedor de contenido. Aadir este nuevo paquete mediante la navegacin dentro de la ventana de la
herramienta de proyecto de aplicacin -> Java, haga clic en la entrada de java y seleccionando la Nueva ->
opcin de men Paquete. Cuando aparezca el cuadro de dilogo Elegir directorio de destino, seleccione la
carpeta .. \ app \ src \ principal opcin \ java desde el panel Estructura de directorios y haga clic en Aceptar.
En el cuadro de dilogo Nuevo paquete, escriba el siguiente nombre del paquete en el campo de nombre
antes de hacer clic en el botn OK:
com.ebookfrenzy.database.provider

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

Creacin de la Clase Proveedor de Contenido


Como se discuti en Comprensin de Proveedores de Contenido Android en Android estudio , los
proveedores de contenidos son creados por una subclase de la clase android.content.ContentProvider. En
consecuencia, el siguiente paso es aadir una clase para el nuevo paquete de proveedor para servir como el
proveedor de contenido para esta aplicacin. Busque el nuevo paquete en la ventana de herramientas de
proyectos, haga clic en l y seleccione Nuevo -> Otros -> opcin de men Proveedor de Contenido. En el
cuadro de dilogo Nuevo Proveedor de Contenidos, introduzca MyContentProvider en el campo Nombre de
clase y la siguiente en el campo Autoridades URI:

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 construccin de la Autoridad y contenido URI


Como se indica en el captulo anterior, todos los proveedores de contenido deben haber asociado con ellos
una autoridad y un uri contenido. En la prctica, la autoridad es tpicamente el nombre del paquete completo
de

la

propia

clase

proveedor

de

contenido,

en

este

caso

com.ebookfrenzy.database.database.provider.MyContentProvider como declara cuando la nueva clase


Proveedor de Contenido fue creado en la seccin anterior.
El contenido URI variar dependiendo de los requisitos de aplicacin, pero para los propsitos de este
ejemplo comprender la autoridad con el nombre de la tabla de base de datos adjunta al final.Dentro del
archivo MyContentProvider.java, hacer las siguientes modificaciones:
com.ebookfrenzy.database.provider paquete;
android.content.ContentProvider importacin;
android.content.ContentValues de importacin;
android.database.Cursor importacin;
android.net.Uri importacin;
android.content.UriMatcher importacin;
public class MyContentProvider extiende ContentProvider {
privado static final Cadena AUTORIDAD =
"Com.ebookfrenzy.database.provider.MyContentProvider";
private static final String PRODUCTS_TABLE = "productos";
public static final de Uri CONTENT_URI =
Uri.parse ("contenido: //" + AUTORIDAD + "/" + PRODUCTS_TABLE);
MyContentProvider pblico () {
}
.
.
.
}

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.

Implementar Matching URI en el Proveedor de Contenido


Cuando los mtodos del proveedor de contenidos se llaman, ellos sern pasados como argumento un URI
que indique los datos en que la operacin se va a realizar. Este URI puede tomar la forma de una referencia a
una fila especfica en una tabla especfica. Tambin es posible que el URI ser ms general, por ejemplo
especificando slo la tabla de base de datos. Es responsabilidad de cada mtodo para identificar el tipo de Uri
y actuar en consecuencia. Esta tarea se puede aliviar considerablemente, haciendo uso de una instancia de
UriMatcher. Una vez que se ha creado una instancia UriMatcher, puede ser configurado para devolver un
valor entero especfico correspondiente al tipo de URI que detecta cuando se le pregunt a hacerlo. A los
efectos de este tutorial, vamos a estar configurando nuestra instancia UriMatcher para devolver un valor de 1
cuando el URI hace referencia a la tabla de productos enteros, y un valor de 2 cuando el URI hace referencia
a la identificacin de una fila especfica en la tabla de productos. Antes de trabajar en la creacin de la
instancia URIMatcher, primero crear dos variables enteras para representar a los dos tipos de URI:
com.ebookfrenzy.database.provider paquete;
android.content.ContentProvider importacin;
android.content.ContentValues de importacin;
android.database.Cursor importacin;
android.net.Uri importacin;
android.content.UriMatcher importacin;
public class MyContentProvider extiende ContentProvider {
privado static final Cadena AUTORIDAD =
"Com.ebookfrenzy.database.provider.MyContentProvider";
private static final String PRODUCTS_TABLE = "productos";
public static final de Uri CONTENT_URI =
Uri.parse ("contenido: //" + AUTORIDAD + "/" + PRODUCTS_TABLE);
static int productos finales pblicas = 1;
public static int products_id final = 2;
.
.
}

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

privado static final Cadena AUTORIDAD =


"Com.ebookfrenzy.database.provider.MyContentProvider";
private static final String PRODUCTS_TABLE = "productos";
public static final de Uri CONTENT_URI =
Uri.parse ("contenido: //" + AUTORIDAD + "/" + PRODUCTS_TABLE);
static int productos finales pblicas = 1;
public static int products_id final = 2;
privado static final UriMatcher sURIMatcher =
nueva UriMatcher (UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI (AUTORIDAD, PRODUCTS_TABLE, PRODUCTO);
sURIMatcher.addURI (AUTORIDAD, PRODUCTS_TABLE + "/ #",
Products_id);
}
.
.
}

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.

Implementacin del Proveedor de Contenido onCreate () Mtodo


Cuando se crea la clase proveedor de contenido e inicializado, se har una llamada al mtodo onCreate () de
la clase. Es dentro de este mtodo que las tareas de inicializacin para la clase necesitan ser realizados. A
los efectos de este ejemplo, todo lo que necesita ser realizado es una instancia de la clase MyDBHandler
implementado en una base de datos SQLite Tutorial Android Estudio que se crear. Una vez que se ha
creado este caso, tendr que ser accesible desde los otros mtodos de la clase, por lo que una declaracin
para el manejador de base de datos tambin debe ser declarado, dando lugar a los siguientes cambios en el
cdigo en el archivo MyContentProvider.java:
com.ebookfrenzy.database.provider paquete;
com.ebookfrenzy.database.MyDBHandler importacin;
android.content.ContentProvider importacin;
android.content.ContentValues de importacin;
android.database.Cursor importacin;
android.net.Uri importacin;
android.content.UriMatcher importacin;
android.database.sqlite.SQLiteDatabase importacin;
android.database.sqlite.SQLiteQueryBuilder importacin;
android.text.TextUtils de importacin;

419

public class MyContentProvider extiende ContentProvider {


privada myDB MyDBHandler;
.
.
.
@ Override
public boolean onCreate () {
myDB = new MyDBHandler (getContext (), null, null, 1);
return false;
}
}

La implementacin de la insercin Proveedor de Contenido Mtodo ()


Cuando una aplicacin o actividad cliente solicita que los datos se insertan en la base de datos subyacente,
se llamar el mtodo de insercin () de la clase proveedor de contenido. En este punto, sin embargo, todo lo
que existe en el archivo MyContentProvider.java del proyecto es un Stub, que dice lo siguiente:
@ 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");
}

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:

Utilice la sUriMatcher para identificar el tipo de URI.

Lanzar una excepcin si el URI no es vlido.

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.

Notificar a la resolucin de contenido correspondiente de que la base de datos se ha modificado.

Devuelva la URI de la fila de la tabla que acaba de agregar.

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);
}

La implementacin de la consulta Proveedor de Contenido Mtodo ()


Cuando un proveedor de contenido est llamado a devolver datos, se llama al mtodo query () de la clase de
proveedor. Cuando se llama, este mtodo se pasa todos o algunos de los siguientes argumentos:

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.

Orden de Clasificacin - El orden de clasificacin de las filas seleccionadas.

Cuando se llama, se requiere el mtodo query () para realizar las siguientes operaciones:

Utilice la sUriMatcher para identificar el tipo Uri.

Lanzar una excepcin si el URI no es vlido.

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.

Ejecute la operacin de consulta en la base de datos.

Notificar a la resolucin de contenido de la operacin.

Devuelve un objeto Cursor que contiene los resultados 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;
}

La implementacin de la actualizacin Proveedor de Contenido Mtodo ()


Se llama al mtodo update () del proveedor de contenido cuando se solicitan cambios en filas de la tabla de
base de datos existentes. El mtodo se le pasa un URI, los nuevos valores en la forma de un objeto
ContentValues y las cuerdas habituales argumentos de seleccin.
Cuando se llama, el mtodo update () tpicamente realice los siguientes pasos:

Utilice la sUriMatcher para identificar el tipo de URI.

Lanzar una excepcin si el URI no es vlido.

Obtener una referencia a una instancia modificable de la base de datos SQLite subyacente.

Realice la operacin de actualizacin adecuada en la base de datos en funcin de los criterios de


seleccin y el tipo de URI.

Notificar a la resolucin de contenido del cambio de base de datos.

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;
}

Implementacin del Proveedor de Contenido eliminar Mtodo ()


En comn con un nmero de otros mtodos de proveedores de contenido, el mtodo delete () se le pasa un
URI, una cadena de seleccin y un conjunto opcional de argumentos de seleccin. Un mtodo tpico delete ()
tambin realizar lo siguiente, y por ahora en gran parte familiar, tareas cuando llaman:

Utilice la sUriMatcher para identificar el tipo de URI.

Lanzar una excepcin si el URI no es vlido.

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.

Notificar a la resolucin de contenido del cambio de base de datos.

Devuelve el nmero de filas eliminadas como resultado de la operacin.

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

Declarando el proveedor de contenido en el archivo de manifiesto


A menos que un proveedor de contenido se declara en el archivo de manifiesto de la aplicacin a la que
pertenece, no va a ser posible que un resolvedor de contenido para localizar y acceder a ella.Como se ha
sealado, los proveedores de contenido se declaran usando la etiqueta <proveedor> y la entrada de
manifiesto debe referenciar correctamente la autoridad proveedor de contenido y el contenido URI.
A los efectos de este proyecto, por lo tanto, busque el archivo AndroidManifest.xml para el proyecto
DatabaseProvider dentro de la ventana de la herramienta de proyecto y haga doble clic en l para cargarlo en
el panel de edicin. En el panel de edicin, asegrese de que la declaracin de proveedor de contenido ya ha
sido aadida por cuando se aadi la clase MyContentProvider al proyecto Android Productora:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.database">
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
<Actividad
android: name = ". DatabaseActivity"
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>
<Proveedor android: name = ". Provider.MyContentProvider"
android: autoridades = "com.ebookfrenzy.database.provider.MyContentProvider"
android: enabled = "true"
android: exportado = "true">
</ Proveedor>
</ Application>
</ Manifiesto>

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.

Modificacin de la base de datos Handler


Cuando se cre originalmente esta aplicacin, que fue diseado para utilizar un manejador de base de datos
para acceder a la base de datos subyacente directamente. Ahora que un proveedor de contenidos se ha

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

45. Acceso Cloud Storage utilizando el Marco para un


acceso de almacenamiento en Android Estudio
Los ltimos aos han visto la amplia adopcin de los servicios de almacenamiento remoto (tambin conocido
como "almacenamiento en la nube") para almacenar los archivos de usuario y los datos.Al frente de este
crecimiento son dos factores clave. Una de ellas es que la mayora de los dispositivos mviles ofrecen ahora,
conectividad continua a Internet de alta velocidad, con lo que la transferencia de datos rpida y asequible. El
segundo factor es que, en relacin con los sistemas informticos tradicionales (tales como computadoras de
escritorio y porttiles), estos dispositivos mviles se ven limitados en trminos de recursos de
almacenamiento interno. Una alta especificacin tablet Android hoy en da, por ejemplo, por lo general viene
con 64 GB de capacidad de almacenamiento. Cuando se compara con un sistema porttil de gama media con
una unidad de disco 750 GB, la necesidad de que el almacenamiento remoto sin fisuras de los archivos es un
requisito clave para muchas aplicaciones mviles de hoy.
En reconocimiento de este hecho, Google present el Marco para un acceso de almacenamiento como parte
de la Android 4.4 SDK. En este captulo se ofrecer una visin general de alto nivel del marco de acceso de
almacenamiento en preparacin para el ms orientado al detalle tutorial contenido en el siguiente captulo,
titulado Un almacenamiento Acceso Marco Ejemplo Android Estudio .

Contenido

1 Marco El almacenamiento de Acceso

2 Trabajar con el Marco de Acceso de almacenamiento

3 Listados de archivos Picker Filtrado

4 Manejo de Resultados Intencin

5 La lectura del contenido de un archivo

6 Escritura de contenido a un archivo

7 Eliminacin de un archivo

8 Ganando acceso permanente a un archivo

9 Resumen

El Marco de Acceso de almacenamiento


Desde la perspectiva del usuario, el Marco para un acceso de almacenamiento proporciona un fcil de usar
interfaz de usuario que permite al usuario navegar, seleccionar, borrar y crear archivos alojados por los
servicios de almacenamiento (tambin conocidos como proveedores de documentos) desde las aplicaciones
de Android. El uso de este interfaz de navegacin (tambin conocido como el selector), los usuarios pueden,
por ejemplo, navegar a travs de los archivos (como documentos, audio, imgenes y videos) alojados por sus

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

Como se muestra en la figura anterior, adems de proveedores de documentos en la nube basado en el


selector tambin proporciona acceso al almacenamiento interno del dispositivo proporcionando una gama de
opciones de almacenamiento de archivos para el usuario de la aplicacin.
A travs de un conjunto de Intenciones incluye con Android 4.4, los desarrolladores de aplicaciones de
Android pueden incorporar estas capacidades de almacenamiento en aplicaciones con slo unas pocas lneas
de cdigo. Un aspecto particularmente convincente de la Marco para un acceso de almacenamiento desde el
punto de vista del desarrollador es que el proveedor documento subyacente seleccionado por el usuario es
completamente transparente para la aplicacin. Una vez que la funcionalidad de almacenamiento se ha
implementado utilizando el marco de una aplicacin, que funciona con todos los proveedores de documentos
sin ningn tipo de modificaciones de cdigo.

Trabajando con el Marco de Acceso de almacenamiento


Android 4.4 introdujo un nuevo conjunto de Intenciones diseados para integrar las caractersticas del Marco
para un acceso de almacenamiento en las aplicaciones de Android. Estos intentos mostrar la interfaz de
usuario selector Almacenamiento Marco para un acceso para el usuario y devuelven los resultados de la
interaccin con la aplicacin a travs de una llamada al mtodo onActivityResult () de la actividad que se puso
en marcha el intento. Cuando se llama al mtodo onActivityResult (), se pasa el URI del archivo seleccionado
junto con un valor que indica el xito o fracaso de la operacin.

431
Los intentos de almacenamiento de acceso Framework se pueden resumir de la siguiente manera:

ACTION_OPEN_DOCUMENT - proporciona al usuario acceso a la interfaz de usuario selector de modo


que los archivos se pueden seleccionar de los proveedores de documentos configuradas en el
dispositivo. Los archivos seleccionados se pasan de nuevo a la aplicacin en forma de objetos de Uri.

ACTION_CREATE_DOCUMENT - Permite al usuario seleccionar un proveedor de documentos, un lugar


en el almacenamiento de ese proveedor y un nombre de archivo para un nuevo archivo.Una vez
seleccionado, el archivo es creado por el Marco de Acceso de almacenamiento y el URI del archivo que
devuelve a la aplicacin para su posterior procesamiento.

Listados de archivos Picker Filtrado


Los archivos que aparecen en la interfaz de usuario selector cuando se inicia una intencin pueden ser
filtrados utilizando una variedad de opciones. Consideremos, por ejemplo, el siguiente cdigo para iniciar una
intencin ACTION_OPEN_DOCUMENT:
private static int OPEN_REQUEST_CODE final = 41;
Intencin Intencin = new Intent (Intent.ACTION_OPEN_DOCUMENT);
startActivityForResult (intencin, OPEN_REQUEST_CODE);

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

Intencin Intencin = new Intent (Intent.ACTION_OPEN_DOCUMENT);


intent.addCategory (Intent.CATEGORY_OPENABLE);
intent.setType ("image / *");
startActivityForResult (intencin, OPEN_REQUEST_CODE);

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

Manejo de Resultados Intencin


Cuando una retornos intencin control a la aplicacin, lo hace llamando al mtodo onActivityResult () de la
actividad que comenz el intento. Este mtodo se le pasa el cdigo de solicitud que se entreg a la intencin
en el momento del lanzamiento, un cdigo de resultado que indica si la intencin era exitoso y un objeto de
datos de resultados que contiene el URI del archivo seleccionado.El siguiente cdigo, por ejemplo, podra ser
utilizado como la base para el manejo de los resultados de la intencin ACTION_OPEN_DOCUMENT se
indica en la seccin anterior:
public void onActivityResult (int requestCode, int resultCode,
ResultData Intencin) {
Uri currentUri = null;
si (resultCode == Activity.RESULT_OK)
{
si (requestCode == OPEN_REQUEST_CODE)
{
si (resultData! = null) {
currentUri = resultData.getData ();
readFileContent (currentUri);

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.

Leyendo el contenido de un archivo


Los pasos exactos necesarios para leer el contenido de un archivo alojado por un proveedor de documento
depender en gran medida del tipo de archivo. Los pasos para leer las lneas de un archivo de texto, por
ejemplo, difieren de los de la imagen o archivos de audio.
Un archivo de imagen se puede asignar a un objeto de mapa de bits mediante la extraccin del descriptor de
fichero desde el objeto Uri y luego la decodificacin de la imagen en un ejemplo BitmapFactory. Por ejemplo:
ParcelFileDescriptor pFileDescriptor =
. getContentResolver () openFileDescriptor (uri, "r");
FileDescriptor FileDescriptor =
pFileDescriptor.getFileDescriptor ();
Imagen de mapa de bits = BitmapFactory.decodeFileDescriptor (FileDescriptor);
pFileDescriptor.close ();
myImageView.setImageBitmap (imagen);

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

Escritura de contenido a un archivo


Escribir en un archivo abierto conducido por un proveedor de documento es similar a la lectura con la
excepcin de que un flujo de salida se utiliza en lugar de un flujo de entrada. El siguiente cdigo, por ejemplo,
escribe el texto a la corriente de salida del archivo de almacenamiento basado referencia el Uri especificado:
tratar {
ParcelFileDescriptor pFileDescriptor = this.getContentResolver ().
openFileDescriptor (uri, "w");
FileOutputStream FileOutputStream =
nueva FileOutputStream (pFileDescriptor.getFileDescriptor ());
Cadena textContent = "Algunos texto de ejemplo";
fileOutputStream.write (textContent.getBytes ());
fileOutputStream.close ();
pFileDescriptor.close ();
} Catch (FileNotFoundException e) {
e.printStackTrace ();
} Catch (IOException e) {
e.printStackTrace ();
}

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

Ganando acceso permanente a un archivo


Cuando una aplicacin gana acceso a un archivo a travs del Marco para un acceso de almacenamiento, el
acceso seguir siendo vlida hasta que el dispositivo Android en el que se ejecuta la aplicacin se
reinicia. Acceso permanente a un archivo especfico se puede obtener "toma" de los permisos necesarios

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

46. Un Android Estudio Acceso de almacenamiento Marco


Ejemplo
Como se mencion anteriormente, el Marco para un acceso de almacenamiento facilita considerablemente el
proceso de integrar el acceso almacenamiento en la nube basado en las aplicaciones de Android. Consta de
una interfaz de usuario recogedor y un conjunto de nuevos intentos, el acceso a los archivos almacenados en
los proveedores de documentos, tales como Google Drive y Box ahora puede ser integrado en las
aplicaciones de Android con relativa facilidad. Con los conceptos bsicos del almacenamiento de Acceso
Marco Android cubiertos en el captulo anterior, este captulo va a funcionar a travs de la creacin de una
aplicacin de ejemplo que utiliza el Marco para un acceso de almacenamiento para almacenar y administrar
archivos.

Contenido

1 Sobre el Acceso de almacenamiento Marco Ejemplo

2 Crear el Acceso de almacenamiento Marco Ejemplo

3 El diseo de la interfaz de usuario

4 Declarar Solicitar Cdigos

5 Creacin de un archivo de almacenamiento nuevo

6 El onActivityResult (Mtodo)

7 Cmo guardar a un archivo de almacenamiento

8 Apertura y lectura de un archivo de almacenamiento

9 Prueba de la aplicacin de almacenamiento de acceso

10 Resumen

Sobre el ejemplo de almacenamiento de Acceso Marco


La aplicacin Android creada en este captulo se har en forma de un editor de texto rudimentaria diseado
para crear y guardar el texto archivos de forma remota en un servicio de almacenamiento en la nube
basado. En la prctica, el ejemplo funciona con cualquier proveedor de almacenamiento de documentos
basado en la nube que es compatible con el Marco para un acceso de almacenamiento, aunque para el
propsito de este ejemplo se supone que el uso de Google Drive.
En trminos funcionales, la solicitud se presentar al usuario una vista de texto de varias lneas de texto en el
que se puede introducir y edit, junto con una serie de botones que permiten archivos de texto de
almacenamiento basados a crear, abrir y guardar.

437

Crear el Acceso de almacenamiento Marco Ejemplo


Crear un nuevo proyecto en Android de estudio, entrar StorageDemo en el campo Nombre de la aplicacin y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y activar el ajuste de 19 API SDK
mnimo: Android 4.4 (KitKat). Continuar para proceder a travs de las pantallas, que solicita la creacin de
una actividad en blanco denominada StorageDemoActivity con una disposicin correspondiente llamado
activity_storage_demo y un archivo de recurso de men llamado menu_storage_demo.

El diseo de la interfaz de usuario


Tendr que ser compuesta de tres visitas para botones y una vista nica EditarTexto La interfaz de
usuario. Dentro de la ventana de herramientas del proyecto, navegar hasta el archivo de diseo
activity_storage_demo.xml ubicado en aplicacin -> res -> diseo y haga doble clic en l para cargar en la
herramienta Diseador. Con la herramienta en modo de diseo, seleccionar y eliminar el Hola Mundo! Objeto
TextView.
Cambie la herramienta Diseador de modo de texto y quitar los elementos de relleno desde el archivo de
forma que ahora se lee como se indica en el siguiente listado:
<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">

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:

id = "@ + / Identificacin del fileText"


layout_width = "match_parent"
layout_height = "wrap_content"
layout_alignParentLeft = "true"
layout_below = "@ + / Identificacin del botn"
InputType = "textMultiLine"
barras de desplazamiento = "vertical" />

</ RelativeLayout>

Declarando Solicitar Cdigos


Trabajar con archivos en el Marco para un acceso de almacenamiento consiste en desencadenar una
variedad de intenciones en funcin de la accin especfica a realizar. Invariablemente, esto se traducir en el
marco mostrar la interfaz de usuario selector de almacenamiento de modo que el usuario puede especificar la
ubicacin de almacenamiento (tal como un directorio en Google Drive y el nombre de un archivo). Cuando el

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);
}
.
.
.
}

Creacin de un archivo de almacenamiento nuevo


Cuando se selecciona el botn Nueva, la aplicacin tendr que desencadenar una intencin
ACTION_CREATE_DOCUMENT configurado para crear un archivo con un tipo MIME de texto sin
formato.Cuando la interfaz de usuario ha sido diseado, el botn Nuevo se configur para llamar a un mtodo
llamado newFile (). Es dentro de este mtodo que la intencin apropiada necesita ser puesto en marcha.
Permanecer en el archivo StorageDemoActivity.java, implementar este mtodo de la siguiente manera:

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.

Cmo guardar a un archivo de almacenamiento


Ahora que la aplicacin es capaz de crear nuevos archivos en funcin de almacenamiento, el siguiente paso
es aadir la capacidad de guardar cualquier texto introducido por el usuario en un archivo.La interfaz de
usuario est configurado para llamar al mtodo saveFile () cuando el botn Guardar se ha seleccionado por el
usuario. Este mtodo ser responsable de iniciar un nuevo intento de tipo ACTION_OPEN_DOCUMENT que
se traducir en la interfaz de usuario que aparece selector de modo que el usuario puede elegir el archivo en
el que el texto se va a almacenar. Ya que slo estamos trabajando con archivos de texto plano, la intencin
tiene que ser configurado para restringir las opciones de seleccin del usuario a los archivos existentes que
coincidan con el texto / tipo MIME llanura. Una vez identificadas las acciones a realizar por el mtodo saveFile
(), esto ahora se puede aadir al archivo de clase StorageDemoActivity.java de la siguiente manera:
public void saveFile (Ver vista)
{
Intencin Intencin = new Intent (Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory (Intent.CATEGORY_OPENABLE);
intent.setType ("text / plain");
startActivityForResult (intencin, SAVE_REQUEST_CODE);
}

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.

Apertura y lectura de un archivo de almacenamiento


Despus de haber escrito el cdigo para crear y guardar archivos de texto, la tarea final es aadir alguna s
funciones para abrir y leer un archivo del almacenamiento. Esto implicar escribir el mtodo de controlador de
eventos abrirArchivo () onClick y su aplicacin para que se inicie una intencin ACTION_OPEN_DOCUMENT:
public void abrirArchivo (Ver vista)
{
Intencin Intencin = new Intent (Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory (Intent.CATEGORY_OPENABLE);
intent.setType ("text / plain");
startActivityForResult (intencin, OPEN_REQUEST_CODE);
}

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.

Prueba de la aplicacin de almacenamiento de acceso


Con la fase de codificacin completa la aplicacin ahora est listo para ser plenamente probado. Comience
con el lanzamiento de la aplicacin en un dispositivo Android fsica y seleccionando el botn "Nuevo". Dentro
de la interfaz selector de almacenamiento resultante, seleccione una ubicacin de Google Drive y el nombre
del archivo de texto storagedemo.txt antes de seleccionar la opcin Guardar situada a la derecha del campo
de nombre de archivo.
Cuando el control vuelve a su solicitud buscan la notificacin de carga de archivos, a continuacin, escriba
algn texto en el rea de texto antes de seleccionar el botn "Guardar". Seleccione el archivo storagedemo.txt
creado previamente en el selector para guardar el contenido en el archivo. Al volver a la aplicacin, elimine el
texto y seleccione el botn "Abrir", una vez ms elegir el archivo storagedemo.txt. Cuando se devuelve el
control a la aplicacin, la vista de texto debera haber sido poblada con el contenido del archivo de texto.
Es importante sealar que el Marco para un acceso de almacenamiento en cach los archivos de
almacenamiento localmente en el caso de que el dispositivo Android carece de una conexin a Internet
activa. Una vez que se restablece la conectividad, sin embargo, los datos almacenados en cach se
sincronizarn con el servicio de almacenamiento remoto. Como prueba final de la aplicacin, por lo tanto,
inicie sesin en su cuenta de Google Drive en una ventana del navegador, navegue al archivo
storagedemo.txt y haga clic en l para ver el contenido que debera, si todo va bien, contendr el texto
guardado por la aplicacin .

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

47. Un Android Estudio VideoView y MediaController


Tutorial
Uno de los usos principales para los telfonos inteligentes y las tabletas es permitir al usuario acceder y
consumir contenido. Una forma clave de contenido ampliamente utilizado, especialmente en el caso de
dispositivos de tableta, es video.
El SDK de Android incluye dos clases que componen la aplicacin de reproduccin de vdeo en los
dispositivos Android extremadamente fciles de implementar en el desarrollo de aplicaciones. En este
captulo se ofrecer una visin general de estas dos clases, VideoView y MediaController, antes de trabajar a
travs de la creacin de una aplicacin de reproduccin de vdeo simple.

Contenido

1 Presentacin de la Android VideoView Clase

2 Presentacin de la Android MediaController Clase

3 Prueba de reproduccin de vdeo

4 Creacin de la reproduccin de vdeo Ejemplo

5 Diseo de la VideoPlayer Layout

6 Configuracin del VideoView

7 Adicin de Permiso de Internet

8 Agregar el MediaController al vdeo Ver

9 Configuracin del onPreparedListener

10 Resumen

Al presentar el Android VideoView Clase


Con mucho, la forma ms sencilla de mostrar vdeo dentro de una aplicacin Android es utilizar la clase
VideoView. Este es un componente visual que, cuando se aade a la disposicin de una actividad,
proporciona una superficie sobre la cual un video puede ser jugado. Android actualmente soporta los
siguientes formatos de vdeo:

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.

start () - Inicia la reproduccin de vdeo.

stopPlayback () - Detiene la reproduccin de vdeo.

pausa () - Hace una pausa en la reproduccin de vdeo.

isPlaying () - Devuelve un valor booleano que indica si un vdeo se est reproduciendo.

setOnPreparedListener (MediaPlayer.OnPreparedListener) - Permite un mtodo de devolucin de


llamada que se llamar cuando el vdeo est listo para jugar.

setOnErrorListener (MediaPlayer.OnErrorListener) - Permite un mtodo de devolucin de llamada que


se llama cuando se produce un error durante la reproduccin de vdeo.

setOnCompletionListener (MediaPlayer.OnCompletionListener) - Permite un mtodo de devolucin de


llamada que se llamar cuando se llega al final del video.

getDuration () - Devuelve la duracin del video. Se suelen devolver -1 menos que se llama desde dentro
del mtodo de devolucin de llamada OnPreparedListener ().

getCurrentPosition () - Devuelve un valor entero que indica la posicin actual de reproduccin.

setMediaController (MediaController) - Designa una instancia de MediaController permitiendo controles


de reproduccin que se mostrar al usuario.

Al presentar el Android MediaController Clase


Si se reproduce un vdeo, simplemente utilizando la clase VideoView, el usuario no se le dar ningn control
sobre la reproduccin, que se extender hasta que se alcance el final del video. Este problema puede
abordarse mediante la fijacin de un ejemplar de la clase a la instancia de MediaController VideoView. El
MediaController proporcionar entonces un conjunto de controles que permiten al usuario gestionar la
reproduccin (por ejemplo, haciendo una pausa y buscar hacia atrs / hacia delante en la lnea de tiempo de
vdeo).
La posicin de los controles es designado por el anclaje de la instancia de controlador a una vista especfica
en el diseo de la interfaz de usuario. Una vez conectado y anclado, aparecer brevemente los controles
cuando se inicia la reproduccin y pueden posteriormente ser restaurada en cualquier momento por el usuario
toque en la vista a la que se ancla la instancia.
Algunos de los mtodos principales de esta clase son los siguientes:

setAnchorView (Ver vista) - Designa el fin de que el controlador debe ser anclado. Esto controla la
ubicacin de los controles de la pantalla.

show () - Muestra los controles.

espectculo (int timeout) - Los controles se muestran para la duracin sealado (en milisegundos).

ocultar () - Oculta el controlador del usuario.

451

isShowing () - Devuelve un valor booleano que indica si los controles son actualmente visibles para el
usuario.

Prueba de reproduccin de vdeo


En el momento de la escritura, no es posible probar la reproduccin de vdeo cuando se usan los emuladores
de Android AVD. Para probar la funcionalidad de la reproduccin de vdeo de una aplicacin ser necesario
para desplegarlo en un dispositivo fsico.

Creacin de la reproduccin de vdeo Ejemplo


El resto de este captulo est dedicado a trabajar a travs de una aplicacin de ejemplo la intencin de utilizar
las clases VideoView y MediaController para reproducir un archivo de vdeo MPEG-4 basado en la web.
Crear un nuevo proyecto en Android de estudio, entrar VideoPlayer en el campo Nombre de la aplicacin y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
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 VideoPlayerActivity con un activity_video_player diseo
correspondiente nombre y un archivo de recurso de men llamado menu_video_player.

Disear el VideoPlayer Layout


La interfaz de usuario para la actividad principal ser simplemente consistir nicamente en una instancia de la
clase VideoView. Utilice la ventana de la herramienta de proyecto para localizar la aplicacin -> res -> diseo
-> archivo activity_video_player.xml, haga doble clic en l y cambiar la herramienta Diseador de modo de
diseo. Elimine el "Hola, mundo!" TextView, cambie al modo de texto y quitar las propiedades de relleno de la
disposicin de manera que lee el XML de la siguiente manera:
<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 = ". VideoPlayerActivity">
</ RelativeLayout>

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.

Configuracin del VideoView


El siguiente paso es configurar el VideoView con la ruta del video que desea reproducir y luego iniciar la
reproduccin. Esto se lleva a cabo cuando la actividad principal se ha inicializado, por lo que cargar el archivo
VideoPlayerActivity.java en el editor y modifique el mtodo OnCreate () como se indica en el siguiente listado:

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.

Adicin de Permiso de Internet


Un intento de ejecutar la aplicacin en este punto dara lugar a la solicitud de no poner en marcha con un
dilogo de error que aparece en el dispositivo Android que dice "No se puede visualizar el video. Lo sentimos,
este vdeo no puede ser reproducido ". Esto no es debido a un error en el cdigo o un formato de archivo de
vdeo incorrecto. El problema sera que la aplicacin est intentando acceder a un archivo en internet, pero no
ha podido solicitar permisos apropiados para hacerlo. Para resolver esto, edite el archivo AndroidManifest.xml
para el proyecto y agregar una lnea para solicitar el acceso a Internet:

<? Xml version = "1.0" encoding = "UTF-8"?>


<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.videoplayer.videoplayer">
<Usa-permiso android: name = "android.permission.INTERNET" />
<Application
android: allowBackup = "true"

454

android: icon = "@ estirable / ic_launcher"


android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
.
.
.

</ 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

Agregar el MediaController al vdeo Ver


Como la aplicacin VideoPlayer se sita actualmente, no hay manera para que el usuario controle la
reproduccin. Como se indica anteriormente, esto puede lograrse utilizando la clase MediaController. Para
agregar un controlador al VideoView, modificar el mtodo onCreate () una vez ms:
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;
android.widget.MediaController importacin;
public class VideoPlayerActivity extiende Actividad {
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_video_player);
VideoView VideoView final = (VideoView)
findViewById (R.id.videoView1);
videoView.setVideoPath (
"Http://www.ebookfrenzy.com/android_book/movie.mp4");
MediaController MediaController = new
MediaController (this);
mediaController.setAnchorView (VideoView);
videoView.setMediaController (MediaController);
videoView.start ();
}
.
.
.
}

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

Configuracin del onPreparedListener


Como ltimo ejemplo de trabajo con los medios de comunicacin basados en vdeo, el mtodo onCreate ()
ahora se ampliar para demostrar el mecanismo para la configuracin de un oyente. En este caso, un oyente
se implementar que se pretende dar salida a la duracin del vdeo como un mensaje en el panel de Android
Estudio LogCat:
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;
android.widget.MediaController importacin;
android.util.Log importacin;
android.media.MediaPlayer importacin;
public class VideoPlayerActivity extiende ActionBarActivity {
TAG String = "com.ebookfrenzy.videoplayer";
@ 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");
MediaController MediaController = new
MediaController (this);
mediaController.setAnchorView (VideoView);
videoView.setMediaController (MediaController);
videoView.setOnPreparedListener (nueva
MediaPlayer.OnPreparedListener () {
@ Override
public void onPrepared (MediaPlayer mp) {
Log.i (TAG, "Duracin =" +
videoView.getDuration ());

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

48. Grabacin de vdeo y captura de imagen usando


Intenciones Cmara - Un Estudio Android Ejemplo
Muchos dispositivos Android estn equipados con al menos una cmara. Hay un nmero de maneras de
permitir al usuario grabar vdeo desde una aplicacin Android a travs de estas cmaras incorporadas, pero
de lejos el enfoque ms fcil es hacer uso de una intencin de cmara que se incluye con el sistema
operativo Android. Esto permite una aplicacin para invocar la interfaz estndar de grabacin de vdeo
Android. Cuando el usuario ha terminado de grabar, la intencin ser volver a la aplicacin, que pasa a travs
de una referencia al archivo multimedia que contiene el vdeo grabado.
Como se demostrar en este captulo, este enfoque permite capacidades de grabacin de vdeo que se
aadirn a las aplicaciones con slo unas pocas lneas de cdigo.

Contenido

1 Comprobacin de la ayuda de la cmara

2 Llamar a la Intencin de captura de vdeo

3 Llamar a la Intencin de captura de imagen

4 Creacin de un proyecto Android Estudio de grabacin de vdeo

5 Disear el diseo de interfaz de usuario

6 Comprobacin de la cmara

7 Lanzamiento de la Intencin de captura de vdeo

8 Manejo del Retorno Intencin

9 Prueba de la aplicacin

10 Resumen

Comprobacin de la ayuda de la cmara


Antes de intentar acceder a la cmara en un dispositivo Android, es esencial que se implementar cdigo
defensiva para verificar la presencia de hardware de la cmara. Esto es de particular importancia ya que no
todos los dispositivos Android incluyen una cmara.
La presencia o no de una cmara pueden ser identificados a travs de una llamada al mtodo
PackageManager.hasSystemFeature (). Con el fin de comprobar la presencia de una cmara frontal, el cdigo
necesario

para

comprobar

la

presencia

de

la

caracterstica

PackageManager.FEATURE_CAMERA_FRONT. Esto puede ser encapsulado en el siguiente mtodo:

459

hasCamera private boolean () {


si (getPackageManager (). hasSystemFeature (
PackageManager.FEATURE_CAMERA_FRONT)) {
return true;
} Else {
return false;
}
}

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.

Llamar a la Intencin de captura de vdeo


El uso de la intencin de captura de vdeo implica, como mnimo, la ejecucin de cdigo para llamar a la
actividad intencin y un mtodo para manejar el retorno de la actividad. El Android incorporado en la intencin
de grabacin de vdeo est representado por MediaStore.ACTION_VIDEO_CAPTURE y puede ser lanzado
de la siguiente manera:
private static int VIDEO_CAPTURE final = 101;
Intencin Intencin = new Intent (MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult (intencin, VIDEO_CAPTURE);

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

Llamar a la Intencin de captura de imagen


Adems de la intencin de captura de vdeo, Android tambin incluye una intencin diseada para tomar fotos
fijas

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.

Creacin de un proyecto Android Estudio de grabacin de vdeo


En el resto de este captulo, una aplicacin muy sencilla, se crear para demostrar el uso de la intencin de
captura de vdeo. La solicitud constar de un solo botn que, al ser tocado por el usuario, pondr en marcha
el intento de captura de vdeo. Una vez que el vdeo se ha grabado y el intento de captura de vdeo
despedidos, la aplicacin simplemente mostrar la ruta de acceso al archivo de vdeo como un mensaje de
Toast. La aplicacin VideoPlayer creado en el captulo anterior puede entonces modificarse para reproducir el
vdeo grabado.
Crear un nuevo proyecto en Android de estudio, entrar CameraApp en el campo Nombre de la aplicacin y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
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 CameraAppActivity con archivos de diseo y recursos de
men correspondientes nombrados activity_camera_app y menu_camera_app.

El diseo de la interfaz de usuario de diseo


Navegar a aplicacin -> res -> diseo y haga doble clic en el archivo de diseo activity_camera_app.xml para
cargar en la herramienta Diseador. Con la herramienta de diseo en modo Diseo, elimine el "Hola,
mundo!" Vista de texto predeterminado y reemplazarlo con miras botn situado en el centro de la tela de la
pantalla. Cambie el texto en el botn para leer "Grabar vdeo" y asignar una propiedad onClick del botn para
que se llama a un mtodo llamado startRecording () cuando est seleccionado por el usuario:

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

.
.
.
}

Lanzamiento de la Intencin de captura de vdeo


El objetivo es que la captura de vdeo intencin de lanzar cuando el usuario selecciona el botn de grabacin
de vdeo. Dado que este ya est configurado para llamar a un mtodo llamado startRecording (), el siguiente
paso lgico es aplicar este mtodo en el archivo de origen CameraAppActivity.java:
com.ebookfrenzy.cameraapp paquete;
java.io.File importacin;
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;
android.net.Uri importacin;
android.os.Environment importacin;
android.provider.MediaStore importacin;
android.content.Intent importacin;
android.view.View importacin;
public class CameraAppActivity extiende ActionBarActivity {
private static int VIDEO_CAPTURE final = 101;
privada fileURI Uri;
public void startRecording (Ver vista)
{
Archivo MediaFile = new
Archivo (Environment.getExternalStorageDirectory (). GetAbsolutePath ()
+ "/myvideo.mp4");
Intencin Intencin = new Intent (MediaStore.ACTION_VIDEO_CAPTURE);
fileURI = Uri.fromFile (MediaFile);
intent.putExtra (MediaStore.EXTRA_OUTPUT, fileURI);
startActivityForResult (intencin, VIDEO_CAPTURE);
}
.
.
.
}

465

Manejo del Retorno Intencin


Cuando el control regresa detrs de la intencin de la actividad principal de la aplicacin se llama el mtodo
onActivityResult (). Todo lo que este mtodo tiene que hacer para este ejemplo es verificar el xito o no de la
captura de vdeo y mostrar la ruta del archivo en el que el vdeo se ha almacenado:
com.ebookfrenzy.cameraapp paquete;
java.io.File importacin;
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;
android.net.Uri importacin;
android.os.Environment importacin;
android.provider.MediaStore importacin;
android.content.Intent importacin;
android.view.View importacin;
android.widget.Toast importacin;
public class CameraAppActivity extiende ActionBarActivity {
.
.
.
protegida onActivityResult void (int requestCode,
int resultCode, datos de Intencin) {
si (requestCode == VIDEO_CAPTURE) {
si (resultCode == RESULT_OK) {
Toast.makeText (this, "El video se ha guardado 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 ();
}
}
}
.
.
}

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

49. Una grabacin y reproduccin Ejemplo Android Studio


usando MediaPlayer y MediaRecorder
En este captulo se ofrecer una visin general de la clase MediaRecorder y explicar los fundamentos de
cmo esta clase se puede utilizar para grabar audio o vdeo. El uso de la clase MediaPlayer para reproducir
audio tambin ser cubierto. Despus de haber cubierto lo bsico, una aplicacin de ejemplo se crear para
demostrar estas tcnicas en la accin. Adems de buscar en el manejo de audio y vdeo, en este captulo
tambin se referir a los temas de guardar archivos en la tarjeta SD y los pasos implicados en la deteccin de
si es o no un dispositivo tiene un micrfono o una cmara.

Contenido

1 Reproduccin de audio

2 Grabacin de audio y vdeo utilizando la clase MediaRecorder

3 Sobre el Proyecto Ejemplo

4 Crear el proyecto AudioApp

5 El diseo de la interfaz de usuario

6 Comprobacin de disponibilidad Micrfono

7 Realizacin de la Actividad de inicializacin

8 Aplicacin de la (Mtodo recordAudio)

9 Aplicacin de la (Mtodo stopAudio)

10 Implementar el mtodo playaudio ()

11 Configuracin de permisos en el archivo de manifiesto

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.

setDataSource () - Establece la fuente de la que el audio es jugar.

prepare () - Indica al jugador para prepararse para iniciar la reproduccin.

start () - Inicia la reproduccin.

pausa () - Hace una pausa en la reproduccin. La reproduccin puede reanudarse a travs de una
llamada al mtodo resume ().

stop () - Detiene la reproduccin.

setVolume () - Toma dos argumentos de coma flotante que especifican el volumen de reproduccin
de los canales izquierdo y derecho.

resume () - CV previamente una pausa sesin de reproduccin.

reset () - Restablece el estado de la instancia de reproductor de medios. Esencialmente establece la


instancia de nuevo al estado sin inicializar. Como mnimo, un jugador de reposicin deber tener la fuente
de datos configurado de nuevo y el mtodo prepare () llama.

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 ();

Grabacin de audio y vdeo utilizando la clase MediaRecorder


Al igual que con la reproduccin de audio, la grabacin se puede realizar usando un nmero de tcnicas
diferentes. Una opcin es utilizar la clase MediaRecorder, que, como con la clase MediaPlayer, proporciona
un nmero de mtodos que se utilizan para grabar audio:

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

setOutputFile () - Configura la ruta de acceso al archivo en el que el audio o vdeo grabado es a


almacenar.

prepare () - Prepara la instancia MediaRecorder para comenzar la grabacin.

start () - Comienza el proceso de grabacin.

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 ()

Para grabar audio, el archivo de


android.permission.RECORD_AUDIO:

manifiesto

de

la

aplicacin

debe

incluir

el

permiso

<Usa-permiso android: name = "android.permission.RECORD_AUDIO" />

Sobre el Proyecto Ejemplo


El resto de este captulo se trabajar a travs de la creacin de una aplicacin de ejemplo la intencin de
demostrar el uso de las clases MediaPlayer y MediaRecorder para implementar la grabacin y reproduccin
de audio en un dispositivo Android.
En el desarrollo de aplicaciones que hacen uso de caractersticas de hardware especficos, el micrfono es un
ejemplo de ello, es importante comprobar la disponibilidad de la funcin antes de intentar acceder a l en el
cdigo de la aplicacin. La aplicacin creado en este captulo, por lo tanto, tambin demostrar los pasos
implicados en la deteccin de la presencia o no de un micrfono en el dispositivo.

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.

Crear el proyecto AudioApp


Crear un nuevo proyecto en Android de estudio, entrar AudioApp en el campo Nombre de la aplicacin y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
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 AudioAppActivity con archivos de diseo y recursos de
men correspondientes nombrados activity_audio_app y menu_audio_app respectivamente.

El diseo de la interfaz de usuario


Una vez que el nuevo proyecto se ha creado, seleccione el archivo activity_audio_app.xml de la ventana de
herramientas del proyecto y, con la herramienta de diseo en modo Diseo, seleccione la opcin "Hola,
mundo!" TextView y eliminarlo de la disposicin. Arrastre y suelte tres vistas Button en el diseo. El
posicionamiento de los botones no es de suma importancia para este ejemplo, aunque la Figura 49-1 muestra
una disposicin sugerida.
Configure los botones para mostrar los recursos de cadena que leen Reproducir, Grabar y Detener y dar los
ven los ID de recordButton, playButton y stopButton respectivamente.

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.

Comprobacin de disponibilidad Micrfono


El intento de grabar audio en un dispositivo sin micrfono har que el sistema Android para lanzar una
excepcin. Es de vital importancia, por lo tanto, que la comprobacin de cdigo para la presencia de un
micrfono antes de hacer tal intento. Hay un nmero de maneras de hacer esto, incluyendo la comprobacin
de la presencia fsica del dispositivo. Un enfoque ms fcil, y uno que es ms probable que funcione en
diferentes dispositivos Android, es pedir al sistema Android si tiene un paquete instalado para una
caracterstica particular. Esto implica la creacin de una instancia de la clase Android PackageManager y
luego hacer una llamada a hasSystemFeature del objeto () mtodo. En este caso, la caracterstica de inters
es PackageManager.FEATURE_MICROPHONE.

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);
}
.
.
}

Realizacin de la Actividad de inicializacin


El siguiente paso es modificar el mtodo onCreate () de la actividad a realizar una serie de tareas de
inicializacin. Restante dentro del archivo AudioAppActivity.java, modificar el mtodo como sigue:
com.ebookfrenzy.audioapp paquete;
java.io.IOException importacin;
android.support.v7.app.ActionBarActivity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.content.pm.PackageManager importacin;
android.media.MediaRecorder importacin;
android.os.Environment importacin;
android.widget.Button importacin;
android.view.View importacin;
android.media.MediaPlayer importacin;
public class AudioAppActivity extiende ActionBarActivity {
privada esttica MediaRecorder MediaRecorder;
privada esttica mediaPlayer MediaPlayer;

473

audioFilePath static String privado;


stopButton Botn esttica privada;
playButton Botn esttica privada;
recordButton Botn esttica privada;
isRecording private boolean = false;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_audio_app);
recordButton = (Button) findViewById (R.id.recordButton);
playButton = (Button) findViewById (R.id.playButton);
stopButton = (Button) findViewById (R.id.stopButton);
if (! hasMicrophone ())
{
stopButton.setEnabled (false);
playButton.setEnabled (false);
recordButton.setEnabled (false);
} Else {
playButton.setEnabled (false);
stopButton.setEnabled (false);
}
audioFilePath =
Environment.getExternalStorageDirectory (). GetAbsolutePath ()
+ "/myaudio.3gp";
}
.
.
}

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";

El propsito de este cdigo es la identificacin de la ubicacin del almacenamiento de la tarjeta SD en el


dispositivo y utilizar eso para crear una ruta a un archivo llamado myaudio.acc en el que se almacenar la
grabacin de audio. El camino de la tarjeta SD (que se conoce como almacenamiento externo a pesar de que
es interna al dispositivo en muchos dispositivos Android) se obtiene a travs de una llamada al mtodo
getExternalStorageDirectory () de la clase Android Ambiente.

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" />

La implementacin de la (Mtodo recordAudio)


Cuando el usuario toca el botn de grabacin, se llama al mtodo recordAudio (). Este mtodo tendr que
activar y desactivar los botones apropiados, configure la instancia MediaRecorder con informacin sobre el
origen del audio, el formato de salida y la codificacin y la ubicacin del archivo en el que el audio se va a
guardar. Por ltimo, el preparar () y start () mtodos del objeto MediaRecorder tendr que ser
llamado. Combinados, estos requisitos resultan en la siguiente implementacin del mtodo en el archivo
AudioAppActivity.java:
public void recordAudio (Ver vista) throws IOException
{
isRecording = true;
stopButton.setEnabled (true);
playButton.setEnabled (false);
recordButton.setEnabled (false);
tratar {
MediaRecorder = new MediaRecorder ();
mediaRecorder.setAudioSource (MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat (MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setOutputFile (audioFilePath);
mediaRecorder.setAudioEncoder (MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.prepare ();
} Catch (Exception e) {
e.printStackTrace ();
}
mediaRecorder.start ();
}

La aplicacin de la stopAudio Mtodo ()


El mtodo stopAudio () es responsable de permitir el botn Reproducir, desactivando el botn Detener y luego
detener y reiniciar la instancia MediaRecorder. El cdigo para lograr esto se lee como se indica en el siguiente
listado y debe ser aadido al archivo AudioAppAcitivy.java:
public void stopAudio (Ver vista)
{
stopButton.setEnabled (false);
playButton.setEnabled (true);
si (isRecording)
{
recordButton.setEnabled (false);

475

mediaRecorder.stop ();
mediaRecorder.release ();
MediaRecorder = null;
isRecording = false;
} Else {
mediaPlayer.release ();
mediaPlayer = null;
recordButton.setEnabled (true);
}
}

Implementar el mtodo playaudio ()


El mtodo playaudio () simplemente crear una nueva instancia MediaPlayer, asigne el archivo de audio se
encuentra en la tarjeta SD como la fuente de datos y luego preparar e iniciar la reproduccin:
public void playaudio (Ver vista) throws IOException
{
playButton.setEnabled (false);
recordButton.setEnabled (false);
stopButton.setEnabled (true);
mediaPlayer = new MediaPlayer ();
mediaPlayer.setDataSource (audioFilePath);
mediaPlayer.prepare ();
mediaPlayer.start ();
}

Configuracin de permisos en el archivo de manifiesto


Antes de probar la aplicacin, es esencial que se solicitarn los permisos adecuados en el archivo de
manifiesto de la aplicacin. En concreto, la aplicacin requerir permiso para grabar audio y para acceder a la
memoria externa (tarjeta SD). Dentro de la ventana de herramientas del proyecto, busque y haga doble clic en
el archivo AndroidManifest.xml para cargar en el editor y modificar el cdigo XML para agregar las dos
etiquetas de permisos:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.audioapp.audioapp">
<Usa-permiso android: name =
"Android.permission.WRITE_EXTERNAL_STORAGE" />
<Usa-permiso android: name = "android.permission.RECORD_AUDIO" />
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"

476

android: theme = "@ style / AppTheme">


<Actividad android: ". AudioAppActivity" name =
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>
</ Application>
</ Manifiesto>

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

50. Trabajar con la API de Google Maps para Android en


Android Estudio
Cuando Google decidi introducir un servicio de mapas hace muchos aos, es difcil decir si o no alguna vez
anticiparon que tiene una versin disponible para su integracin en las aplicaciones mviles. Cuando la
primera versin basada en web de lo que eventualmente se llamara Google Maps se introdujo en 2005, el
iPhone todava tena que encender la revolucin smartphone y la empresa que se estaba desarrollando el
sistema operativo Android no sera adquirida por Google por otros seis meses. Lo que Google tena
aspiraciones para el futuro de Google Maps, es notable que considerar que todo el poder de Google Maps
ahora se puede acceder directamente a travs de las aplicaciones de Android utilizando el API de Google
Maps para Android.
Contenido
1 Los elementos de la API de Google Maps para Android

2 Crear el proyecto de Google Maps

3 Obtencin Su firma desarrollador

4 Prueba de la aplicacin

5 Entendimiento geocodificacin y geocodificacin inversa

6 Agregar un mapa a una aplicacin

7 Viendo del usuario Ubicacin actual

8 Cambiar el tipo de mapa

9 Viendo Mapa Controles al Usuario

10 Manipulacin Mapa Gesto Interaccin


o

10.1 Mapa Zooming Gestos

10.2 Mapa Desplazamiento / Toma panormica Gestos

10.3 Mapa Inclinacin Gestos

10.4 Mapa Rotacin Gestos

11 Creacin de marcadores de mapa

12 Control del Mapa de la cmara

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.

Los elementos de la API de Google Maps para Android


El API de Google Maps para Android se compone de un conjunto bsico de clases que se combinan para
proporcionar capacidades de mapeo de aplicaciones de Android. Los elementos clave de un mapa son los
siguientes:

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

Crear el proyecto de Google Maps


Crear un nuevo proyecto en Android de estudio, entrar MapDemo en el campo Nombre de la aplicacin y
com.ebookfrenzy como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y activar el ajuste de 19 API SDK
mnimo: Android 4.4 (KitKat). Continuar para proceder a travs de las pantallas, solicitando la creacin de un
Google

Maps Actividad

llamado

MapDemoActivity con

una disposicin

correspondiente

llamado

activity_map_demo.

Obtencin Su firma desarrollador


Antes de que una aplicacin puede hacer uso de la API de Google Maps para Android, primero debe
registrarse dentro de la consola de las API de Google. Antes de que una aplicacin puede ser registrado, sin
embargo, la firma promotora (tambin conocido como el SHA-1 de huellas dactilares) asociada a su entorno
de desarrollo deben ser identificados. Esto est contenido en un archivo de almacn de claves se encuentra
en el subdirectorio .android de su directorio personal y se puede obtener mediante la utilidad keytool
proporcionado como parte del SDK Java como se describe a continuacin. En orden a hacer el proceso ms
fcil, sin embargo, Android Studio agrega algunos archivos adicionales al proyecto cuando se selecciona la
opcin Actividad Google Maps durante el proceso de creacin del proyecto. Uno de estos archivos es
nombrado google_maps_api.xml y se encuentra en la aplicacin -> res -> valores carpeta del proyecto.
Contenida dentro del archivo google_maps_api.xml es un enlace a la consola de desarrollador Google. Copie
y pegue este enlace en una ventana del navegador. Una vez cargado, una pgina similar a la siguiente
aparecer:

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

La comprensin de geocodificacin y geocodificacin inversa


Es

imposible

hablar

de

mapas

ubicaciones

geogrficas

sin

cubrir

primero

el

tema

de

geocodificacin. Geocodificacin puede describirse como el proceso de conversin de una ubicacin


geogrfica basada textual (por ejemplo, una direccin de calle) en coordenadas geogrficas expresadas en
trminos de longitud y latitud. Geocodificacin se puede lograr mediante la clase Android Geocoder.Una
instancia de la clase Geocoder puede, por ejemplo, puede pasar una cadena que representa una ubicacin,
como un nombre de ciudad, direccin o cdigo de aeropuerto. El Geocoder intentar encontrar una
coincidencia para la ubicacin y devolver una lista de objetos de direccin que potencialmente coinciden con
la cadena de ubicacin, clasificados en orden con el valor ms cercano en la posicin 0 en la lista. Una
variedad de informacin puede entonces ser extrado de los objetos de direccin, incluyendo la longitud y
latitud de los posibles coincidencias.
El siguiente cdigo, por ejemplo, pide la ubicacin del Museo Nacional del Aire y del Espacio en Washington,
DC:
java.io.IOException importacin;
java.util.List importacin;
android.location.Address importacin;
android.location.Geocoder importacin;
.
.
.
latitud doble;
longitud doble;
Lista <Direccin> geocodeMatches = null;
tratar {
geocodeMatches =
nueva Geocoder (este) .getFromLocationName (
"600 Independence Ave SW, Washington, DC 20560", 1);
} Catch (IOException e) {
// Bloque catch generada automticamente TODO
e.printStackTrace ();
}
if (! geocodeMatches.isEmpty ())
{
latitud = geocodeMatches.get (0) .getLatitude ();
longitud = geocodeMatches.get (0) .getLongitude ();
}

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

humanos. Consideremos, por ejemplo, el siguiente cdigo:


java.io.IOException importacin;
java.util.List importacin;
android.location.Address importacin;
android.location.Geocoder importacin;
.
.
.
Lista <Direccin> geocodeMatches = null;
Address1 String;
Address2 String;
Estado de cuerda;
Cdigo Postal String;
Cadena Pas;
tratar {
geocodeMatches =
nuevo (este) .getFromLocation Geocoder (38.8874245, -77.0200729, 1);
} Catch (IOException e) {
// Bloque catch generada automticamente TODO
e.printStackTrace ();
}
if (! geocodeMatches.isEmpty ())
{
Address1 = geocodeMatches.get (0) .getAddressLine (0);
Address2 = geocodeMatches.get (0) .getAddressLine (1);
Estado = geocodeMatches.get (0) .getAdminArea ();
CP = geocodeMatches.get (0) .getPostalCode ();
Pas = geocodeMatches.get (0) .getCountryName ();
}

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.

Agregar un mapa a una aplicacin


La forma ms sencilla de aadir un mapa a una aplicacin es especificar en el archivo de diseo XML interfaz
de usuario para una actividad. El siguiente ejemplo de archivo de diseo muestra la instancia
SupportMapFragment aadido al archivo activity_map_demo.xml creado por Android Productora:

484

<Xmlns fragmento: 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: id = "@ + / Identificacin del mapa"
herramientas de contexto: = ". MapDemoActivity"
android: name = "com.google.android.gms.maps.SupportMapFragment" />

Viendo del usuario Ubicacin actual


Ubicacin actual del usuario se puede mostrar en el mapa mediante la obtencin de una referencia al objeto
GoogleMap asociado con el mapa que se muestra y llamar al mtodo setMyLocationEnabled () de esa
instancia, que pasa por un valor de verdad. Edite el mtodo onCreate () en el archivo MapDemoActivty.java
para permitir la visualizacin de la ubicacin actual del usuario:
com.ebookfrenzy.mapdemo paquete;
android.support.v4.app.FragmentActivity importacin;
android.os.Bundle importacin;
com.google.android.gms.maps.GoogleMap importacin;
com.google.android.gms.maps.SupportMapFragment importacin;
com.google.android.gms.maps.model.LatLng importacin;
com.google.android.gms.maps.model.MarkerOptions de importacin;
public class MapDemoActivity extiende FragmentActivity {
privada mmap GoogleMap; // Podra ser nulo si servicios de Google Play APK no est
disponible.
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_map_demo);
setUpMapIfNeeded ();
si (MMAP! = null) {
mMap.setMyLocationEnabled (true);
}
}
.
.
.
}

Cambiar el tipo de mapa


El tipo de mapa muestra puede ser modificado dinmicamente haciendo una llamada al mtodo setMapType
() del objeto GoogleMap correspondiente, que pasa a travs de uno de los siguientes valores:

GoogleMap.MAP_TYPE_NONE - Una cuadrcula vaca sin azulejos mapeo mostradas.

485

GoogleMap.MAP_TYPE_NORMAL - La vista estndar que consiste en la hoja de ruta clsica.

GoogleMap.MAP_TYPE_SATELLITE - Muestra las imgenes de satlite de la regin del mapa.

GoogleMap.MAP_TYPE_HYBRID - Muestra las imgenes de satlite con los mapas de carreteras


superpuestas.

GoogleMap.MAP_TYPE_TERRAIN - Muestra informacin topogrfica, como lneas de contorno y


colores.

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" />

Viendo Mapa Controles al Usuario


El API de Google Maps para Android ofrece una serie de controles que pueden ser opcionalmente muestran
al usuario que consiste en acercar y alejar los botones, un botn de "mi lugar" y una brjula.
Sea o no se muestran los controles de zoom y la brjula se puede controlar mediante programacin o en el
elemento de mapa de recursos de diseo XML. Para configurar los controles de programacin, una referencia
a los UiSettings objeto asociado con el objeto GoogleMap se debe obtener:

486

MapSettings UiSettings;
mapSettings = map.getUiSettings ();

Los

controles

de

zoom

estn

activados

desactivados

mediante

llamadas

al

mtodo

setZoomControlsEnabled () de los UiSettings objeto. Por ejemplo:


mapSettings.setZoomControlsEnabled (true);

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.

Manipulacin Mapa Gesto Interaccin


El API de Google Maps para Android es capaz de responder a una serie de diferentes interacciones del
usuario. Estas interacciones pueden ser usados para cambiar el rea del mapa que se muestra, el nivel de
zoom e incluso el ngulo de visin (de tal manera que una representacin 3D de la zona del mapa se muestra
para ciertas ciudades).

Mapa Zooming Gestos


Soporte para gestos relacionados con zoom dentro y fuera de un mapa puede ser activada o desactivada por
el mtodo de setZoomControlsEnabled () de los UiSettings objeto asociado con la instancia GoogleMap. Por
ejemplo, el siguiente cdigo permite gestos de zoom para nuestro mapa ejemplo:
com.google.android.gms.maps.UiSettings de importacin;
.
.
.
MapSettings UiSettings;
mapSettings = mMap.getUiSettings ();

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.

Mapa Desplazamiento / Toma panormica Gestos


Un gesto de desplazamiento, o la panormica permite al usuario moverse por el mapa arrastrando el mapa
alrededor de la pantalla con un solo movimiento de los dedos. Gestos de desplazamiento pueden ser
habilitadas en el cdigo a travs de una llamada al mtodo setScrollGesturesEnabled () de la instancia
UiSettings:
MapSettings UiSettings;
mapSettings = mMap.getUiSettings ();
mapSettings.setScrollGesturesEnabled (true);

Alternativamente, el desplazamiento en una instancia de un mapa se puede activar en un archivo de diseo


de recursos XML utilizando el mapa: propiedad uiScrollGestures.

Mapa Inclinacin Gestos


Gestos de inclinacin permiten al usuario inclinar el ngulo de proyeccin del mapa colocando dos dedos en
la pantalla y en movimiento hacia arriba y hacia abajo para ajustar el ngulo de inclinacin. Gestos de
inclinacin se pueden activar o desactivar a travs de una llamada al mtodo de la instancia UiSettings
setTiltGesturesEnabled (), por ejemplo:
MapSettings UiSettings;
mapSettings = mMap.getUiSettings ();
mapSettings.setTiltGesturesEnabled (true);

Inclinado gestos tambin pueden ser activadas y desactivadas mediante el mapa: uiTiltGestures propiedad en
un archivo de recursos de diseo XML.

Mapa de rotacin Gestos


Al colocar dos dedos en la pantalla y luego girando en un movimiento circular, el usuario puede girar la
orientacin de un mapa cuando gestos mapa de rotacin estn habilitadas. Este apoyo gesto se activa y
desactiva

en

el

cdigo

travs

de

una

llamada

al

mtodo

de

la

instancia

UiSettings

setRotateGesturesEnabled (), por ejemplo:


MapSettings UiSettings;
mapSettings = mMap.getUiSettings ();
mapSettings.setRotateGesturesEnabled (true);

Gestos de rotacin tambin se pueden activar o desactivar mediante el mapa: propiedad uiRotateGestures en
un archivo de recursos de diseo XML.

Creacin de marcadores de mapa


Los marcadores se utilizan para notificar al usuario de las ubicaciones en un mapa y tomar la forma de un
icono estndar o personalizada. Los marcadores tambin pueden incluir un ttulo y texto opcional (referido

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

Controlar el Mapa de la cmara


Debido a que las pantallas de dispositivos Android son planas y el mundo es una esfera, la API de Google
Maps para Android utiliza la proyeccin Mercator para representar a la tierra en una superficie plana. La vista
predeterminada del mapa se presenta al usuario como si a travs de una cmara suspendida por encima del
mapa y apuntando directamente hacia abajo en el mapa. El API de Google Maps para Android permite a la
meta, el zoom, rodamiento y la inclinacin de esta cmara para cambiar en tiempo real desde la aplicacin:

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.zoomIn () - Proporciona una instancia CameraUpdate zoom un nivel.

CameraUpdateFactory.zoomOut () - Proporciona una instancia CameraUpdate ampliada por un nivel.

CameraUpdateFactory.zoomTo (float) - Genera una instancia CameraUpdate que cambia el nivel de


zoom en el valor especificado.

CameraUpdateFactory.zoomBy (float) - Proporciona una instancia CameraUpdate con un nivel de zoom


aumento o disminucin en la cantidad especificada.

CameraUpdateFactory.zoomBy (flotador, Point) - Crea una instancia CameraUpdate que aumenta o


disminuye el nivel de zoom por el valor especificado.

CameraUpdateFactory.newLatLng (LatLng) - Crea una instancia CameraUpdate que cambia la latitud


objetivo de la cmara y la longitud.

CameraUpdateFactory.newLatLngZoom (LatLng, flotador) - Genera una instancia CameraUpdate que


cambia la latitud, longitud y el zoom de la cmara.

CameraUpdateFactory.newCameraPosition

(CameraPosition) -

Devuelve

una

instancia

CameraUpdate que se mueve la cmara a la posicin especificada. Un ejemplo CameraPosition se puede


obtener usando CameraPosition.Builder ().
El siguiente cdigo, por ejemplo, se acerca a la cmara por un nivel utilizando la animacin:
map.animateCamera (CameraUpdateFactory.zoomIn ());

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

map.animateCamera (CameraUpdateFactory.newCameraPosition (cameraPosition));

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

51. Impresin con el Marco Impresin Android en


Android Estudio
Con la introduccin de la versin Android 4.4 KitKat, ahora es posible imprimir el contenido de dentro de las
aplicaciones de Android. Mientras que los captulos siguientes (empezando con un Android Estudio HTML y
contenido Web Printing Ejemplo ) explorarn con ms detalle las opciones para aadir soporte de impresin
para sus propias aplicaciones, este captulo se centrar en las diversas opciones disponibles ahora impresin
en Android y los pasos necesarios para permitiendo a esas opciones. Despus de haber cubierto estos temas
iniciales, el captulo y luego ofrecer una visin general de las diversas funciones de impresin que estn
disponibles para los desarrolladores de Android en trminos de la construccin de soporte de impresin en las
aplicaciones y el trabajo a travs de algunos proyectos Android estudio que demuestran estas caractersticas
en accin.
Contenido

1 La impresin Arquitectura Android

2 El Servicios de impresin HP Plugin

3 Google Cloud Print

4 Impresin de Google Drive

5 Guardar como PDF

6 Impresin desde dispositivos Android

7 Opciones para la construccin Imprimir Apoyo en Aplicaciones Android

7.1 Impresin de imgenes

7.2 Creacin y contenido HTML Impresin

7.3 Impresin de una pgina Web

7.4 Impresin de un documento personalizado

8 Resumen

La impresin Arquitectura Android


Impresin en Android 4.4 y ms tarde lo proporciona el marco de impresin. En trminos bsicos, este marco
se compone de un Administrador de impresin y una serie de plugins de servicios de impresin. Es
responsabilidad del Administrador de impresin para manejar las solicitudes de impresin de las aplicaciones
en el dispositivo y para interactuar con los plugins de servicios de impresin que estn instalados en el
dispositivo, lo que garantiza que las solicitudes de impresin se cumplen. De forma predeterminada, muchos
dispositivos Android tienen plugins de servicios de impresin instalados para permitir la impresin utilizando el
Google Cloud Print y los servicios de Google Drive. Imprimir Servicios Plugin para otros tipos de impresora, si
no est ya instalado, tambin puede obtenerse en la tienda de Google Play. Plugins de servicios de impresin

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.

El Servicios de impresin HP Plugin


El Servicios de impresin HP Plugin se instala por defecto en la mayora de los dispositivos con Android 4.4 o
posterior. El propsito de este plugin es permitir a las aplicaciones para imprimir en las impresoras HP
compatibles que son visibles para el dispositivo Android a travs de una red inalmbrica de rea local.
La presencia de la impresin HP Servicios Plugin en un dispositivo Android se puede verificar mediante la
carga de la aplicacin Google Play y la realizacin de una bsqueda de "impresin HP Servicios Plugin". Una
vez que el plugin aparece en la Play Store, y en el caso de que el plugin no est instalado, se puede instalar
seleccionando el botn Instalar.

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.

Google Cloud Print


Google Cloud Print es un servicio proporcionado por Google que permite imprimir el contenido en su propia
impresora a travs de Internet desde cualquier lugar con conexin a Internet. Google Cloud Print es
compatible con una amplia gama de dispositivos y modelos de impresoras en forma de tanto Nube Ready e
impresoras clsicas. Una impresora Nube Listo cuenta con tecnologa incorporada que permite la impresin a
travs de la web. Los fabricantes que ofrecen las impresoras en la nube listos incluyen Brother, Canon, Dell,
Epson, HP, Kodak y Samsung. Para identificar si su impresora es a la vez la nube listo y con el apoyo de
Google Cloud Print, revise la lista de impresoras en la siguiente URL:
https://www.google.com/cloudprint/learn/printers.html
En el caso de los clsicos, la nube no impresoras Ready, Google Cloud Print proporciona soporte para la
impresin de la nube a travs de la instalacin de software en el sistema informtico al que est conectada la
impresora clsica (ya sea directamente oa travs de una red domstica o de oficina).
Para configurar Google Cloud Print, visite la siguiente pgina web y de inicio de sesin utilizando el mismo ID
de cuenta de Google que utilice al iniciar sesin en sus dispositivos Android:
https://www.google.com/cloudprint/learn/index.html
Una vez que las impresoras se han aadido a su cuenta de Google Cloud Print, se enumeran como opciones
de destino de la impresora al imprimir desde las aplicaciones de Android en sus dispositivos.

Impresin a Google Drive


Adems de apoyar las impresoras fsicas, tambin es posible guardar la salida impresa a tu cuenta de Google
Drive. Al imprimir desde un dispositivo, seleccione la opcin Guardar en Google Drive en el panel de la
impresin. El contenido que se imprimir luego sern convertidos en un archivo PDF y guardado en el
almacenamiento basado en la nube Google Drive asociado al activo actualmente Google ID de cuenta en el
dispositivo.

Guardar como PDF


La opcin de impresin final proporcionado por Android permite que el contenido impreso para ser salvo
localmente como un archivo PDF en el dispositivo Android. Una vez seleccionada, esta opcin le pedir un
nombre para el archivo PDF y una ubicacin en el dispositivo en el cual el documento se va a guardar.

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.

Impresin desde dispositivos Android


Google recomienda que las aplicaciones que ofrecen la posibilidad de imprimir el contenido lo hacen
mediante la colocacin de la opcin de impresin en el men de desbordamiento (un tema que se trata en
detalle en el captulo titulado Creacin y Gestin de desbordamiento Mens en Android). Una serie de
aplicaciones integradas con Android ahora incluyen "Imprimir ..." opciones de men.Figura 51-2, por ejemplo,
muestra la opcin Imprimir en el men de desbordamiento de la aplicacin del navegador Chrome:

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.

Opciones para Construir Imprimir Apoyo en Aplicaciones Android


El marco de impresin introducido en el Android 4.4 SDK proporciona una serie de opciones para la
incorporacin de soporte de impresin en las aplicaciones de Android. Estas opciones se pueden clasificar de
la siguiente manera:

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.

En ausencia de un ajuste de modo de escala, el sistema por defecto a SCALE_MODE_FILL. El siguiente


cdigo, por ejemplo, establece la escala de modo que quepa en la instancia PrintHelper declarado
previamente:
imagePrinter.setScaleMode (PrintHelper.SCALE_MODE_FIT);

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:

COLOR_MODE_COLOR - Indica que la imagen se va a imprimir en color.

COLOR_MODE_MONOCHROME - Indica que la imagen se va a imprimir en blanco y negro.

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.

Creacin y contenido HTML Impresin


El marco Impresin Android tambin proporciona una manera fcil de imprimir HTML contenido basado desde
una aplicacin. Este contenido puede ser en forma de contenido HTML que hace referencia la URL de una
pgina alojada en un sitio web, o el contenido HTML que se crea de forma dinmica dentro de la aplicacin.
Para habilitar la impresin de HTML, la clase WebView se ha extendido en Android 4.4 para incluir soporte
para la impresin con los requisitos mnimos de codificacin.

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>.";

webView.loadDataWithBaseURL (null, HTMLDocument,


"Text / html", "UTF-8", null);
myWebView = web View;
}

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.

Impresin de una pgina Web


Los pasos a seguir en la impresin de una pgina web son similares a los descritos anteriormente, con la
excepcin de que la vista web se pasa la direccin URL de la pgina web que se imprimir en lugar del HTML
creado de forma dinmica, por ejemplo:
webView.loadUrl ("http://developer.android.com/google/index.html");

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

Impresin de un documento personalizado


Mientras que las caractersticas de HTML e impresin web introducidos por el marco de impresin
proporcionan un camino fcil para la impresin de contenido desde una aplicacin Android, est claro que
estas opciones sern demasiado simplista para los requisitos de impresin ms avanzados. Para las tareas
de impresin ms complejos, el marco de impresin tambin proporciona soporte de impresin de
documentos personalizados. Esto permite que el contenido en forma de texto y grficos que se puede sacar
en un lienzo y luego impresa.
A diferencia de HTML y la imagen de impresin, que puede implementarse con relativa facilidad, la impresin
de documentos personalizados es un proceso ms complejo, de mltiples etapas que se indica en el estudio
Un Android documento personalizado Impresin Ejemplo captulo de este libro. Estos pasos se pueden
resumir como sigue:

Conectar con el Android Administrador de impresin

Crea una alfombrilla de impresin Adaptador sub-clasificado de la clase PrintDocumentAdapter

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

Dibuja el contenido de los lienzos pgina

Notificar al marco de impresin que el documento est listo para imprimir

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

52. Un HTML Android Studio y contenido Web Printing


Ejemplo
Como se indica en el captulo anterior, Impresin titulado con la impresin Marco de Android, el marco
Impresin Android se puede utilizar para imprimir ambas pginas web y contenido HTML creado
dinmicamente. Aunque hay mucha similitud en estos dos enfoques para la impresin, tambin hay algunas
diferencias sutiles que necesitan ser tomados en consideracin. En este captulo se trabajar a travs de la
creacin de dos ejemplos de aplicaciones con el fin de traer un poco de claridad a estas dos opciones de
impresin.
Contenido

1 Creacin del HTML Impresin Ejemplo de Aplicacin

2 Contenido Impresin HTML dinmico

3 Creacin de la pgina Web Impresin Ejemplo

4 Diseo del diseo de interfaz de usuario

5 Adicin de la opcin Imprimir del men

6 Resumen

Creacin del HTML Impresin Ejemplo de Aplicacin


Comience este ejemplo al lanzar el entorno Android Studio y crear un nuevo proyecto, entrando HTMLPrint en
el campo Nombre de la aplicacin y ebookfrenzy.com como el ajuste de dominio de la empresa antes de
hacer clic en el botn Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y activar el ajuste de 19 API SDK
mnimo: Android 4.4 (KitKat). Continuar para proceder a travs de las pantallas, que solicita la creacin de
una actividad en blanco denominada HTMLPrintActivity con una disposicin correspondiente nombrados
activity_html_print y archivo de recursos men nombrados menu_html_prin.

Impresin contenido HTML dinmico


La primera etapa de este tutorial es agregar cdigo al proyecto para crear un cierto contenido HTML y
enviarlo al marco de impresin en forma de un trabajo de impresin.
Comience por localizar el archivo HTMLPrintActivity.java (ubicado en la ventana de herramientas Proyecto en
aplicacin -> Java -> ebookfrenzy.com -> HTMLPrint) y cargarlo en el panel de edicin.Una vez cargado,
modificar el cdigo para que se lea como se indica en el siguiente listado:
com.ebookfrenzy.htmlprint paquete;

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

Creacin de la pgina Web Impresin Ejemplo


El segundo ejemplo de aplicacin que se crear en este captulo proporcionar al usuario una opcin de
men de desbordamiento para imprimir la pgina Web que se muestra actualmente en una instancia
WebView. Crear un nuevo proyecto en Android de estudio, entrar WebPrint en el campo Nombre de la
aplicacin y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn
Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y activar el ajuste de 21 API SDK
mnimo: Android 5.0 (Lollipop). Continuar para proceder a travs de las pantallas, que solicita la creacin de
una actividad en blanco denominada WebPrintActivity con una disposicin correspondiente llamado
activity_web_print con los restantes propiedades configuradas con los valores predeterminados.

El diseo de la interfaz de usuario de diseo


Cargue el archivo de recursos de diseo activity_web_print.xml en la herramienta Diseador si ya no se ha
cargado y, en modo de diseo, seleccionar y eliminar el "Hola Mundo!" Objeto TextView.Cambie a la vista
XML haciendo clic en la ficha Texto situada a lo largo del borde inferior del panel Diseador y quitar las
propiedades de relleno del archivo para que el WebView se extender a los bordes de la pantalla cuando se
aade a la disposicin:
<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 = ". WebPrintActivity">
</ RelativeLayout>

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

<? Xml version = "1.0" encoding = "UTF-8"?>


<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.webprint">
<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: ". WebPrintActivity" name =
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>
</ Application>
</ Manifiesto>

Adicin de la opcin Imprimir del men


La opcin de imprimir la pgina web ahora se agrega al men de desbordamiento usando las tcnicas
descritas en el captulo titulado Creacin y Gestin de desbordamiento Mens en Android.
El primer requisito es un recurso de cadena con la que etiquetar la opcin de men. Dentro de la ventana de
herramientas del proyecto, busque la aplicacin -> res -> Valores -> archivo strings.xml, haga doble clic en l
para cargarlo en el editor y modificarlo para agregar un nuevo recurso de cadena:
<? Xml version = "1.0" encoding = "UTF-8"?>
<recursos>
<String
<String
<String
<String

name
name
name
name

=
=
=
=

"nombre_apl"> WebPrint </ string>


"action_settings"> Configuracin </ string>
"hello_world"> Hola, mundo! </ String>
"print_string"> Imprimir </ string>

</ 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:

id = "@ + / Identificacin del action_print"


orderInCategory = "100"
showAsAction = "nunca"
title = "@ string / print_string" />

</ 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);
}

Con el mtodo onOptionsItemSelected () implement, la actividad ser llamar a un createWebPrintJob


llamado mtodo () cuando la opcin de men de impresin se selecciona en el men de desbordamiento. La
implementacin de este mtodo es idntico al utilizado en el proyecto HTMLPrint anterior y ahora se puede
aadir en el fichero de WebPrintActivity.java de tal manera que se lee como sigue:
com.ebookfrenzy.webprint paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.webkit.WebView importacin;
android.print.PrintAttributes de importacin;
android.print.PrintDocumentAdapter importacin;
android.print.PrintManager importacin;
android.content.Context importacin;
public class WebPrintActivity extiende Actividad {
myWebView WebView privado;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_web_print);
myWebView = (WebView) findViewById (R.id.myWebView);
myWebView.loadUrl (
"Http://developer.android.com/google/index.html");

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

53. Un documento Impresin Ejemplo Android Estudio


personalizado
Como hemos visto en los captulos anteriores, el marco Impresin Android hace que sea relativamente fcil
de construir soporte de impresin en las aplicaciones, siempre y cuando el contenido se presenta en forma de
una imagen o HTML marcado. Requisitos de impresin ms avanzados pueden ser satisfechas mediante el
uso de la funcin de impresin de documentos de encargo del marco de impresin.
Contenido

1 Una visin general de Android personalizada documento Impresin


o

1.1 encargo Adaptadores Imprimir

2 Preparacin del Proyecto Custom documento Impresin

3 Crear el adaptador de impresin personalizada

4 Implementacin del OnLayout () Mtodo de devolucin de llamada

5 Implementacin del OnWrite () Mtodo de devolucin de llamada

6 Comprobacin de una pgina es en la gama

7 Dibujo del contenido en la Pgina de lienzo

8 A partir del trabajo de impresin

9 Prueba de la aplicacin

10 Resumen

Una visin general de la Imprenta Android documento personalizado


En trminos simplistas, la impresin de documentos personalizada utiliza lienzos para representar las pginas
del documento a imprimir. La aplicacin dibuja el contenido que se desea imprimir en estos lienzos en forma
de formas, colores, texto e imgenes. En realidad, los lienzos estn representados por las instancias de la
clase Canvas para Android, proporcionando as acceso a una amplia seleccin de opciones de dibujo. Una
vez que todas las pginas se han elaborado el documento est impreso a continuacin.
Si bien esto suena bastante simple, en realidad hay una serie de pasos que deben realizarse para que esto
suceda, cada uno de los cuales se pueden resumir de la siguiente manera:

Implementar un adaptador de impresin personalizada sub-clasificado de la clase PrintDocumentAdapter

Obtener una referencia al servicio Administrador de impresin

Crear una instancia de la clase PdfDocument en el que almacenar las pginas del documento

Agregar pginas a la PdfDocument en forma de casos PdfDocument.Page

Obtener referencias a los objetos de lona asociados con las pginas del documento

Dibuja contenido en los lienzos

514

Escribe el documento PDF en un flujo de salida de destino proporcionada por el marco de impresin

Notifique el marco impresin de que el documento est listo para imprimir

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.

Adaptadores encargo de impresin


El papel del adaptador de impresin es proporcionar el marco Impresin con el contenido que se desea
imprimir, y para asegurarse de que tiene el formato correcto para las preferencias elegidas por el usuario
(teniendo en cuenta factores tales como el tamao del papel y la orientacin de la pgina).
Al imprimir HTML e imgenes, gran parte de este trabajo se lleva a cabo por los adaptadores de impresin
proporcionados como parte del marco de impresin Android y diseados para estas tareas de impresin
especficas. Cuando se imprime una pgina web, por ejemplo, se crea un adaptador de impresin para
nosotros cuando se realiza una llamada al mtodo createPrintDocumentAdapter () de una instancia de la
clase WebView.
En el caso de la impresin de documentos personalizados, sin embargo, es la responsabilidad del
desarrollador de aplicaciones para disear el adaptador de impresin e implementar el cdigo para dibujar y
dar formato al contenido en preparacin para la impresin.
Adaptadores de impresin personalizada son creados por sub-clasificar a la clase PrintDocumentAdapter y
anulando un conjunto de mtodos de devolucin de llamada dentro de esa clase que sern llamados por el
marco de impresin en las distintas etapas en el proceso de impresin. Estos mtodos de devolucin de
llamada se pueden resumir como sigue:

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.

Preparacin del Proyecto de encargo Impresin de documentos


Inicie el entorno de Android Studio y crear un nuevo proyecto, entrando CustomPrint en el campo Nombre de
la aplicacin y ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn
Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y activar el ajuste de 21 API SDK
mnimo: Android 5.0 (Lollipop). Continuar para proceder a travs de las pantallas, que solicita la creacin de
una actividad en blanco denominada CustomPrintActivity con archivos de diseo y recursos de men
correspondientes nombrados activity_custom_print y menu_custom_print respectivamente.
Cargue el archivo de diseo activity_custom_print.xml en la herramienta Diseador y, en modo de diseo,
seleccionar y eliminar el "Hola Mundo!" Objeto TextView. Arrastre y suelte un botn vista de la seccin Form
Widgets de la paleta y colocarlo en el centro de la vista de diseo. Doble click en la vista del botn, y cambiar
el texto que se muestra a "Imprimir documento". Extracto de la cadena en un nuevo recurso de cadena
denominado print_string. Al finalizar, el diseo de la interfaz de usuario debe coincidir con el que se muestra
en la Figura 53-1:

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>

Crear el adaptador de impresin personalizada


La mayor parte del trabajo involucrado en la impresin de un documento personalizado desde una aplicacin
Android implica la implementacin del adaptador de impresin personalizado. En este ejemplo se requiere un
adaptador de impresin con la OnLayout () y OnWrite () los mtodos de devolucin de llamada
implementado. Dentro del archivo CustomPrintActivity.java, agregue la plantilla para esta nueva clase para
que se lea de la siguiente manera:
com.ebookfrenzy.customprint paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.os.CancellationSignal importacin;
android.os.ParcelFileDescriptor importacin;
android.print.PageRange importacin;
android.print.PrintAttributes de importacin;
android.print.PrintDocumentAdapter importacin;
android.content.Context importacin;
public class CustomPrintActivity extiende Actividad {
public class MyPrintDocumentAdapter extiende PrintDocumentAdapter
{
Contexto Contexto;

517

MyPrintDocumentAdapter pblico (contexto Contexto)


{
this.context = contexto;
}
@ Override
public void OnLayout (PrintAttributes oldAttributes,
PrintAttributes newAttributes,
CancellationSignal cancellationSignal,
Devolucin de llamada LayoutResultCallback,
Metadatos Bundle) {
}

@ 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 ().

La aplicacin de la OnLayout () Mtodo de devolucin de llamada


Permanecer dentro del archivo CustomPrintActivity.java, comience por la adicin de algunas directivas de
importacin que sern requeridos por el cdigo en el OnLayout () mtodo:
com.ebookfrenzy.customprint paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.os.CancellationSignal importacin;
android.os.ParcelFileDescriptor importacin;
android.print.PageRange importacin;
android.print.PrintAttributes de importacin;

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 ().

La aplicacin de la OnWrite () Mtodo de devolucin de llamada


El mtodo de devolucin de llamada OnWrite () es el encargado de mostrar las pginas del documento y
luego notificar el marco impresin de que el documento est listo para ser impreso. Cuando se haya
completado, el mtodo OnWrite () es el siguiente:
com.ebookfrenzy.customprint paquete;
java.io.FileOutputStream importacin;
java.io.IOException importacin;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.os.CancellationSignal importacin;
android.os.ParcelFileDescriptor importacin;

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.

Comprobacin de una pgina est en rango


Como ya se expuso, cuando se llama al mtodo OnWrite () se pasa una matriz de objetos PageRange
indicando los rangos de pginas en el documento que se van a imprimir. La clase PageRange est diseado
para almacenar las pginas de inicio y fin de un rango de pginas que, a su vez, se puede acceder a travs
de la GETSTART () y getEnd () de la clase.
Cuando el mtodo OnWrite () se implement en el apartado anterior, se hizo una llamada a un mtodo
llamado pageInRange (), que toma como argumentos una matriz de objetos PageRange y un nmero de
pgina. El papel del mtodo pageInRange () es para identificar si el nmero de pgina especificado est

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;
}
.
.
}

Dibujando el contenido de la pgina Lienzo


Ahora hemos llegado al punto en algn cdigo debe ser escrito para dibujar el contenido de las pginas, por
lo que estn listos para la impresin. El contenido que consigue extraer es completamente aplicacin
especfica y limitada slo por lo que puede lograrse mediante la clase Canvas Android. A los efectos de este
ejemplo, sin embargo, un poco de texto simple y grficos se dibujan en el lienzo.
El mtodo OnWrite () ha sido diseado para llamar a un mtodo llamado drawPage () que toma como
argumentos el objeto PdfDocument.Page que representa la pgina actual y un entero que representa el
nmero de pgina. Dentro del archivo CustomPrintActivity.java este mtodo ahora se debe implementar de la
siguiente manera:
com.ebookfrenzy.customprint paquete;
java.io.FileOutputStream importacin;
java.io.IOException importacin;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.os.CancellationSignal importacin;
android.os.ParcelFileDescriptor importacin;
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;

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

A partir del trabajo de impresin


Cuando el botn "Imprimir documento" es tocado por el usuario, se llama al mtodo controlador de eventos
PrintDocument () onClick. Todo lo que queda ahora antes de la prueba puede comenzar, por lo tanto, es
aadir este mtodo para el archivo CustomPrintActivity.java, teniendo especial cuidado para asegurarse de
que se coloca fuera de la clase MyPrintDocumentAdapter:
com.ebookfrenzy.customprint paquete;
java.io.FileOutputStream importacin;
java.io.IOException importacin;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.os.CancellationSignal importacin;
android.os.ParcelFileDescriptor importacin;
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;
android.graphics.Canvas de importacin;
android.graphics.Color importacin;
android.graphics.Paint importacin;
android.print.PrintManager importacin;
android.view.View importacin;
public class CustomPrintActivity extiende Actividad {
public void PrintDocument (Ver vista)
{
PrintManager PrintManager = (PrintManager) esta
.getSystemService (Context.PRINT_SERVICE);
Cadena jobname = this.getString (R.string.app_name) +
"Documento";
printManager.print (NOMBRE DEL TRABAJO, nuevo
MyPrintDocumentAdapter (este),
nulo);
}
.
.
.
}

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

54. Generacin de un archivo de lanzamiento APK Firmado


en Android Estudio
Una vez que el trabajo de desarrollo de una aplicacin para Android se ha completado y se ha probado en
una amplia gama de dispositivos Android, el siguiente paso es preparar la solicitud de sometimiento a la
Google Play Store. Antes de la presentacin puede tener lugar, sin embargo, la solicitud debe ser
acondicionado para su liberacin y firm con una clave privada. En este captulo se trabajar a travs de los
pasos necesarios para la obtencin de una clave privada y la preparacin del paquete de solicitud de
liberacin.
Contenido

1 El Proceso de Preparacin de lanzamiento

2 Cambio de la Variante Build

3 Creacin de un archivo de almacn de claves

4 Generacin de una clave privada

5 Creacin de la aplicacin APK Archivo

6 Registro de una cuenta de Google Play Consola desarrollador

7 Versiones Carga Nueva APK a Google Play Developer Console

8 Resumen

El proceso de preparacin de lanzamiento


Hasta este punto en el libro que hemos estado construyendo proyectos de aplicacin en un modo adecuado
para la prueba y la depuracin. La construccin de un paquete de solicitud de libertad a los clientes a travs
de la tienda de Google Play, por el contrario, exige que se adopten algunas medidas adicionales. El primer
requisito es que la aplicacin se compila en modo de lanzamiento en lugar de modo de depuracin. En
segundo lugar, la solicitud deber ser firmada con una clave privada que identifica de manera nica como
desarrollador de la aplicacin. Por ltimo, el paquete de aplicacin debe estar alineado. Esto es simplemente
un proceso por el que algunos archivos de datos en el paquete de aplicacin se formatean con una cierta
alineacin de bytes para mejorar el rendimiento.
Si bien cada una de estas tareas se pueden realizar fuera del entorno Android de estudio, los procedimientos
ms fcilmente se pueden realizar utilizando el mecanismo de acumulacin Android Studio como se describe
en el resto de este captulo.

Cambio de la Variante Build


El primer paso en el proceso de generacin de un archivo firmado APK aplicacin implica cambiar la variante
de construccin para el proyecto de depuracin de su liberacin. Esto se consigue utilizando la ventana de

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.

Creacin de un archivo de almacn de claves


Para crear un archivo de almacn de claves, seleccione el Build -> Generar Firmado APK ... opcin de men
para mostrar el cuadro de dilogo Asistente para APK Generar Firmado como se muestra en la Figura 54-3:

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

Generacin de una clave privada


El siguiente paso es generar una nueva clave privada que se utiliza para firmar el paquete de solicitud. Dentro
de la seccin clave del cuadro de dilogo Nueva tienda Clave, introduzca los siguientes datos:

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.

Una contrasea adecuadamente fuerte como para proteger la clave.

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.

Creacin de la aplicacin APK Archivo


La siguiente tarea a realizar es instruir Android Studio para crear el archivo del paquete APK aplicacin en
modo de lanzamiento y luego firmar con la clave privada de nueva creacin. En este punto el dilogo

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.

Regstrese para obtener una cuenta de Google Play Consola


desarrollador
El primer paso en el proceso de presentacin de solicitudes es crear una cuenta de Google Play Consola
desarrollador. Para ello, vaya a https://play.google.com/apps/publish/signup/ y siga las instrucciones para
completar el proceso de registro. Tenga en cuenta que hay una sola vez tarifa de $ 25 para registrarse. Una
vez que una aplicacin sale a la venta, Google mantendr el 30% de todos los ingresos asociados con la
aplicacin.
Una vez que la cuenta ha sido creada, el siguiente paso es reunir informacin sobre la aplicacin. Con el fin
de llevar su aplicacin al mercado, la siguiente informacin se requerir:

Ttulo - El ttulo de la aplicacin.

Descripcin - Hasta 4.000 palabras que describen la aplicacin.

Imgenes - Hasta 8 capturas de pantalla de la aplicacin en ejecucin (se requiere un mnimo de


dos). Google recomienda capturas de pantalla de la aplicacin que se ejecuta en un "o 10" tableta
de 7 present.

Idioma - El idioma de la aplicacin (por defecto es de US Ingls).

Texto promocional - El texto que se utilizar cuando la aplicacin aparece en las caractersticas
especiales de promocin dentro del entorno de Google Play.

Tipo de aplicacin - Si su aplicacin es considerada como un juego o una aplicacin.

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.

Precios y Distribucin - Informacin sobre el precio de la aplicacin y los lugares geogrficos


donde es que se comercializan y venden.

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.

Cargar Versiones Nueva APK a la Consola de Google Play desarrollador


El primer archivo APK subido para su aplicacin invariablemente tienen un cdigo de versin de 1. Si se hace
un intento para cargar otro archivo APK con el mismo nmero de cdigo de la versin, la consola se
rechazar el archivo con el siguiente error:
Es necesario utilizar un cdigo de versin diferente para su APK, porque ya tiene uno con
el cdigo de la versin 1.

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

Por defecto, este archivo normalmente se lea como sigue:


aplicar plugin: 'com.android.application'
androide {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.ebookfrenzy.mydemoapp"
minSdkVersion 21
targetSdkVersion 21
versionCode 1
VersionName "1.0"
}
buildTypes {
liberacin {
minifyEnabled falsa
proguardFiles
getDefaultProguardFile
rules.pro'
}
}
}

('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

55. Un estudio Android Google Play In-App Tutorial


facturacin
En los primeros das de las aplicaciones mviles para los sistemas operativos como Android y iOS, el mtodo
ms comn para generar ingresos era de cobrar una cuota por adelantado para descargar e instalar la
aplicacin. Otra oportunidad de ingresos pronto fue introducido en forma de incrustar la publicidad dentro de
las aplicaciones. Quizs la opcin ms comn y lucrativo es ahora de cobrar al usuario por la compra de
artculos desde la aplicacin despus de que se ha instalado. Esto normalmente toma la forma de acceso a
un nivel ms alto en un juego, adquirir bienes virtuales o moneda, o suscribirse a la edicin digital de una
revista o peridico.
Google proporciona soporte para la integracin de aplicaciones en la compra a travs de la Google Play InApp API de facturacin. El propsito de este captulo es el de trabajar a travs de un tutorial que muestra los
pasos involucrados en la implementacin bsica de Google Play con base de facturacin en app dentro de
una aplicacin Android.

539
Contenido
[ ocultar ]

1 Instalacin del Google Play Biblioteca de facturacin

2 Crear el proyecto de facturacin Ejemplo En aplicacin

3 Adicin de Permiso de facturacin para el archivo de manifiesto

4 Agregar el archivo IInAppBillingService.aidl al Proyecto

5 Adicin de las clases de utilidad para el Proyecto

6 El diseo de la interfaz de usuario

7 Implementacin del "Click Me" Botn

8 Google Play Developer Console y cuentas de Google Wallet

9 La obtencin de la clave de licencia pblica para la Aplicacin

10 Configuracin de Google Play de facturacin en la Solicitud

11 Inicio de una Google Play In-App Billing Compra

12 Implementacin del Mtodo onActivityResult

13 Aplicacin de la Compra Terminado Listener

14 El consumo de artculo comprado

15 Al soltar el IabHelper Instancia

16 Modificacin del archivo Security.java

17 Prueba de la aplicacin de facturacin en app

18 La construccin de un APK lanzamiento

19 Creacin de una nueva En aplicacin del producto

20 Publicacin de la Solicitud para el Canal de Distribucin Alfa

21 Adicin de cuentas de prueba de facturacin en app

22 Configuracin Testing Group

23 Resolucin de problemas con In-App de Compras

24 Resumen

Instalacin de la Biblioteca Google Play facturacin


Un requisito previo para la aplicacin Google Play In-App Billing es que el Google Play Biblioteca facturacin
estar instalado en el sistema de desarrollo. Compruebe si la biblioteca se instala con el lanzamiento del SDK
de Android Gestor seleccionando Configuracin -> Gestor de SDK desde la pantalla de bienvenida Android de
estudio, oa travs de las Herramientas -> Android -> men Manager SDK de la ventana principal. Una vez
que el Administrador de SDK se haya cargado, desplcese hacia abajo a la seccin de Extras y compruebe la
columna Estado junto a la entrada de la Biblioteca Juega facturacin Google como se muestra en la Figura
55-1:

540

Figura 55-1

Si el estado de la biblioteca se muestra como no instalado, seleccione la casilla de verificacin junto a la


biblioteca y haga clic en Instalar los paquetes ... botn. Una vez que la descarga se haya completado, el SDK
se habr instalado en el sdk / extras / google / play_billing subcarpeta del directorio de instalacin de Android
Studio (cuya ubicacin se encuentra en el campo Ruta SDK en la parte superior de la ventana del
Administrador de Android SDK ).
Dentro de la subcarpeta SDK anterior reside un archivo llamado IInAppBillingService.aidl que deber ser
incluido con cualquier proyecto que requieren Google Play soporte de facturacin. La carpeta tambin incluye
una aplicacin de ejemplo (que figura en el sub-directorio de ejemplos) llamado TrivialDrive. Parte de esta
aplicacin de ejemplo es un paquete que contiene un conjunto de clases de conveniencia que facilitan
considerablemente el proceso de integracin de la facturacin en una aplicacin. Ms adelante en este
tutorial, estas clases se importarn a nuestro propio proyecto de aplicacin y se utilizan para implementar la
facturacin en app.

Crear el proyecto de facturacin Ejemplo En aplicacin


El objetivo de este tutorial es para crear una sencilla aplicacin que utiliza el sistema de facturacin de Google
en la aplicacin para permitir que las compras de consumibles que se hagan. La solicitud constar de dos
botones, uno de los cuales ser desactivado por defecto. A fin de que el botn de modo que se puede hacer
clic, el usuario debe comprar un elemento "botn de clic" haciendo clic en el segundo botn y completar una
compra. El primer botn entonces ser habilitado un solo clic, antes de ser desactivado hasta que el usuario
realiza otra compra.
Crear un nuevo proyecto en Android de estudio, entrar InAppBilling en el campo Nombre de la aplicacin y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y activar el ajuste de 19 API SDK
mnimo: Android 4.4 (KitKat). Continuar para proceder a travs de las pantallas, que solicita la creacin de
una actividad en blanco denominada InAppBillingActivity con archivos de diseo y de recursos men
nombrados activity_in_app_billing y menu_in_app_billing correspondiente.

541
Haga clic en Finalizar para iniciar el proceso de creacin del proyecto.

Adicin de Permiso de facturacin para el archivo de manifiesto


Antes de que una aplicacin puede apoyar la facturacin en app, una nueva lnea de permiso debe ser
aadido al archivo AndroidManifest.xml del proyecto. Dentro de la ventana de herramientas del proyecto, por
lo tanto, localizar y cargar el archivo AndroidManifest.xml para el proyecto InAppBilling recin creado y
modificarlo para agregar el permiso de facturacin de la siguiente manera:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Xmlns manifiestan: android = "http://schemas.android.com/apk/res/android"
paquete = "com.ebookfrenzy.inappbilling">
<Usa-permiso android: name = "com.android.vending.BILLING" />
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">
<Actividad
android: name = ". InAppBillingActivity"
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>
</ Application>
</ Manifiesto>

Agregar el archivo IInAppBillingService.aidl al Proyecto


El archivo IInAppBillingService.aidl incluye como parte de la Biblioteca de facturacin Google Play ahora hay
que aadir al proyecto. Este archivo debe ser aadido de manera que est contenida en un paquete llamado
com.android.vending.BILLING ubicada en la aplicacin -> AIDL carpeta del mdulo de proyectos InAppBilling.
Para crear el directorio AIDL, haga clic en el nodo de aplicacin en la ventana de herramientas del proyecto,
seleccionando el Nuevo -> Carpeta -> Carpeta AIDL opcin de men, como se muestra en la Figura 56-2:

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

com.android.vending.BILLING en el campo de texto y haga clic en Aceptar.


Usando el explorador o herramienta de bsqueda de su sistema operativo, vaya a la <ruta sdk> / sdk / extras /
google / play_billing donde <ruta sdk> se sustituye por el camino en el que ha instalado el SDK de
Android. Desde esta ubicacin, copie el archivo IInAppBillingService.aidl, volver a Android Estudio y pegue el
archivo en el paquete com.android.vending.BILLING en la ventana de herramientas del proyecto. En el cuadro
de dilogo Copiar, acepte la configuracin predeterminada y haga clic en el botn Aceptar. En este punto las
secciones pertinentes de la ventana de herramientas del proyecto deben organizarse para que coincida con la
de la Figura 56-3:

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.

Aadiendo las clases de utilidad para el Proyecto


El proyecto de ejemplo TrivialDrive que se instal en el SDK como parte de la biblioteca de Google Play
facturacin incluye un conjunto de clases destinadas especficamente para hacer la tarea de implementar la
facturacin en app fcil. Aunque incluido como parte del proyecto TrivialDrive, estas clases son de uso
general en la naturaleza y son aplicables a la mayora de los requisitos de facturacin aplicacin. A los
efectos de este ejemplo, vamos a crear un nuevo paquete llamado <paquete namecom.ebookfrenzy>
.inappbilling.util dentro de nuestro proyecto.
Para crear este paquete, haga clic en la aplicacin -> carpeta de Java en la ventana de herramientas del
proyecto y seleccione Nuevo del -> opcin de men Paquete. En el cuadro de dilogo resultante, seleccione ..
\ app \ src \ Main \ java desde el panel Estructura de directorios y haga clic en Aceptar. En el siguiente nombre
de dilogo com.ebookfrenzy.inappbilling.util paquete y haga clic en Finalizar.
El siguiente paso es importar los archivos de clase de utilidad TrivialDrive en el proyecto Android
Studio. Volviendo a la ventana del explorador del sistema de archivos (y suponiendo que todava se coloca en
el <Android Studio> / sdk extras directorio / / google / play_billing), vaya ms lejos en la jerarqu a del sistema
de archivos en el directorio siguiente:
muestras / TrivialDrive / src / com / example / android / trivialdrivesample / util

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

El diseo de la interfaz de usuario


La interfaz de usuario, como se indica anteriormente, va a constar de dos botones, el primero de los cuales
slo se puede hacer clic despus de una compra se ha realizado a travs de un interpretadas hacer clic en el
segundo botn. Haga doble clic en la aplicacin -> res -> diseo -> archivo activity_in_app_billing.xml para
cargar en la herramienta Designer y disear la interfaz de usuario de forma que se asemeja a la de la Figura
55-5:

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.

La aplicacin de la "Click Me" Botn


Cuando se lanz inicialmente la solicitud, el "Click Me!" Botn estar deshabilitado. Para asegurarse de que
esto sucede, cargue el archivo InAppBillingActivity.java en el editor y modifique el mtodo onCreate para
obtener una referencia a los dos botones y luego desactivar el clickButton:
com.ebookfrenzy.inappbilling paquete;
android.app.Activity importacin;
android.os.Bundle importacin;
android.view.Menu importacin;
android.view.MenuItem importacin;
android.widget.Button importacin;
public class InAppBillingActivity extiende Actividad {
clickButton Botn privado;
buyButton Botn privado;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_in_app_billing);
buyButton = (Button) findViewById (R.id.buyButton);
clickButton = (Button) findViewById (R.id.clickButton);
clickButton.setEnabled (false);
}

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.

Google Consola Juega Developer y Cuentas de Google Wallet


Los desarrolladores de aplicaciones que hacen uso de Juego de facturacin Google deben ser identificados
mediante una clave de licencia pblica nica. La nica manera de obtener una clave de licencia pblica es
registrar una solicitud en el Google Play Consola desarrollador. Si an no dispone de una cuenta de Google
Play Consola desarrollador, vaya ahttp://play.google.com/apps/publish y seguir los pasos para registrar como
se indica en el captulo titulado Generacin de un lanzamiento APK archivo Firmado en Android Estudio .
Una vez que est en el sistema, haga clic en la opcin Configuracin (representado por el icono de engranaje
en el borde izquierdo de la pgina web) y, en la pgina Detalles de la cuenta, desplcese hasta la seccin
Cuenta de Comercio. Para utilizar la facturacin en app, su cuenta de Google Play Consola desarrollador

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.

La obtencin de la clave de licencia pblica para la Aplicacin


Desde la pgina principal de la consola de juego Desarrollador Google, haga clic en el botn Aadir nueva
aplicacin, especificando el idioma predeterminado y un ttulo de InAppBilling. Una vez que esta informacin
se ha introducido, haga clic en el botn Subir APK:

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.

Configuracin de Google Play de facturacin en la Solicitud


Con la clave pblica generada, ahora es el momento de utilizar esa clave para inicializar la facturacin dentro
del cdigo de la aplicacin. Para el ejemplo de proyecto InAppBilling esto se llevar a cabo en el mtodo
onCreate del archivo InAppBillingActivity.java y har uso de la clase IabHelper de las utilidades de las clases
previamente aadidos al proyecto de la siguiente manera. Tenga en cuenta que <su clave de licencia aqu>
debe sustituirse por su propia clave de licencia generada en la seccin anterior:
com.ebookfrenzy.inappbilling paquete;
importacin
importacin
importacin
importacin

<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

public class InAppBillingActivity extiende Actividad {


esttica TAG final String privada =
"Com.ebookfrenzy.inappbilling";
IabHelper mHelper;
clickButton Botn privado;
buyButton Botn privado;
@ Override
void protegida onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_in_app_billing);
buyButton = (Button) findViewById (R.id.buyButton);
clickButton = (Button) findViewById (R.id.clickButton);
clickButton.setEnabled (false);
Cadena base64EncodedPublicKey =
"<Su clave de licencia aqu>";
mHelper = new IabHelper (esto, base64EncodedPublicKey);
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");
}
}
});
}
.
.
.
}

Despus de la aplicacin de los cambios mencionados, compilar y ejecutar la aplicacin en un dispositivo


Android fsica (Google Play facturacin no se puede probar dentro de una sesin de emulador) y asegrese
de que el "En aplicacin de facturacin est configurado OK" mensaje aparece en el panel de salida LogCat .

Inicio de una Factura de Compra Google Play In-App


Con el acceso al sistema de facturacin inicializado, ahora podemos dirigir nuestra atencin a iniciar una
compra cuando el usuario toca el botn Haga clic Comprar en el interfaz de usuario. Esto se ha configurado
previamente para activar una llamada a un mtodo llamado buyClick que ahora debe aplicarse en el archivo
InAppBillingActivity.java. Adems de iniciar el proceso de compra en este mtodo, ser necesario
implementar un mtodo onActivityResult y tambin un mtodo oyente a ser llamado cuando la compra se ha
completado.

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.

El mtodo oyente a ser llamado cuando la compra se ha completado.

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".

Implementacin del Mtodo onActivityResult


Cuando los rendimientos del proceso de compra, ser llamar a un mtodo en la actividad llamada llamado
onActivityResult, pasando por como argumentos el cdigo de solicitud pasado por el mtodo
launchPurchaseFlow, un cdigo de resultado y los datos de intencin con la respuesta de la compra.

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.

Implementacin del Oyente Terminado Compra


La "compra terminado" oyente debe realizar una serie de tareas diferentes. En el primer caso, se debe
comprobar para asegurarse de que la compra se ha realizado correctamente. A continuacin, hay que
comprobar el SKU del artculo comprado para asegurarse de que coincide con el especificado en la solicitud
de compra. En el caso de una compra exitosa, el mtodo deber consumir la compra de forma que el usuario
puede comprar de nuevo cuando se necesita otro. Si no se consume la compra, el futuro intenta comprar el
artculo fallar indicando que el objeto ya ha sido comprado. Mientras que esto sera deseable
comportamiento si el usuario slo necesita comprar el artculo una vez, claramente este no es el
comportamiento requerido para la compra de consumibles. Por ltimo, el mtodo necesita para activar el
botn "Click Me!", Por lo que el usuario puede realizar el clic de botn que se compr.
Dentro del archivo InAppBillingActivity.java, implementar este mtodo como sigue:
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
= New IabHelper.OnIabPurchaseFinishedListener () {
public void onIabPurchaseFinished (resultado IabResult,
Compra de compra)
{
si (result.isFailure ()) {
// Error Mango
retorno;
}
else if (purchase.getSku (). equals (ITEM_SKU)) {
consumeItem ();
buyButton.setEnabled (false);

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.

Consumir el artculo comprado


En la documentacin de Google Play En aplicacin de facturacin, Google recomienda que los consumibles
comer antes de proporcionar al usuario acceso al artculo comprado. Hasta ahora, en este tutorial hemos
realizado la compra del artculo, pero an no consumido. En el caso de una compra exitosa, la aplicacin
mPurchaseFinishedListener se ha configurado para llamar a un mtodo llamado consumeItem (). Ser la
responsabilidad de este mtodo para consultar el sistema de facturacin para asegurarse de que la compra
se ha hecho. Esto implica hacer una llamada al mtodo queryInventoryAsync () del objeto mHelper. Esta tarea
se realiza de forma asncrona del hilo principal de la aplicacin y un mtodo oyente llam cuando la tarea se
ha completado. Si el artculo ha sido comprado, el oyente va a consumir el tema a travs de una llamada al
mtodo consumeAsync () del objeto mHelper. Llevar estos requisitos juntos los resultados en las siguientes
adiciones al archivo InAppBillingActivity.java:
pblica consumeItem void () {
mHelper.queryInventoryAsync (mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
= New IabHelper.QueryInventoryFinishedListener () {
public void onQueryInventoryFinished (resultado IabResult,
Inventario Inventario) {
si (result.isFailure ()) {
// Fracaso Mango
} Else {
mHelper.consumeAsync (inventory.getPurchase (ITEM_SKU),
mConsumeFinishedListener);
}
}
};

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
}
}
};

Al soltar el IabHelper Instancia


A lo largo de este tutorial, gran parte del trabajo se ha realizado mediante mtodos de una instancia de la
clase de utilidad IabHelper llamado mHelper llamando. Ahora que el cdigo para manejar su adquisicin y
posterior consumo de un elemento virtual es completo, la ltima tarea es asegurarse de que este objeto se
libera cuando se destruye la actividad. Permanecer en el InAppBillingActivity.java, reemplazar el mtodo del
ciclo de vida la actividad OnDestroy () de la siguiente manera:
@ Override
pblica OnDestroy void () {
super.onDestroy ();
si (mHelper! = null) mHelper.dispose ();
mHelper = null;
}

Modificacin del archivo Security.java


Cuando una aplicacin se compila y se instala en un dispositivo Android desde el interior de estudio, se
construye y se ejecuta en modo de depuracin. Cuando la solicitud est completa, se construy entonces en
modo de lanzamiento y subido a Google Play App Store como se describe en el captulo titulado Generacin
de un lanzamiento APK archivo Firmado en Android Estudio .Como la aplicacin InAppBilling est configurado
actualmente, las compras se realizan utilizando la respuesta esttica cdigo SKU android.test.purchased. Es
importante tener en cuenta que la respuesta esttica SKUs slo se puede utilizar cuando se ejecuta una
aplicacin en modo de depuracin. Como se indica ms adelante, los nuevos productos en la aplicacin
deben crearse dentro del Desarrollador Google Play Consola antes de la prueba completa puede realizarse
en modo de lanzamiento.
La versin actual de las clases de utilidad proporcionados con la aplicacin de ejemplo TrivialDrive incluyen
un nivel adicional de seguridad que impide que las compras que se realicen sin una clave de firma vlida que
se devuelve desde el Google Play servidor de facturacin. Un efecto secundario de este cambio es que evita

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

Prueba de la aplicacin de facturacin en app


Compila y ejecuta la aplicacin en un dispositivo Android fsico con Google Play apoyo y haga clic en el botn
"Comprar un clic". Esto debera hacer que el Google Play de dilogo compra a aparecer la lista el elemento de
prueba tal como se ilustra en la Figura 55-8:

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.

La construccin de una APK lanzamiento


Hasta este punto la aplicacin de ejemplo creada en este captulo se ha utilizado una respuesta esttica
probar SKU proporcionado por Google para las pruebas de las primeras etapas de la facturacin en app. El
siguiente paso es crear un verdadero cdigo SKU producto de facturacin en app para un elemento virtual y
utilizar este al probar la aplicacin. Antes de la creacin de un producto de facturacin in-app, sin embargo, el
cdigo de la aplicacin necesita ser cambiado ligeramente para que utilice un SKU real en lugar de la

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.

Creacin de un nuevo En aplicacin del producto


Una vez que el archivo APK se ha cargado, seleccione la opcin de men dentro de la aplicacin los
productos desde el panel izquierdo de la consola de desarrollador para mostrar la pantalla que se muestra en
la Figura 55-10:

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

La publicacin de la solicitud para el Canal de Distribucin Alfa


El archivo APK aplicacin se almacena actualmente en el Google Play desarrollador consola en modo
borrador. Antes de que se puede utilizar para realizar ms pruebas con productos reales en la aplicacin, la
aplicacin debe ser publicada a cualquiera el Alfa o canales de distribucin de pruebas beta. Estos canales
hacen que la aplicacin est disponible para pruebas por grupos designados de usuarios.
Antes de que un APK solicitud puede presentarse a cualquiera de los canales de prueba, la informacin del
almacn perfil, fijacin de precios y la distribucin de la aplicacin debe ser completada.Para cumplir con este
requisito, seleccione la aplicacin desde Google Play desarrollador Console y haga clic en el enlace Aadir
Conservar en el panel de navegacin de la izquierda. Desde dentro de esta pantalla, llene la informacin
obligatoria (esas reas marcadas con un asterisco) y subir las imgenes necesarias. Una vez que el
formulario est completo, haga clic en el botn Guardar situado en la parte superior de la pgina. Para
configurar la informacin de precios y distribucin, seleccione la opcin de Precios y Distribucin del panel
lateral y complete los campos necesarios.
Cuando se ha proporcionado la informacin requerida, la solicitud es elegible para ser publicado en los
canales de distribucin de pruebas. Una vez que toda la informacin se ha guardado, el botn en la esquina
superior derecha de la pantalla debera haber cambiado de Proyecto a Listo para Publicar. Si el botn todava
lee Proyecto, haga clic en l y seleccione "Por qu no puedo publicar?" En el men. Esta opcin listar ningn
isues que deben resolverse antes de la aplicacin puede ser publicado.
Una vez que todas las cuestiones han sido abordadas, haga clic en el botn Listo para publicar y seleccione
Publicar esta aplicacin desde el men. Tenga en cuenta que puede tardar varias horas antes de que la
solicitud se publica en realidad para el canal y disponible para responder a la solicitud de compra en
aplicacin hecha por los probadores.

Adicin de cuentas de prueba de facturacin en app


Desafortunadamente, Google no permitir que los desarrolladores hacer compras de prueba utilizando el
producto real SKUs de sus propias cuentas de Google. Con el fin de probar la facturacin in-app desde este
punto en adelante, ser necesario configurar otras cuentas de Google como cuentas de prueba. Los usuarios
de estas cuentas deben cargar su aplicacin en sus dispositivos y realizar compras de prueba. Para agregar
cuentas de usuario de prueba individuales, haga clic en el icono Configuracin situado en el lado izquierdo de
la pantalla principal de la consola Google Play para desarrolladores y por cuenta detalles pantalla desplazarse
hasta la seccin Prueba de Licencia. En el cuadro de texto correspondiente, introduzca la cuentas de Gmail
para los usuarios que realizarn las pruebas in-app en su nombre antes de guardar los cambios.
En ausencia de usuarios reales dispuestos a probar la aplicacin, tambin es posible configurar una nueva
cuenta de Google para realizar pruebas. Basta con crear una nueva cuenta de Gmail que no est conectado
de alguna manera con su identidad de cuenta de Google existente. Una vez que la cuenta ha sido creada y
ha aadido como una cuenta de prueba en el Google Play para desarrolladores consola, abra la aplicacin de
ajustes en el dispositivo Android fsico, seleccione Usuarios de la lista de opciones y, en la pantalla del
usuario, haga clic en el botn Aadir al USUARIO la parte superior de la pantalla. Introduzca la nueva cuenta
y contrasea de Gmail para crear el nuevo usuario en el dispositivo. Volver a la pantalla de bloqueo del

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.

Configuracin Testing Group


Las pruebas pueden ampliarse ms all de los lmites de una cuenta de prueba nica, lo que permite a
grupos ms grandes para participar en las pruebas de una nueva aplicacin. La nica restriccin es que los
usuarios pueden designar como probadores sean miembros de un grupo de Google o Google Comunidad
para ser elegibles para su inclusin en el ensayo. Para configurar un grupo, acceder a los parmetros de la
aplicacin dentro de la Google Play Developer Console y seleccione el elemento APK en el panel de
navegacin de la izquierda. Seleccione la pestaa beta o alfa de pruebas (dependiendo del canal de
distribucin de prueba que est utilizando actualmente) y seleccione la lista Administrar de probadores
vincular como se destaca en la figura 55-13:

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

Resolucin de problemas con Compras In-App


Implementacin de Google Play in-app compra es un proceso de mltiples pasos donde incluso el ms simple
de los errores pueden conducir a resultados infructuosos y confusas. Hay, sin embargo, una serie de medidas
que se pueden tomar para identificar y resolver los problemas. Es importante sealar que de vez en cuando
Google cambia el mecanismo de implementacin y prueba de compra in-app. Antes de pasar demasiado
tiempo de depuracin que siempre vale la pena revisar la seccin de Anuncios en el Google Play para
desarrolladores consola para ver si algo ha cambiado desde que se escribi este libro.
Si en la aplicacin de compra no se sigue trabajando, el siguiente paso es asegurarse de que la clave de
licencia en la consola de Google desarrollador Juego coincide con la que figura en el cdigo de aplicacin. Si
la clave no es una coincidencia exacta, los intentos de compra fallarn. Tambin tenga en cuenta que puede
tardar un par de horas despus de la aplicacin se ha publicado en un canal de distribucin de pruebas antes
de que estar disponible para realizar pruebas. Al probar, tambin es importante tener en cuenta que los
cdigos SKU de respuesta esttica slo funcionan cuando la aplicacin se ejecuta en modo de
depuracin. Del mismo modo, los cdigos reales de productos SKU creados en la consola de desarrollador
slo se pueden comprar desde una versin de la aplicacin que se ejecuta bajo una cuenta que ha sido
autorizado desde la consola de desarrollador. Esta cuenta no debe ser el mismo que el del desarrollador de la
aplicacin registrada con la consola de desarrollador Google Play.
Si el problema persiste, compruebe la salida en el panel Android Estudio LogCat mientras que la aplicacin se
ejecuta en modo de depuracin. La in-app clases de utilidad compra proporcionan informacin til en la
mayora de situaciones de fallo. El nivel de detalle de diagnstico se puede aumentar mediante la adicin de
la siguiente lnea de cdigo a la secuencia de inicializacin de facturacin in-app:

563

mHelper.enableDebugLogging (true, TAG);

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

56. Un panorama de Gradle en Android Estudio


Hasta este punto lo ha hecho, en su mayor parte, ha dado por sentado que Android Estudio tomar las
medidas necesarias para compilar y ejecutar los proyectos de aplicaciones que se han creado.Android Studio
ha sido el logro de esto en el fondo mediante un sistema conocido como Gradle.
Ahora es tiempo de ver cmo se utiliza Gradle compilar y empaquetar juntos los diversos elementos de un
proyecto de aplicacin y para comenzar a explorar la forma de configurar este sistema cuando se necesitan
requisitos ms avanzados en trminos de proyectos de construccin en Android Studio.
Contenido
[ ocultar ]

1 Una visin general de Gradle

2 Gradle y Android Estudio


o

2.1 predeterminados Sensible

2.2 Dependencias

2.3 Build Variantes

2.4 entradas Manifest

2.5 APK Firma

2.6 Apoyo ProGuard

3 El Top-nivel Gradle Construir Archivo

4 Nivel Mdulo Gradle Archivos de creacin

5 Configuracin de los ajustes de firma en el fichero de construccin

6 Ejecucin de Tareas Gradle desde la lnea de comandos

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.

Gradle y Android Estudio


Gradle trae una serie de caractersticas de gran alcance para la construccin de proyectos de aplicaciones de
Android. Algunas de las caractersticas principales son las siguientes:

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

Construir Las variantes


Adems de las dependencias, Gradle tambin proporciona apoyo a construir variante para proyectos Android
Studio. Esto permite que mltiples variaciones de una aplicacin que se construyen a partir de un solo
proyecto. Android funciona en muchos dispositivos diferentes que abarcan una amplia gama de tipos de
procesadores y tamaos de pantalla. Con el fin de orientar la mayor variedad de tipos de dispositivos y
tamaos como sea posible a menudo ser necesaria la construccin de un nmero de diferentes variantes de
una aplicacin (por ejemplo, uno con una interfaz de usuario para los telfonos y otro para pantallas de
tamao de la tableta). Mediante el uso de Gradle, esto es ahora posible en Android Studio.

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.

El nivel superior Gradle Construir Archivo


Un proyecto Android Estudio completado contiene todo lo necesario para construir una aplicacin para
Android y se compone de mdulos, bibliotecas, archivos de manifiesto y Gradle construir archivos. Cada
proyecto contiene un alto nivel Gradle construir archivo. Este archivo aparece como build.gradle (Proyecto:
<nombre del proyecto>) y se puede encontrar en la ventana de herramientas del proyecto como se destaca
en la figura 56 1:

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.

Mdulo Nivel Gradle Archivos de creacin


Un proyecto de aplicacin de Android Studio est formado por uno o ms mdulos. Tomemos, por ejemplo,
un proyecto de aplicacin hipottica llamada GradleDemo que contiene dos mdulos llamados Module1 y
Module2 respectivamente. En este escenario, cada uno de los mdulos requerirn su propia Gradle construir
archivo. En trminos de la estructura del proyecto, stos se encuentran los siguientes:

Module1 / build.gradle

Module2 / build.gradle

Por defecto, el archivo build.gradle Module1 se parecera al de la siguiente lista:


aplicar plugin: 'com.android.application'
androide {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.ebookfrenzy.gradledemo.module1"
minSdkVersion 19
targetSdkVersion 21
versionCode 1
VersionName "1.0"
}
buildTypes {
liberacin {
minifyEnabled falsa
proguardFiles
getDefaultProguardFile
('Proguard-android.txt'),
rules.pro'
}
}
}

'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

aplicar plugin: 'com.android.application'

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).

Configuracin de los valores de firma en el fichero de construccin


La firma y preparacin de una aplicacin Android para el captulo de estreno de este libro cubren los pasos
involucrados en la creacin de claves y la generacin de un archivo APK autorizacin firmada del uso de la
interfaz de usuario de Android Studio. Estos valores tambin pueden ser declaradas dentro de una seccin
signingSettings del archivo build.gradle. Por ejemplo:
aplicar plugin: 'android'
androide {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {

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 {
.
.
.
}

El ejemplo anterior incorpora la informacin clave de contrasea directamente en el archivo de


generacin. Las alternativas a este enfoque son para extraer estos valores de las variables de entorno del
sistema:
signingConfigs {
liberacin {
archivo storefile ("keystore.release")
storePassword System.getenv ("KEYSTOREPASSWD")
keyAlias "sus alias clave aqu"
keyPassword System.getenv ("KEYPASSWD")
}
}

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:").
}
}

Ejecucin de tareas Gradle desde la lnea de comandos


Cada proyecto Android Studio contiene una herramienta envoltorio Gradle con el fin de permitir que las tareas
Gradle a ser invocados desde la lnea de comandos. Esta herramienta se encuentra en el directorio raz de

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

Alternativamente, para construir una versin de la aplicacin:


gradlew assembleRelease

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

57. Un Android Estudio Gradle Construir Las variantes


Ejemplo
El objetivo de este captulo es el uso de la funcin de las variantes de construccin de Android Studio para
crear un proyecto que puede ser construido en dos sabores diseados para atacar dispositivos de telfonos y
tabletas respectivamente. El entorno de compilacin ser configurado de tal manera que cada sabor se puede
construir utilizando una liberacin o tipo de depuracin. El resultado final, por lo tanto, ser de cuatro opciones
de variantes de construccin disponibles para la seleccin dentro de Android Productora:

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 ]

1 Creacin de la Variante Ejemplo Proyecto Build

2 Adicin de los Sabores Build a la Build Mdulo Archivo

3 Adicin de los Sabores de la estructura del proyecto

4 Agregacin de archivos de recursos para los Sabores

5 Prueba de los Sabores Complexin

6 Construir variantes y Archivos Clase

7 Adicin de paquetes a los Sabores Complexin

8 Personalizacin de las clases de actividad

9 Resumen

575

Creacin de la Variante Ejemplo Proyecto Build


Crear un nuevo proyecto en Android de estudio, entrar BuildExample en el campo Nombre de la aplicacin y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botn Siguiente.
En la pantalla de factores de forma, active la opcin Telfono y Tablet y activar el ajuste de 19 API SDK
mnimo: Android 4.4 (KitKat). Continuar para proceder a travs de las pantallas, que solicita la creacin de
una actividad en blanco denominada BuildExampleActivity con los campos que quedan establecidos a los
valores predeterminados.

Adicin de los Sabores Build a la Build Mdulo Archivo


Con el proyecto inicial creado, el siguiente paso es configurar el archivo build.gradle nivel de mdulo para
agregar las dos configuraciones de sabor construccin. Dentro de la ventana de la herramienta Android
Proyecto de estudio, vaya al archivo build.gradle aparece como aplicacin -> Scripts Gradle -> build.gradle
(Mdulo: app) (Figura 58-1) y haga doble clic en l para cargarlo en el editor:

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

compilar FileTree (dir: 'libs', incluyen: ['* .jar'])


}

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.

Adicin de los Sabores de la estructura del proyecto


Hasta ahora, en este libro hemos estado utilizando la ventana de herramientas Android Proyecto Estudio en el
modo de Android. Este modo presenta una visin menos desordenada de la estructura de directorios de un
proyecto. Cuando se trabaja con las variantes de construccin, sin embargo, ser necesario cambiar la
ventana en modo de proyecto para que podamos tener acceso a todos los niveles de directorio en el
proyecto. Para cambiar el modo, haga clic en el men de Android en la parte superior de la ventana de
herramientas de proyectos y seleccione Proyecto de la lista de opciones como se indica en la Figura 58-3:

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

Adicin de archivos de recursos de los Sabores


Cada

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>

Cambie la configuracin de variantes Build a tabletDebug y copiar y pegar el activity_build_example.xml


telfono y archivos strings.xml a las ubicaciones correspondientes de la res tablet -> diseo y res -> valores
carpetas respectivamente.
Edite el archivo strings.xml sabor tableta de manera que el recurso de cadena hello_world lee "Este es el
sabor de la tableta" y modificar el diseo en el archivo de diseo activity_build_example.xml para que el
TextView se coloca en el centro de la pantalla.
Con las modificaciones, la seccin sabor de la estructura del proyecto ahora debe coincidir con la de la Figura
57-5:

580

Figura 57-5

Prueba de los Sabores Complexin


En este punto, dos sabores se han configurado, cada uno con diferentes recursos de cadena y de
diseo. Antes de pasar al siguiente paso, es importante comprobar que las dos variantes de la acumulacin
de trabajo como se esperaba.
Dentro de la ventana de herramientas Variantes Generar, cambiar la configuracin de variantes Construir
para el mdulo de aplicacin para phoneDebug antes de ejecutar la aplicacin en un dispositivo o
emulador. Una vez en funcionamiento, el sabor de telfono de la interfaz de usuario se debe mostrar con el
"Este es el sabor de telfono" mensaje que aparece en el objeto TextView.
Cambie la variante de generacin para tabletDebug y volver a ejecutar la aplicacin, una vez ms, y seal
que esta vez el sabor de la tableta se ha construido con el "Esta es la tableta sabor" mensaje colocado en el
centro de la pantalla.

Construir variantes y Archivos Clase


Como el proyecto est actualmente, los dos sabores de la aplicacin comparten la principal clase de actividad
BuildExample y todos los cambios de sabor se han hecho a travs de archivos de recursos. Mientras tanto se
puede lograr a travs de las modificaciones del archivo de recursos, es inevitable que en muchos casos sern
necesarios cambios en el cdigo fuente de un sabor a otro.En el resto de este captulo la clase principal
actividad se traslad a las variantes de sabor por lo que las diferentes bases de cdigo pueden utilizarse para
cada sabor.

Adicin de paquetes a los Sabores Complexin


A partir de este momento, cada uno de los sabores de construccin tendr su propio archivo de clase de
actividad que puede ser personalizado para satisfacer las necesidades de los dos objetivos de compilacin
diferentes.
Dentro de la ventana de herramientas Variantes Generar, empezar por seleccionar la variante
phoneDebug. Mover a la ventana de herramientas de proyectos, haga clic en la entrada del telfono y
seleccione Nuevo -> opcin de men Directorio. Nombre del nuevo directorio de java antes de hacer clic en el
botn Aceptar.

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.

Personalizacin de las clases de actividad


Con phoneDebug seleccionado en la ventana de herramientas Variantes Generar, cargar el telfono -> Java > com.ebookfrenzy.buildexample -> archivo de clase BuildExampleActivity en la ventana de edicin y
modificar el mtodo onCreate para cambiar el color de fondo del RelativeLayout a rojo:
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.RED);
}
.
.
.
}

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.

Anda mungkin juga menyukai