Android Estudio de Desarrollo de Essentials
Android Estudio de Desarrollo de Essentials
Android Estudio de Desarrollo de Essentials
Indice
1_La creación de un equipo con Windows, Linux o Mac OS X Android Ambiente Development
Studio
3
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 Navegación
Cambiar el tema Android Estudio
4
Creación de un dispositivo virtual de Android (AVD) en Android Estudio
Acerca de los dispositivos virtuales de Android
Creación de una nueva AVD
Inicio del emulador
Ejecutar la aplicación en la AVD
Ejecutar / depurar Configuraciones
Detener una aplicación en ejecución
De línea de comandos AVD Creación
Archivos de configuración de dispositivos virtuales de Android
Mover y Cambiar el nombre de un dispositivo virtual de Android
5
Prueba Android Apps Estudio en un dispositivo Android Física
Una visión general del Android depuración Bridge (ADB)
Habilitación de ADB en Android 4.4 dispositivos basados
Mac OS X configuración ADB
Configuración de Windows ADB
Prueba de la conexión adb
6
Los fundamentos de la Android Studio Editor Código
El Android Studio Editor
La división de la ventana del editor
Código de finalización
Finalización de instrucciones
Información de parámetros
Generación de código
Plegable Código
Búsqueda de Documentación Rápida
Código El cambio de formato
7
Una visión general de la arquitectura de Android
El Android Software Stack
El kernel de Linux
Runtime Android - Dalvik Virtual Machine
Runtime Android - Bibliotecas Core
Dalvik VM Bibliotecas específicas
Java interoperabilidad Bibliotecas
Bibliotecas Android
C / C ++ Bibliotecas
Application Framework
Aplicaciones
8
La Anatomía de una aplicación Android Android Estudio
Actividades Android
Intenciones Android
Broadcast Intenciones
Receptores de radiodifusión
Servicios para Android
Proveedores de Contenido
El Manifiesto de la aplicación
De recursos de aplicaciones
Contexto de aplicación
9
Entender Aplicación para Android y Actividad Lifecycles
Aplicaciones para Android y Gestión de Recursos
Estados Proceso Android
Proceso de primer plano
Proceso Visible
Proceso de Servicio
Proceso de fondo
Proceso de vacío
Dependencias entre procesos
El Ciclo de Vida de Actividad
La Actividad Pila
Actividad Unidos
Los cambios de configuración
Manipulación de cambio de estado
10
Manipulación Android Actividad Cambios de estado en Android Estudio
La actividad de la clase
Estado Dinamizador vs. Estado Persistente
Los métodos de ciclo de vida para Android Actividad
Vidas Actividad
11
Android Actividad Estado Cambios - Un Estudio Android Ejemplo
Crear el Ejemplo de proyecto de cambio de estado
El diseño de la interfaz de usuario
Anulación de los métodos de ciclo de vida de actividad
Filtrar el Panel LogCat
Ejecutar la aplicación
Experimentar con la Actividad
12
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
Restauración del Estado
Prueba de la aplicación
13
Entendiendo Vistas Android, Ver grupos y diseños en Android Estudio
Diseñar para diferentes dispositivos Android
Vistas y Ver grupos
Android Controladores de Distribución
La vista Jerarquía
La creación de interfaces de usuario
14
Una guía para la herramienta Diseñador Android Estudio
El Diseñador Android Estudio
Modo de diseño
Modo de texto
Configuración de las propiedades
Tipo Morphing
Creación de una definición de dispositivo personalizado
15
El diseño de una interfaz de usuario utilizando la herramienta Diseñador Android Estudio
Un Diseñador Android Estudio Herramienta Ejemplo
Creación de una nueva actividad
El diseño de la interfaz de usuario
Edición de propiedades de la vista
Ejecutar la aplicación
Creación manual de un diseño XML
Uso del Visor Jerarquía
16
Creación de una interfaz de usuario de Android en el Código Java utilizando Android Estudio
Código Java vs. XML archivos de diseño
Creación de vistas
Propiedades y parámetros de diseño
Crear el proyecto de ejemplo en Android Estudio
Adición Vistas a una actividad
Configuración de propiedades de la vista
Agregar parámetros y reglas de diseño
Usando Ver IDs
Píxeles Independientes Densidad Conversión (dp) a píxeles (px)
17
Uso del Administrador de Android GridLayout en Android Studio Designer
La introducción de las Clases Android GridLayout y el Espacio
El GridLayout Ejemplo
Crear el proyecto GridLayout
Crear el GridLayout Instancia
Adición Vistas a células GridLayout
Mover y eliminar filas y columnas
La implementación de la fila de la célula y Spanning Columna
Cambio de la gravedad de un GridLayout Niño
18
Trabajar con el GridLayout Android usando Recursos Disposición XML
GridLayouts en archivos de recursos XML
Adición de Niños Vistas a la GridLayout
Declarando Spanning Cell, Gravedad y Márgenes
19
Una visión general y Android Estudio Ejemplo de Manejo Android Evento
Entender Eventos Android
Uso de Android: Recursos onClick
Detectores de eventos y métodos de devolución de llamada
Un ejemplo Manejo de Eventos
El diseño de la interfaz de usuario
El detector de eventos y método de devolución de llamada
Utilizar eventos
20
Touch Android y multi-touch control de eventos en Android Estudio
Interceptar Eventos Touch
El Objeto MotionEvent
A.Táctiles Comprensión
Manejo de múltiples toques
Un Multi-Touch Ejemplo de Aplicación
El diseño de la interfaz de la actividad del usuario
Implementación del Evento Listener Touch
Ejecutar la aplicación Ejemplo
21
La detección de gestos comunes que utilizan Android Studio y el Gesto Detector Clase
La implementación de Detección Gesto Común
Creación de un proyecto de detección de gestos Ejemplo
La implementación de la clase Listener
Creación de la GestureDetectorCompat Instancia
La implementación de la onTouchEvent Método ()
Prueba de la aplicación
22
La implementación de reconocimiento de gestos Android personalizada con Android Estudio
El embrujo de Android Application Builder
La Clase GestureOverlayView
La detección de gestos
La identificación de los gestos específicos
Añadir Soporte de tarjetas SD a un AVD
Creación y ejecución de la Application Builder Gesto
Creación de un archivo Gestos
Extraer el archivo Gestos de la tarjeta SD
Crear el proyecto de ejemplo
Adición de los Gestos archivo al proyecto
El diseño de la interfaz de usuario
Carga del archivo Gestos
Registrando el detector de eventos
Implementación del Método onGesturePerformed
Prueba de la aplicación
Configuración del GestureOverlayView
Interceptar Gestos
La detección de gestos de pellizco en Android
Un gesto de pellizcar Ejemplo de proyecto
23
Introducción al uso de fragmentos en Android Estudio
¿Qué es un fragmento?
Creación de un fragmento
Adición de un fragmento de una actividad utilizando el archivo XML Layout
Adición y Gestión de Fragmentos de Código
Gestión de eventos Fragmento
Ejecución Fragmento Comunicación
24
Usando fragmentos en Android Studio - Un Ejemplo
Sobre el Fragmento Ejemplo de Aplicación
Crear el proyecto de ejemplo
Crear el primer fragmento Layout
Crear el primer fragmento Clase
La creación de la Segunda Fragmento Layout
Adición de los fragmentos de la Actividad
Hacer la barra de herramientas Fragmento Hable con la Actividad
Hacer la Actividad Hable con el fragmento de texto ]
Prueba de la aplicación
25
Un Maestro Android estudio / Detalle Flujo Tutorial
El Android Maestro / Detalle de Flujo
Creación de un maestro / detalle de Flujo de Actividad
La anatomía del Maestro / Detalle Plantilla de Flujo
Modificación del Maestro / Detalle Plantilla de Flujo
Cambiar el modelo de contenido
Cambiar el panel de detalles
Modificación de la Clase WebsiteDetailFragment
Adición de permisos Manifest
Ejecutar la aplicación
26
Creación y administración de desbordamiento de los menús en Android Estudio
El menú de desbordamiento
Creación de un menú de desbordamiento
Viendo un menú de desbordamiento
Respondiendo a Menú Elemento Selecciones
Creación de grupos de artículos checkable
Crear el proyecto de ejemplo
Modificación del menú Descripción
Modificación de la (Método onOptionsItemSelected)
Prueba de la aplicación
27
Animación de interfaces de usuario en Android Studio usando el Marco Transiciones
La introducción de las transiciones y escenas Android
Usando Interpoladores con transiciones
Trabajo con transiciones de escena
Transiciones y TransitionSets en código personalizado
Transiciones y TransitionSets en XML personalizados
Trabajar con Interpoladores
Creación de un interpolador personalizada
Utilizar el método beginDelayedTransition
28
Un Android Estudio Transición Tutorial usando beginDelayedTransition
Crear el proyecto Android Estudio TransitionDemo
Preparación de los archivos de proyecto
Ejecución beginDelayedTransition Animación
Personalización de la Transición
29
Ejecución Escena Android Transiciones - Un Estudio Android Tutorial
Una visión general del Proyecto de Transición de Escena
Crear el proyecto SceneTransitions Android Estudio
La identificación y preparación del contenedor raíz
El diseño de la primera escena
El diseño de la segunda escena
Entrando en la primera escena
Cargando Escena 2
La aplicación de las transiciones
Agregar el archivo de Transición
Cargando y Manejo del Set Transición
Configuración de transiciones adicionales
30
Una visión general de Intenciones en Android Estudio
Una visión general de Intenciones
Intenciones explícitos
Devolver datos de una Actividad
Intenciones implícitos
El uso de Intención Filtros
Comprobación de Intención disponibilidad
31
Intenciones explícitos Android - Un Estudio Android Ejemplo
Creación de la explícita intención Ejemplo de Aplicación
Diseño de la disposición de la interfaz de usuario para ActivityA
Creación de la segunda clase de actividad
Diseño de la disposición de la interfaz de usuario para ActivityB
Revisando el archivo de manifiesto de aplicación
Creación de la Intención
La extracción de los datos de intención
Lanzamiento ActivityB como Sub-Actividad
Devolver datos de un Sub-Actividad
Prueba de la aplicación
32
Intenciones implícitos Android - Un Estudio Android Ejemplo
Crear el Android Estudio implícito Intención Proyecto Ejemplo
El diseño de la interfaz de usuario
Creación de la Intención Implícita
Adición de una segunda actividad Matching
Adición de la web Ver en la interfaz de usuario
La obtención de la URL Intención
Modificación del archivo MyWebView Proyecto Manifiesto
Prueba de la aplicación
33
Broadcast Intenciones y receptores de radiodifusión en Android Estudio
Una visión general de Difusión Intenciones
Una visión general de los receptores de radiodifusión
La obtención de resultados a partir de un Broadcast
Sticky Broadcast Intenciones
El Ejemplo Broadcast Intención
Crear el ejemplo de aplicación
Creación y envío de la Intención Broadcast
Crear el Receptor Broadcast
Configuración de un receptor de radiodifusión en el archivo de manifiesto
Probando el Ejemplo Broadcast
Escuchando transmisiones del sistema
34
Hilos e hilo Android Manipuladores - Un Estudio Android Tutorial
Una visión general de los Hilos
El hilo principal de la aplicación
Los manejadores de hilos
Una rosca Ejemplo básico
Crear un nuevo hilo
La implementación de un manejador de Tema
Al pasar un mensaje a los Handler
35
Descripción de los servicios Android comenzado y Bound
Servicios empezados
Servicio de Intención
Servicio Bound
La Anatomía de un servicio
Controlar Opciones Reiniciar servicio Destroyed
Declarar un servicio en el archivo de manifiesto
Inicio de un servicio que se ejecuta en el inicio del sistema
36
La implementación de un servicio de Android Iniciado en Android Estudio
Crear el proyecto de ejemplo
Creación de la clase de servicio
Añadiendo el Servicio para el archivo de manifiesto
Inicio del servicio
Probando el Ejemplo IntentService
Utilizando la clase de servicio
Cómo crear un nuevo servicio
La modificación de la interfaz de usuario
Ejecutar la aplicación
Crear un nuevo hilo para tareas de servicio
37
Implementar Servicios Bound locales en Android Estudio
Comprensión Bound Servicios
Bound Servicio Opciones de interacción
Un servicio Ejemplo Bound Android Estudio Local
Adición de un servicio Bound con el Proyecto
La implementación de la Carpeta
La unión del Cliente para el Servicio
Completando el Ejemplo
Prueba de la aplicación
38
Android Servicios Bound remoto - Un Estudio Android Tutorial
Cliente Comunicación del servicio remoto
Crear el ejemplo de aplicación
El diseño de la interfaz de usuario
Implementación del Servicio Bound remoto
Configuración de un servicio remoto en el archivo de manifiesto
Lanzamiento y unión al servicio remoto
El envío de un mensaje al servicio remoto
39
Una visión general de las bases de datos SQLite Android en Android Estudio
La comprensión de las Tablas de base de datos
La introducción de esquemas de bases de datos
Las columnas y tipos de datos
Filas de bases de datos
La introducción 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
40
Un Android Estudio TableLayout y TableRow Tutorial
Los TableLayout y TableRow Disposición Vistas
Crear el proyecto de base de datos
Agregar el TableLayout a la interfaz de usuario
Agregar y configurar los filastabla
Adición de la barra de botones para el diseño
Ajuste de los márgenes de disposición
41
Un Tutorial de base de datos SQLite Android Estudio
Sobre la base de datos Ejemplo Android Estudio
Creación del modelo de datos
Implementar el manejador de datos
El método Add Handler
El método de control de la consulta
El método Delete Handler
La implementación de los métodos activos de eventos
Prueba de la aplicación
42
La comprensión de Proveedores de Contenido Android en Android Estudio
¿Qué es un Proveedor de Contenido?
El proveedor de contenidos
onCreate ()
query ()
insert ()
update ()
delete ()
getType ()
El URI contenido
El contenido del resolver
El <proveedor> Element Manifiesto
43
Un proveedor de contenidos Android Estudio Ejemplo
Copia de la base de datos del proyecto
Agregar el Proveedor Contenido del paquete
Creación de la Clase Proveedor de Contenido
La construcción de la Autoridad y contenido URI
Implementar Matching URI en el Proveedor de Contenido
Implementación del Proveedor de Contenido onCreate () Método
La implementación de la inserción Proveedor de Contenido Método ()
La implementación de la consulta Proveedor de Contenido Método ()
La implementación de la actualización Proveedor de Contenido Método ()
Implementación del Proveedor de Contenido eliminar Método ()
Declarando el proveedor de contenidos en el archivo de manifiesto
Modificación de la base de datos Handler
44
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 selector de archivos de filtrado
Manejo de Resultados Intención
Leyendo el contenido de un archivo
Escritura de contenido a un archivo
Eliminación de un archivo
Obtener acceso permanente a un archivo
45
Un Android Estudio Acceso de almacenamiento Marco Ejemplo
Sobre el Ejemplo Acceso de almacenamiento Marco
Crear el Acceso de almacenamiento Marco Ejemplo
El diseño de la interfaz de usuario
Declarando Solicitar Códigos
Crear un nuevo archivo de almacenamiento
El onActivityResult (Método)
Guardar en un archivo de almacenamiento
Abrir y leer un archivo de almacenamiento
Prueba de la aplicación de almacenamiento de acceso
46
Un Android Estudio VideoView y MediaController Tutorial
Al presentar el Android VideoView Clase
Al presentar el Android MediaController Clase
Prueba de reproducción de vídeo
Creación de la reproducción de vídeo Ejemplo
Diseñar el VideoPlayer Layout
Configuración del VideoView
Adición de permisos de Internet
Agregar el MediaController al vídeo Ver
Configuración de la onPreparedListener
47
Grabación de vídeo y captura de imagen usando Intenciones cámara - Un Estudio Android Ejemplo
Comprobación de la ayuda de la cámara
Llamar a la Intención de captura de vídeo
Llamar a la Intención de captura de imagen
Crear un proyecto Android Estudio de grabación de vídeo
El diseño de la interfaz de usuario de diseño
Comprobación de la Cámara
Lanzamiento de la Intención de captura de vídeo
Manejo del Retorno Intención
Prueba de la aplicación
48
Una grabación y reproducción Ejemplo Android Studio usando MediaPlayer y MediaRecorder
Reproducción de audio
Grabación de audio y vídeo utilizando la clase MediaRecorder
Sobre el Proyecto Ejemplo
Crear el proyecto AudioApp
El diseño de la interfaz de usuario
Comprobación de disponibilidad Micrófono
Realización de la Actividad de inicialización
La implementación de la (Método recordAudio)
La implementación de la stopAudio Método ()
Implementación del método playaudio ()
Configuración de permisos en el archivo de manifiesto
Prueba de la aplicación
49
Trabajar con el API de Google Maps para Android en Android Estudio
Los Elementos de la API de Google Maps para Android
Prepárese para utilizar la API de Google Maps para Android
Instalación de las API de Google
Descarga de la Google Play Servicios SDK
Agregar el Google Play Servicios Biblioteca al Gradle Construir configuración
Para obtener su firma desarrollador
Registro del Proyecto en la consola de las API Google
Adición Mapa Apoyo al archivo AndroidManifest.xml
Comprobación de los servicios de Google Play Soporte
La comprensión de geocodificación y geocodificación inversa
Agregar un mapa a una aplicación
Viendo del usuario Ubicación actual
Cambiar el tipo de mapa
Viendo Mapa Controles al Usuario
Manipulación Mapa Gesto Interacción
Mapa Zooming Gestos
Mapa Desplazamiento / Desplazamiento Gestos
Mapa inclinación Gestos
Rotación del mapa Gestos
Creación de marcadores de mapa
Controlar el Mapa de la cámara
50
Impresión con el Marco Impresión Android en Android Estudio
La impresión Arquitectura Android
El Servicios de impresión HP Plugin
Google Cloud Print
Impresión a Google Drive
Guardar como PDF
Impresión desde dispositivos Android
Opciones para Construir Imprimir Apoyo en Aplicaciones Android
Impresión de imágenes
Creación y contenido impresión HTML
Impresión de una página Web
Impresión de un documento personalizado
51
Un HTML Android Studio y contenido Web Printing Ejemplo
Creación del HTML Impresión Ejemplo de Aplicación
Contenido impresión HTML dinámico
Creación de la página Web Impresión Ejemplo
El diseño de la interfaz de usuario de diseño
Adición de la opción de impresión del menú
52
Un documento Impresión Ejemplo Android Estudio personalizado
Una visión general de la Imprenta Android documento personalizado
Adaptadores encargo de impresión
Preparación del Proyecto Custom documento Impresión
Crear el adaptador de impresión personalizada
La implementación de la OnLayout () Método de devolución de llamada
La implementación de la OnWrite () Método de devolución de llamada
Comprobación de una página está en Gama
Dibujando el contenido de la página Lienzo
A partir del trabajo de impresión
Prueba de la aplicación
53
Generación de un archivo de lanzamiento APK Firmado en Android Estudio
El proceso de preparación de estreno
Cambio de la Variante Build
Creación de un archivo de almacén de claves
Generación de una clave privada
Crear la aplicación APK Archivo
Regístrese para obtener una cuenta de Google Play Consola desarrollador
Cargar Versiones Nueva APK a la Consola de Google Play desarrollador
54
Un estudio Android Google Play In-App Tutorial facturación
Instalación de la biblioteca Google Play facturación
Crear el proyecto de facturación Ejemplo In-App
Adición de Permiso de facturación para el archivo de manifiesto
Agregar el archivo IInAppBillingService.aidl al Proyecto
Añadiendo las clases de utilidad para el Proyecto
El diseño de la interfaz de usuario
La aplicación de la "Click Me" Botón
Google Consola Juega desarrollador y Cuentas de Google Wallet
La obtención de la clave de licencia pública para la Aplicación
Configuración de Google Play de facturación en la Solicitud
Inicio de una Factura de Compra Google Play In-App
Implementación del Método onActivityResult
La implementación del proceso de escucha Terminado Compra
Consumir el artículo comprado
Al soltar el IabHelper Instancia
Modificación del archivo Security.java
Prueba de la aplicación de facturación en app
La construcción de una APK lanzamiento
Creación de un nuevo In-App Producto
La publicación de la solicitud para el Canal de Distribución Alfa
Adición de cuentas de prueba de facturación en app
Configuración Testing Group
Resolución de problemas con In-App de Compras [
55
Una visión general de Gradle en Android Estudio
Una visión general de Gradle
Gradle y Android Estudio
Parámetros por defecto
Dependencias
Construir Las variantes
Entradas Manifest
APK Firma
Soporte ProGuard
El nivel superior Gradle Construir Archivo
Módulo Nivel Gradle Archivos de creación
Configuración de los valores de firma en el archivo de creación
Ejecución de tareas Gradle desde la línea de comandos
56
Un Android Estudio Gradle Construir Las variantes Ejemplo
Creación de la Variante Ejemplo Generar proyecto
Adición de los Sabores Construir al Build Module Archivo
Adición de los Sabores de la estructura del proyecto
Adición de archivos de recursos de los Sabores
Prueba de los Sabores Complexión
Construir variantes y Clases Archivos
Adición de paquetes a los Sabores Complexión
Personalización de las clases de actividad
1 La creación 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 aplicación para Android, el primer paso es
configurar un sistema informático para actuar como plataforma de desarrollo. Esto implica una serie de etapas
que consisten en la instalación del Java Development Kit (JDK) y el Android Estudio Entorno Integrado de
Desarrollo (IDE), que también incluye el Kit de desarrollo de software de Android (SDK).
Este capítulo cubre 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.
Windows XP (32-bit)
Windows Vista (32-bit o 64-bit)
Windows 7 (32 bits o 64 bits)
Windows 8 / Windows 8.1
(Sólo sistemas basados en Intel) Mac OS X 10.5.8 o posterior
Sistemas Linux con la versión 2.7 o posterior de GNU C Library (glibc)
java -version
Suponiendo que Java está instalado actualmente, una salida similar a la siguiente aparecerá en la ventana de
terminal:
En el caso de que Java no está instalado, el comando "java" en la ventana de terminal dará lugar a la aparición
de un mensaje que dice lo siguiente junto con un cuadro de diálogo en el escritorio que proporciona la opción
para mostrar la página web de Oracle Java:
Los pasos exactos que deben tomarse para instalar Java varían de una versión de Mac OS X para el próximo fin
de comprobar la documentación de Apple para su particular versión de Mac OS X. En el momento de escribir la
última versión de Mac OS X es 10.9 (Mavericks). Para instalar Java en esta versión de Mac OS X, abra una
ventana del navegador Safari y vaya a la siguiente URL:
http://support.apple.com/kb/DL1572
Esto debería mostrar el Java para OS X 2013-005 página web. Haga clic en el botón Descargar para descargar
el paquete de Java en su sistema. Abre la imagen descargada de disco (archivo .dmg) y haga doble clic en el
archivo del paquete JavaForOSX.pkg (Figura 1-1) contenida dentro:
Java para OS X instalador ventana aparecerá y te llevará a través de los pasos necesarios para la instalación
del JDK. Una vez finalizada la instalación, vuelva a la ventana de terminal y ejecute el mandato siguiente,
momento en el que debe aparecer la información de la versión Java anteriormente descrito:
java -version
Al igual que con la instalación 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
siguiente: http://www.oracle.com/technetwork/java/javase /downloads/index.html paquetes son proporcionados
por Oracle en formato RPM (para la instalación 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 instalación 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 realizar la instalación con el
siguiente texto:
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 reemplaza por el nombre del archivo descargado JDK):
4. Retire el archivo tar.gz descargado. 5. Añada la ruta al directorio bin de la instalación JDK a la variable $
PATH. Por ejemplo, suponiendo que el JDK instalado finalmente en /home/demo/java/jdk1.7.0_45 necesitaría lo
siguiente para ser añadido a la variable de entorno $ RUTA:
/home/demo/java/jdk1.7.0_45/bin
Normalmente, esto se puede lograr mediante la adición de un comando al archivo .bashrc en su directorio
principal (detalles pueden variar en función de la distribución de Linux en particular en uso). Por ejemplo, cambie
el directorio a su directorio, edite el archivo .bashrc contenida en el mismo y añadir la siguiente línea al final del
archivo (modificando el camino para que coincida con la ubicación del JDK en su sistema):
Después de haber guardado el cambio, las futuras sesiones de terminal incluirán el JDK en la variable de
entorno $ PATH.
La instalación en Windows
Busque el archivo descargado Android Estudio ejecutable de instalación (llamado androide-studio-Bundle-
<versión> .exe) en una ventana del Explorador de Windows y haga doble clic sobre él para iniciar el proceso de
instalación, haga clic en el botón Sí en el cuadro de diálogo Control de cuentas de usuario si aparece.
Una vez que aparezca el asistente de configuración de Android de estudio, trabajo a través de las diferentes
pantallas para configurar la instalación para satisfacer sus necesidades en cuanto a la ubicación del sistema de
archivos en el que Android estudio debe ser instalado y si es o no debería ponerse a disposición de otros
usuarios del sistema . Aunque no hay reglas estrictas sobre dónde se debe instalar Android Studio en el
sistema, el resto de este libro se asume que la instalación 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 botón Instalar
para comenzar el proceso de instalación.
En las versiones de Windows con un menú de inicio, el recién instalado Android Studio puede ser lanzado desde
la entrada secundaria a ese menú durante la instalación.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 opción de menú Pin a la barra de tareas. Tenga en cuenta que el ejecutable se
proporciona en 32-bit (estudio) y 64 bits (studio64) versiones ejecutables. Si está ejecutando un sistema de 32
bits, asegúrese de usar el ejecutable estudio.
Instalación en Mac OS X
Android Studio for Mac OS X se descarga en forma de un archivo de imagen de disco (.dmg). Una vez que el-
studio-Bundle- androide <version> -mac.dmg se ha descargado, ubicarlo en una ventana del Finder y haga
doble clic en él para abrirlo como se muestra en la Figura 2-2:
Figura 2-2
Para instalar el paquete, basta con arrastrar el icono de Android Studio y suéltala en el ícono 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 de estudio, localizar el ejecutable en la carpeta Aplicaciones utilizando una ventana del
Finder y haga doble clic en él.
Para el futuro más fácil acceso a la herramienta, arrastre el icono de Android Estudio de la ventana del Finder y
suéltala en el muelle.
Instalación en Linux
Después de haber descargado el paquete de Linux Android Studio, abra una ventana de terminal, cambie el
directorio a la ubicación en Android estudio se va a instalar y ejecutar el siguiente comando:
./studio.sh
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 Configuración avanzada del sistema y, en el
cuadro de diálogo resultante, haga clic en las variables de entorno ... botón. 3. En el cuadro de diálogo Variables
de entorno, localice la variable Path en la lista de variables del sistema, selecciónela y haga clic en
Editar .... Busque el final de la cadena de valor variable actual y añadir la ruta de acceso a las herramientas de
la plataforma Android para el final, con un punto y coma para separar el camino de los valores anteriores. Por
ejemplo, suponiendo Android Estudio se instala en / Users / demo / android-estudio, se añade al final del valor
actual Sendero lo siguiente:
4. Haga clic en Aceptar en cada cuadro de diálogo y cierre el panel de propiedades del sistema de control. Una
vez que los pasos anteriores se han completado, verifique que la ruta esté ajustada correctamente abriendo una
ventana de símbolo del sistema (Inicio -> Todos los programas -> Accesorios -> Símbolo 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 ser la salida una lista de opciones de la línea de comandos cuando se ejecuta.
Del mismo modo, comprobar que la ruta herramientas ajuste al intentar iniciar el Administrador de Android SDK:
androide
En el caso de que aparezca un mensaje similar al siguiente mensaje para uno o ambos de los comandos, lo
más probable es que una ruta incorrecta se adjuntó a la variable de entorno Path:
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 ser la salida una lista de opciones de la línea 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, lo
más probable es que una ruta incorrecta se adjuntó a la variable de entorno Path:
Linux
En Linux esto implicará una vez más la edición del archivo .bashrc. Suponiendo que el paquete de paquete
Android Studio fue instalado en / home / demo / android-estudio, la línea de exportación en el archivo .bashrc
ahora diría lo siguiente:
exportación PATH=/home/demo/java/jdk1.7.0_10/bin:/home/demo/android-
studio/sdk/platform-tools:/home/demo/android-studio/sdk/tools:/home/demo/android-
studio/bin:$PATH
Tenga en cuenta también 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 número de técnicas se puede emplear para modificar la variable de entorno $ PATH en Mac OS X. Podría
decirse que el método más limpio es agregar un nuevo archivo en el directorio /etc/paths.d que contiene las
rutas que se añade a $ PATH. Suponiendo una ubicación de instalación de / Aplicaciones / Android Studio.app,
la ruta puede ser configurado mediante la creación de un android-sdk nuevo archivo con el nombre en el
directorio /etc/paths.d contenga las siguientes líneas:
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
Actualización 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 Estudio normalmente le avise cuando
una actualización está listo para ser instalado.
Para comprobar manualmente si hay actualizaciones de Android Studio, haga clic en la opción Buscar
actualizaciones ahora conexión situado en la parte inferior de la pantalla de bienvenida Android de estudio, o
utilizar la Ayuda -> Buscar actualizaciones ... opción 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 creación de un
entorno de desarrollo adecuado. Esta consiste en el Java Development Kit (JDK), SDK de Android y Android
Studio IDE. En este capítulo, hemos cubierto los pasos necesarios para instalar estos paquetes en Windows,
Mac OS X y Linux.
En los capítulos 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 más avanzados, ahora es un buen momento para validar que todos los paquetes de desarrollo necesarios
estén instalados y funcionando correctamente. La mejor manera de lograr este objetivo es la creación de una
aplicación para Android y compilarlo y ejecutarlo. Este capítulo tratará la creación de un proyecto de aplicación
Android sencilla utilizando Android Studio. Una vez que el proyecto ha sido creado, un capítulo posterior
explorará el uso del medio ambiente emulador de Android para realizar una prueba de funcionamiento de la
aplicación.
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 nuevo proyecto ... opción para mostrar la
primera pantalla del asistente Nuevo proyecto tal como se muestra en la Figura 3-2:
Figura 3-2
com.mycompany.androidsample
Si usted no tiene un nombre de dominio, también puede utilizar ebookfrenzy.com a los efectos de la prueba,
aunque esto tendrá que ser cambiado para que una aplicación pueda ser publicado:
com.ebookfrenzy.androidsample
El ajuste de la ubicación del proyecto será por defecto una ubicación en la carpeta denominada
AndroidStudioProjects situados en su directorio personal y puede ser cambiado haciendo clic en el botón situado
a la derecha del campo de texto que contiene la configuración de la ruta actual.
Haga clic en Siguiente para continuar. En la pantalla de factores de forma, activar la opción de teléfono y la
tableta y activar el ajuste de API 8 SDK mínimo: Android 2.2 (Froyo). Dado que el proyecto no está diseñado
para Google TV, Google Glass o dispositivos portátiles, dejar el resto de opciones desactivadas antes de hacer
clic en Siguiente.
En la última pantalla, introduzca AndroidSampleActivity para los campos, tanto el nombre de la actividad y título
y el nombre del activity_android_sample diseño.
Creación de una actividad
El siguiente paso es definir el tipo de actividad inicial que se va a crear para la aplicación. Una gama de
diferentes tipos de actividades está disponible en el desarrollo de aplicaciones de Android. La opción Master
Flow / detalle será cubierto en un capítulo posterior. A los efectos de este ejemplo, sin embargo, sólo tiene que
seleccionar la opción de crear una actividad en blanco antes de hacer clic en Siguiente.
Figura 3-3
Con la opción de Actividad en blanco seleccionado, haga clic en Siguiente. En la última pantalla
(Figura 3-4) nombrar la actividad y el título AndroidSampleActivity. La actividad consistirá en una presentación
de pantalla de interfaz de usuario única, que, a los efectos de este ejemplo, debería ser nombrado
activity_android_sample como se muestra en la Figura 3-4:
Figura 3-4
Por último, haga clic en Finalizar para iniciar el proceso de creación del proyecto.
El proyecto de ejemplo creado para nosotros cuando seleccionamos la opción de crear una actividad consiste
en una interfaz de usuario que contiene un letrero que dijera: "Hola a todos" cuando se ejecuta la aplicación.
El siguiente paso en este tutorial es para modificar la interfaz de usuario de nuestra aplicación para que muestre
una vista de texto objeto más grande con un mensaje diferente al previsto para nosotros por Android Studio. El
diseño de la interfaz de usuario para nuestra actividad se almacena en un archivo llamado
activity_android_sample.xml que, a su vez, se encuentra bajo AndroidSample -> aplicación -> src -> res ->
diseño de la jerarquía de archivo del proyecto. Uso del panel Proyecto, localizar este archivo como se ilustra en
la Figura 3-6:
Figura 3-6
Una vez localizado, haga doble clic en el archivo para cargarlo en la herramienta Diseñador de interfaz de
usuario que aparecerá en el panel central de la ventana principal de Android Productora:
Figura 3-7
En la barra de herramientas en la parte superior del panel de editor de diseño es un menú que está configurada
actualmente para Nexus 4 que se refleja en la representación visual del dispositivo en el panel de Designer. Una
amplia gama de otras opciones del dispositivo están disponibles para su selección haciendo clic en este menú.
Para cambiar la orientación de la representación dispositivo entre el paisaje y retrato con sólo usar el menú
desplegable situado a la derecha del menú de selección de dispositivo muestra el icono.
Como puede verse en la pantalla del dispositivo, el diseño ya incluye una etiqueta que muestra un Hello
World! mensaje. Corriendo por el lado izquierdo del panel es una paleta que contiene diferentes categorías de
componentes de interfaz de usuario que pueden utilizarse para construir una interfaz de usuario, tales como
botones, etiquetas y campos de texto. Cabe señalar, sin embargo, que no todos los componentes de interfaz de
usuario son obviamente visibles para el usuario. Una de estas categorías se compone de diseños. Android es
compatible con una variedad de diseños diferentes que proporcionan diferentes niveles de control sobre la forma
visual de usuario componentes de interfaz están posicionados y gestionado en la pantalla. Aunque es difícil
decir de mirar a la representación visual de la interfaz de usuario, el diseño actual se ha creado utilizando un
RelativeLayout. Esto se puede confirmar mediante la revisión de la información en el panel Árbol de
componentes que, por defecto, se encuentra en la esquina superior derecha del panel Diseñador y se muestra
en la Figura 3-8:
Figura 3-8
Como podemos ver en la jerarquía de árbol de componentes, la interfaz de usuario se compone de un padre
RelativeLayout con un solo niño en la forma de un objeto TextView.
El primer paso en la modificación de la aplicación es para eliminar el componente TextView desde el
diseño. 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 disposición.
En el panel Paleta, localizar la categoría Widgets. Haga clic y arrastre el objeto de texto grande y colóquelo en el
centro del diseño de la interfaz de usuario cuando las líneas de marcador verde parecen indicar el centro de la
pantalla:
Figura 3-9
La herramienta Android Designer Studio también proporciona una alternativa a arrastrar y soltar los
componentes de la paleta a la disposición de diseño. Los componentes también pueden añadirse al seleccionar
el objeto deseado de la paleta y luego simplemente hacer clic en el diseño 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 disposición de diseño para mostrar el panel de edición de texto y la identificación
como se ilustra en la Figura 3-10. Dentro del panel, cambie la propiedad de texto "Texto grande" a "Bienvenido a
Android Studio".
Figura 3-10
En este punto es importante para explicar la bombilla al lado del objeto TextView en el diseño. 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:
Este mensaje I18N nos está informando que existe un problema potencial con respecto a la futura
internacionalización del proyecto ("I18N" viene del hecho de que la palabra "internacionalización" comienza con
un "yo", termina con una "N" y tiene 18 letras entre ellas). La advertencia nos recuerda que en el desarrollo de
aplicaciones para Android, los 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 aplicación que se harán
mediante la modificación de los archivos de recursos en lugar de cambiar el código fuente de la aplicación. Esto
puede ser especialmente valioso cuando la traducción 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 único, por
ejemplo, ese archivo se puede dar a un traductor que a continuación, realizar el trabajo de traducción y devolver
el archivo traducido para su inclusión en la aplicación. Esto permite a varios idiomas para ser dirigidos sin la
necesidad de ningún cambio de código fuente a realizar. En este ejemplo, vamos a crear un nuevo recurso
denominado 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-11).
Figura 3-11
En el menú, seleccione la opción de recurso de cadena Extraer para mostrar el diálogo Extract Resource. En
este cuadro de diálogo, introduzca welcomestring en el nombre del recurso: campo antes de hacer clic en
Aceptar. La cadena se almacena ahora como un recurso en el src -> res -> Valores -> archivo strings.xml.
La revisión de los archivos de diseño y Recursos
Antes de pasar al siguiente capítulo, vamos a mirar algunos de los aspectos internos de diseño de la interfaz de
usuario y el manejo de recursos. En la sección anterior, hemos hecho algunos cambios en la interfaz de usuario
mediante la modificación del archivo activity_android_sample.xml utilizando la herramienta Diseñador de interfaz
de usuario. De hecho, todo lo que el diseñador estaba haciendo era proporcionar una manera fácil de usar para
editar el contenido XML subyacente del archivo. En la práctica, no hay ninguna razón por la que no se puede
modificar el código XML directamente con el fin de hacer cambios en la interfaz de usuario y, en algunos casos,
en realidad esto puede ser más rápido que con la función Designer. En la parte inferior del panel Designer son
dos lengüetas de Diseño y de texto etiquetado respectivamente. Para cambiar a la vista XML sólo tiene que
seleccionar la ficha Texto como se muestra en la Figura 3-12:
Figura 3-12
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. También podemos ver que la propiedad text de la
TextView se establece en nuestro recurso welcomestring. Aunque varían en complejidad y contenido, todos los
diseños de interfaz de usuario se estructuran de esta manera jerárquica, basada en XML.
Una de las características más potentes de Android estudio se puede encontrar a la derecha del panel de
edición de XML. Este es el panel de vista previa y muestra el estado visual actual de la disposición. A medida
que se realizan cambios en el diseño de XML, estos se verán reflejados en el panel de vista previa. Para ver
esto en acción, modificar el diseño XML para cambiar el color de fondo de la RelativeLayout a un tono de rojo
como sigue:
<TextView
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: textAppearance = "android:? attr / textAppearanceLarge"
android: text = "@ string / welcomestring"
android: id = "@ + / Identificación del TextView"
android: layout_centerVertical = "true"
android: 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
configuración en el archivo XML. Tenga en cuenta también que un pequeño cuadrado rojo aparece en el margen
izquierdo (también conocida como la cuneta) del editor de XML al lado de la línea que contiene la configuración
de color.Esta es una señal 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 pequeña plaza en el margen y el cambio de vista previa para
verde.
Por último, utilice la vista de proyecto para localizar la aplicación -> src -> res -> Valores -> archivo strings.xml y
haga doble clic en él para cargarlo en el editor.Actualmente el XML debe decir lo siguiente:
</ Recursos>
Como una demostración de los recursos en la acción, cambia el valor de la cadena actualmente asignado al
recurso welcomestring y luego volver al Diseñador seleccionando la pestaña del archivo de diseño en el panel
del editor. Tenga en cuenta que el diseño se ha recuperado el valor nuevo recurso para la cadena de
bienvenida.
También hay una forma rápida de acceder al valor de un recurso de referencia en un archivo XML. Con la
herramienta de diseño en modo de texto, haga clic en el "@ string / welcomestring" valor de la propiedad para
que se resalte y presione Ctrl + B en el teclado. Android Studio posteriormente abrir el archivo strings.xml y le
llevará a la línea 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.
Para volver a un solo diseño vista previa, seleccione el menú del dispositivo, una vez más, esta vez de elegir la
opción Eliminar previstas.
Resumen
Aunque no es excesivamente complejo, una serie de pasos están involucrados en la creación de un entorno de
desarrollo de Android. Después de haber realizado estos pasos, vale la pena trabajar a través de un ejemplo
sencillo para asegurarse de que el medio ambiente se ha instalado y configurado correctamente. En este
capítulo, hemos creado una aplicación sencilla y luego se usa Diseñador Android interfaz de Studio para
modificar el diseño 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ó el tema de los
diseños. Por último, nos fijamos en el código XML subyacente que se utiliza para almacenar los diseños de
interfaz de usuario de las aplicaciones de Android.
Si bien es útil para poder previsualizar el diseño desde dentro de la herramienta Android Studio Designer, no
hay sustituto para probar una aplicación mediante la compilación y ejecutarlo. En un capítulo posterior
titulado Creación de un dispositivo virtual de Android (AVD) en Android estudio , los pasos necesarios para
configurar un emulador para propósitos de prueba se tratarán en detalle. Antes de ejecutar la aplicación, sin
embargo, el siguiente capítulo se llevará un pequeño desvío para ofrecer una visita guiada de la interfaz de
usuario de Android Studio.
Si bien es tentador para sumergirse en ejecutar la aplicación de ejemplo creado en el capítulo 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 característica que es, en gran medida, de
uso intuitivo.Dicho esto, tomando el tiempo para familiarizarse con el diseño y la organización de la interfaz de
usuario de Android Estudio acortará considerablemente la curva de aprendizaje en los últimos capítulos del
libro. Con esto en mente, este capítulo ofrecerá una visión general inicial de las distintas zonas y componentes
que conforman el entorno Android Studio.
La pantalla de bienvenida
La pantalla de bienvenida (Figura 4-1) se presenta cada vez que Android se ejecuta Studio con ningún proyecto
actualmente abiertos (proyectos abierto se puede cerrar en cualquier momento seleccionando Archivo -> opción
de menú Cerrar proyecto). Si Android Studio fue salió previamente mientras que un proyecto aún estaba abierta,
la herramienta-pasar por la pantalla de bienvenida próxima vez que se puso en marcha, abriendo
automáticamente el proyecto previamente activo.
Figura 4-1
Además de una lista de proyectos recientes, el menú Inicio rápido ofrece 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. Además, la opción Configurar permite acceder al SDK Manager junto con una amplia gama de
configuraciones y opciones de configuración. Una revisión de estas opciones revelará rápidamente que no hay
casi ningún aspecto de Android Studio que no puede ser configurado y adaptado a sus necesidades específicas.
Por último, la barra de estado a lo largo del borde inferior de la ventana proporciona información sobre la versión
de Android Estudio actualmente en ejecución, 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 abre, aparecerá la ventana principal de Android
Studio. Cuando varios proyectos están abiertos a la vez, cada uno se le asignará su propia ventana principal. La
configuración precisa de la ventana puede variar dependiendo de la que se muestran las herramientas y los
paneles de la última vez que el proyecto estaba abierta, pero será típicamente parecerse a la de la Figura 4-2.
Figura 4-2
B - Barra de herramientas - Una selección de los accesos directos a cabo con frecuencia
acciones. Los botones de la barra de herramientas proporcionan un acceso más rápido a un grupo selecto
de las acciones de la barra de menús. La barra de herramientas se puede personalizar haciendo clic
derecho sobre la barra y seleccionar Personalizar menús y barras de herramientas ... del menú.
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 ubicación, sin embargo, está sujeta a
contexto. Durante la edición de código, por ejemplo, aparecerá el editor de código. Cuando se trabaja en un
archivo de diseño 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 pestaña 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 botón de menú de herramientas situada en la esquina
izquierda. Al pasar por encima los elementos de la barra de estado proporcionará una descripción de ese
campo. Muchos campos son interactivos, lo que permite al usuario hacer clic para realizar tareas u obtener
información de estado más detallada.
F - Proyecto Ventana Herramienta - La ventana de herramientas del proyecto proporciona una visión
jerárquica de la estructura de archivos de proyecto que permite la navegación a los archivos y carpetas
específicas a realizar.
La ventana de herramientas del proyecto es sólo uno de una serie de ventanas de herramientas disponibles en
el entorno Android Studio.
La herramienta de Windows
Además de la ventana de herramientas vista del proyecto, Android Studio también 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 rápido ventana de herramientas se puede acceder con solo pasar el puntero del ratón sobre el botón
situado en la esquina izquierda de la barra de estado (Figura 4-4) sin hacer clic en el botón del ratón.
Figura 4-4
Al seleccionar un elemento en el menú de acceso rápido hará que la ventana de la herramienta correspondiente
que aparezca dentro de 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 rápido en la barra de estado. Estas barras aparecen a lo largo de la izquierda,
derecho e inferior de los bordes de la ventana principal (como se indica por 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 botón en la barra de estado ocultarlos.
Figura 4-5
Al hacer clic en un botón se mostrará la ventana de la herramienta correspondiente, mientras que un segundo
clic, se oculta la ventana. Botones prefijados con un número (por ejemplo 1: Proyecto) indican que la ventana de
la herramienta también puede visualizarse pulsando la tecla Alt en el teclado (o la tecla Comando para Mac OS
X), junto con el número correspondiente.
La ubicación de un botón en una barra de la ventana de la herramienta indica el lado de la ventana contra la que
aparecerá la ventana cuando se muestran. Estas posiciones pueden ser cambiados haciendo clic y arrastrando
los botones para diferentes ubicaciones en otras barras de herramientas de la ventana.
Cada ventana de la herramienta tiene su propia barra de herramientas a lo largo del borde superior. Los botones
dentro de estas barras de herramientas varían de una herramienta a otra, aunque todas las ventanas de
herramientas contienen una opción de configuración, 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 configuración
de la ventana de herramientas vista del proyecto. Las opciones están disponibles, por ejemplo, para desacoplar
una ventana y les permiten flotar fuera de los límites de la ventana principal de Android Studio.
Figura 4-6
Todas las ventanas también incluyen un botón a la derecha de la barra de herramientas 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 más utilizado de los cuales son los siguientes:
Proyecto - La vista del proyecto proporciona una visión general de la estructura de archivos que
componen el proyecto que permite una rápida navegación entre archivos. En general, hacer doble clic en
un archivo en la ventana del proyecto hará que el archivo a ser cargado en la herramienta de edición
apropiado.
Estructura - La estructura herramienta proporciona una visión de alto nivel de la estructura del archivo
de origen que se muestra actualmente en el editor. Esta información incluye una lista de elementos, tales
como clases, métodos 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 artículos del proyecto se pueden agregar a la lista de favoritos. Al hacer
clic derecho sobre un archivo en la ventana de proyecto, por ejemplo, ofrece acceso a una opción de menú
Agregar a Favoritos. Del mismo modo, un método en un archivo de código fuente se puede agregar como
favorito haciendo clic derecho sobre ella en la ventana Estructura herramienta. Cualquier cosa se añade a
una lista de Favoritos se puede acceder a través de esta ventana Favoritos herramienta.
Construir Las variantes - La acumulación variantes ventana de herramientas proporciona una forma
rápida de configurar diferentes tipos de generación para el proyecto actual de la aplicación (por ejemplo,
diferentes formaciones para la depuración y liberar versiones de la aplicación, o múltiples compilaciones
para dirigirse a diferentes categorías de dispositivos).
TODO - Como su nombre indica, esta herramienta proporciona un lugar para revisar los artículos que
aún 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
especificados TODO. Estos patrones se pueden revisar y cambiar seleccionando Archivo ->
Configuración ... opción de menú y navegar a la página TODO enumerados en Configuración IDE.
Ejecutar - La ventana de herramientas de ejecución esté disponible cuando una aplicación se está
ejecutando actualmente y ofrece una vista de los resultados de la ejecución junto con opciones de parar o
reiniciar un proceso en ejecución. Si una aplicación está fallando para instalar y ejecutar en un dispositivo o
emulador, esta ventana suelen proporcionar información de diagnóstico relacionada con el problema.
Registro de eventos - La ventana de registro de eventos muestra los mensajes relacionados con
eventos y actividades que se realizan dentro de Android Studio. La construcción con éxito de un proyecto,
por ejemplo, o el hecho de que una aplicación 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á información sobre el éxito o el fracaso
del proceso de construcción junto con los detalles de los errores o advertencias.
Maven Proyectos - Maven es una gestión de proyectos y construcción de sistema diseñado 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 construcción
subyacente para el desarrollo de Android, por lo menos que ya están familiarizados con Maven o tienen
proyectos Maven existentes para importar, el tiempo será mejor invertido el aprendizaje y la adopción
Gradle para sus proyectos. La ventana de herramientas proyectos Maven se puede utilizar para agregar,
administrar y Maven importación proyectos basados en Android Studio.
Gradle - La ventana de la herramienta Gradle proporciona una vista en las tareas Gradle que
conforman la configuración de construcción del proyecto. La ventana muestra las tareas que están
involucrados en la compilación de los diversos elementos del proyecto en una aplicación ejecutable. Haga
clic derecho en una tarea de primer nivel Gradle y seleccione la opción de menú Abrir Gradle Config para
cargar el Gradle construir archivo para el proyecto actual en el editor. Gradle se cubrirá con mayor detalle
más adelante en este libro.
Comandante - La herramienta de ventana Comandante puede ser mejor descrito como una
combinación de las ventanas del proyecto y estructura de herramientas, lo que permite la jerarquía de
archivos del proyecto se va a desplazar y de los distintos elementos que componen las clases para ser
inspeccionado y se carga en el editor o diseñador ventanas.
Diseñador - Disponible cuando el diseñador de interfaces está activa, esta ventana de herramientas
proporciona acceso a los paneles de árbol de componentes y propiedades del diseñador.
Atajos de teclado Android Studio
Android Studio incluye una gran cantidad de atajos de teclado diseñados para ahorrar tiempo al realizar tareas
comunes. Un listado completo mapa de teclas de acceso directo del teclado se puede ver e imprimir desde la
ventana del proyecto Android Estudio seleccionando la Ayuda -> opción de menú de referencia por defecto de
configuración de teclado.
Una vez que aparece, el conmutador permanecerá visible durante todo el tiempo la tecla Ctrl sigue
deprimida. Tocando repetidamente la tecla Tab mientras mantiene pulsada la tecla Ctrl ciclo voluntad a través
de las distintas opciones de selección, mientras que soltar la tecla Ctrl causa del control seleccionado para ser
seleccionados y se muestran dentro de la ventana principal.
Además de la conmutación, la navegación a los archivos abiertos recientemente es proporcionada por el panel
de archivos recientes (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 ratón se puede usar para seleccionar una opción 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 ENTER para seleccionar el elemento resaltado.
Figura 4-8
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
menús, barra de herramientas, la edición y el área de diseño, barra de estado y una colección 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 rápido situada en la barra de estado, oa través de los barrotes
de la ventana de herramientas opcionales.
Hay muy pocas acciones dentro Android estudio que no se pueden activar a través 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.
En el curso del desarrollo de aplicaciones de Android en Android estudio será necesario para compilar y ejecutar
una aplicación varias veces. Una aplicación Android puede ser probado por la instalación y ejecución que sea en
un dispositivo físico 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 especificación de un modelo de
teléfono. El objetivo de este capítulo, por lo tanto, es trabajar a través de los pasos necesarios para crear un
dispositivo virtual, utilizando la tableta Nexus 7 como un ejemplo de referencia
Una vez puesto en marcha, aparecerá la herramienta como se indica en la Figura 5-2. Asumiendo una nueva
instalación del SDK de Android, actualmente se listarán no AVDs:
Figura 5-2
Comience el proceso de creación AVD haciendo clic en el botón Nuevo ... para invocar el cuadro de diálogo
Crear un nuevo dispositivo virtual de Android (AVD). En el cuadro de diálogo, realice los siguientes pasos para
crear un emulador compatible Nexus primera generación 7:
1. Introduzca un nombre descriptivo (por ejemplo Nexus7) en el campo Nombre. Tenga en cuenta que los
espacios y otros caracteres especiales no están permitidos en el nombre. 2. Establecer el menú de dispositivos
para Nexus 7 (2012) (7.0 ", 800 x 1280: tvhdpi). 3. Establecer el menú Destino para Android 4.4 - Nivel API 19.
4. Ajuste el menú CPU / ABI a ARM (armeabi-v7a). 5. Establecer el menú de la piel de "sin piel" para que el
dispositivo se muestra sin controles de hardware simulados. 6. Deje el valor RAM por defecto en las opciones de
memoria y el valor de almacenamiento interno sin cambios de la configuración predeterminada. Tenga en
cuenta sin embargo, que puede ser necesario para reducir el valor de RAM por debajo 768M en sistemas
Windows con menos memoria disponible. 7. Si el equipo host contiene una web cam la cámara frontal:
emulación puede ser configurado para utilizar esta cámara.Alternativamente, una cámara emulado puede ser
seleccionado. Si funcionalidad de la cámara no es requerido por la aplicación, simplemente deje este conjunto
en Ninguno.
Independientemente de si se habilita la presente opción de teclado de hardware es una cuestión de preferencia
personal. Cuando se selecciona la opción de teclado de hardware, será posible utilizar el teclado físico en el
sistema en el que se ejecuta el emulador. Como tal, el teclado de software Android no aparecerá en el emulador
cuando la introducción de texto es requerido por una aplicación en ejecución.
Tenga en cuenta que también puede ser posible para acelerar el rendimiento del emulador activando la opción
GPU Uso Host. En el caso de que el emulador se bloquea durante el arranque cuando se selecciona esta
opción, edite las propiedades de los dispositivos virtuales y desactivar esta opción. Figura 5-3 ilustra el diálogo
con los ajustes adecuados, aplicados por un emulador de Nexus 7. Una vez que los ajustes de configuración se
han completado, haga clic en el botón Aceptar.
Figura 5-3
Con la AVD creado, la AVD Manager 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
botón Editar ....
Figura 5-4
Por defecto, Android Estudio responderá a la solicitud de ejecución mediante la visualización del diálogo
Seleccionar dispositivo. Esto ofrece la opción para ejecutar la aplicación en una instancia AVD que ya está en
marcha, o para iniciar una nueva sesión de AVD específicamente para esta aplicación. Figura 5-5 muestra el
creado previamente Nexus7 AVD como un dispositivo que ejecuta como resultado de los pasos realizados en la
sección anterior. Con este dispositivo seleccionado en el cuadro de diálogo, haga clic en Aceptar para instalar y
ejecutar la aplicación en el emulador.
Figura 5-5
Una vez instalada la aplicación en funcionamiento, la interfaz de usuario para la clase AndroidSampleActivity
aparecerá en el emulador:
Figura 5-6
En el caso de que la actividad no se inicia automáticamente, 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 aplicación. Una vez que
comienza el proceso de ejecución, de gestión y Android ventanas de herramientas estarán disponibles. La
ventana de la herramienta Ejecutar mostrará información de diagnóstico como el paquete de aplicación se
instala y se inicia. Figura 5-7 muestra la salida de la ventana de herramientas Ejecutar en un lanzamiento de la
aplicación con éxito:
Figura 5-7
Si surgen problemas durante el proceso de lanzamiento, la herramienta Ejecutar proporcionará información que
se espera ayude a aislar la causa del problema.
Suponiendo que se carga la aplicación 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.
Figura 5-8
En el cuadro de diálogo Ejecutar / Depurar configuraciones, la aplicación puede configurarse para utilizar
siempre un emulador preferido activando la opción Emulador enumerados en la sección Dispositivo de destino y
seleccionar el emulador desde el menú desplegable. Figura 5-9, por ejemplo, muestra la aplicación
AndroidSample configurado para ejecutarse de forma predeterminada en el emulador Nexus7 creado
anteriormente:
Figura 5-9
Una vez que aparezca la ventana de herramientas Android, asegúrese de que los dispositivos | ADB Registros
pestaña se ha seleccionado, y que se ha seleccionado la entrada Emulador Nexus7 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-11:
Figura 5-11
Con el proceso de seleccionar, detenerla haciendo clic en el botón rojo Finalizar aplicación en la barra de
herramientas vertical a la izquierda de la lista de procesos:
Una alternativa al uso de la ventana de herramientas Android es abrir el Android Debug Monitor. Esto puede ser
lanzado a través de las Herramientas -> Android -> opción de menú Monitor de dispositivos Android. Una vez
puesto en marcha, el proceso se puede seleccionar de la lista (Figura 5-13) y terminó haciendo clic en el botón
rojo de parada ubicada en la barra de herramientas superior de la lista.
Figura 5-13
La salida resultante del comando anterior contendrá una lista de las versiones del SDK de Android que están
disponibles en el sistema. Por ejemplo:
Por ejemplo, para crear un nuevo AVD llamado Nexus7 utilizando el ID de destino para el dispositivo Android 4.4
API nivel 19 (en este caso Identificación del 1), el siguiente comando se puede utilizar:
Del mismo modo, para eliminar una AVD existente, basta con utilizar la opción de eliminación de la siguiente
manera:
El archivo config.ini contiene los parámetros de configuración de dispositivos, tales como dimensiones de la
pantalla y memoria especificados durante el proceso de creación de AVD. Estos ajustes se pueden cambiar
directamente en el archivo de configuración y se adoptarán por la AVD cuando se invoca al lado.
El <nombre avd> .ini contiene una referencia al objetivo SDK de Android y la ruta a los archivos de AVD. Tenga
en cuenta que también necesitará un cambio en el valor image.sysdir en el archivo config.ini que se refleja en el
valor objetivo de este archivo.
Por ejemplo, para mover un AVD desde su ubicación actual sistema de archivos en / tmp / Nexus7Test:
Tenga en cuenta que el directorio de destino no debe existir ya antes de ejecutar el comando para mover un
AVD.
Resumen
Un proceso de desarrollo de aplicación típica 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 físico o el uso de un
dispositivo virtual (AVD) emulador de Android. AVDs se crean y administran mediante la herramienta
Administrador Android AVD que puede ser utilizado como una herramienta de línea de comandos o mediante
una interfaz gráfica de usuario. Al crear un AVD para simular un modelo específico de dispositivo Android es
importante que el dispositivo virtual puede configurar con una especificación de hardware que coincide con el
del dispositivo físico.
Mientras que se puede lograr mucho por probar aplicaciones utilizando un dispositivo virtual de Android
(AVD), no hay sustituto para la realización de pruebas de aplicaciones del mundo real en un dispositivo Android
física y hay una serie de características de Android que sólo están disponibles en los dispositivos Android
físicas. La comunicación con ambas instancias AVD y dispositivos Android conectados es manejado por el
Puente de depuración Android (BAD). En este capítulo vamos a trabajar a través de los pasos para configurar el
entorno adb para permitir pruebas de aplicaciones en un dispositivo Android físico con los sistemas basados en
Mac OS X, Windows y Linux.
$ adb devices
Lista de los dispositivos conectados
dispositivo emulador-5554
Figura 6-1
3. Vuelva a la pantalla principal de configuración y observe la aparición de una nueva opción titulada opciones
Developer. Seleccione esta opción y localizar el ajuste en la depuración USB titulado pantalla
desarrollador. Active la casilla de verificación junto a este elemento como se ilustra en la Figura 6-2 para permitir
la conexión de depuración adb.
Figura 6-2
4. Pase 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 actualmente como un dispositivo multimedia.
Figura 6-3
5. Seleccione la entrada de una notificación dispositivo de medios y en el panel resultante (Figura 6-4) cambiar
el tipo de conexión a la cámara (PTP).
Figura 6-4
En este punto, el dispositivo está configurado para aceptar conexiones de depuración 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 de herramientas SDK de Android está incluido en la variable
de entorno PATH del sistema operativo como se describe en el capítulo titulado La creación de un entorno de
desarrollo de Android.
A continuación, reinicie el servidor adb emitiendo los siguientes comandos en la ventana de terminal:
$ Kill-servidor 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 los dispositivos conectados
74CE000600000001 offline
Si el dispositivo aparece como fuera de línea, vaya al dispositivo Android y comprobar la presencia del diálogo
que se muestra en la Figura 6-9 pedir permiso para permitir una depuración USB. Active la casilla junto a la
opción que dice permite Siempre desde este equipo, antes de hacer clic en Aceptar. Repitiendo el comando adb
devices ahora debe enumerar el dispositivo como disponibles:
En el caso de que el dispositivo no está en la lista, trate de salir de la sesión y luego de nuevo en el escritorio de
Mac OS X y, si el problema persiste, reiniciar el sistema.
Inicie Android Studio y abra el Administrador de SDK de Android, ya sea seleccionado Configurar ->
Gestor de SDK desde la pantalla de bienvenida, o el uso de las Herramientas -> Android -> SDK
opción de menú Administrador cuando se trabaja en un proyecto existente.
Vaya a la sección de Extras y comprobar el estado del paquete USB Driver Google para asegurarse de
que está catalogado como Instalado.
Si no está instalado el controlador, seleccione y haga clic en el botón Instalar paquetes para iniciar la
instalación.
Una vez completada la instalación, 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 información
de descarga se puede obtener en línea 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
portátil. Para que el dispositivo para conectarse a ADB debe configurarse como un dispositivo Android ADB
Composite. En primer lugar, conecte el dispositivo Android en el sistema informático si no está conectado
actualmente. A continuación, mostrar el Panel de control y seleccione Administrador de dispositivos. En el
diálogo que aparece, compruebe si hay una categoría denominada Otros dispositivos. Despliegue esta categoría
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
opción Buscar en mi sistema software de controlador y en el siguiente cuadro de diálogo, mantenga la opción
Incluir subcarpetas seleccionadas y haga clic en el botón Examinar .... Vaya a la ubicación 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 instalación de Android Studio (cuya ubicación se encuentra en
el SDK Manager). Una vez localizado, haga clic en Aceptar para seleccionar la carpeta del controlador seguido
en Siguiente para iniciar la instalación. Durante la instalación, aparecerá un mensaje de seguridad de Windows
aparecerá pidiendo permiso para instalar el controlador como se ilustra en la Figura 6-6. Cuando aparezca este
cuadro de diálogo, haga clic en el botón Instalar para continuar.
Figura 6-6
Una vez finalizada la instalación, la pantalla de actualización del controlador de Windows se actualizará para
mostrar un mensaje que indica que el controlador se ha instalado y que el dispositivo está ahora reconocido
como un ADB Interface Android Compuesto:
Figura 6-7
Volver 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 símbolo del sistema y ejecute el siguiente comando:
adb devices
Este comando debe información de salida del dispositivo conectado similar a la siguiente:
Lista de los dispositivos conectados
015d41d4454bf80c offline
Si el dispositivo aparece como desconectado o no autorizado, vaya a la pantalla del dispositivo y compruebe si
el diálogo que se muestra en la Figura 6-9 pedir permiso para permitir una depuración USB.
Figura 6-9
Active la casilla junto a la opción que dice permite Siempre desde este equipo, antes de hacer clic en
Aceptar. Repitiendo el comando adb devices ahora debe enumerar el dispositivo que está listo:
En el caso de que el dispositivo no está en la lista, ejecute los siguientes comandos para reiniciar el servidor
ADB:
adb kill-servidor
adb start-servidor
Figura 6-10
Para hacer esto, el dispositivo predeterminado para las pruebas, que el uso mismo dispositivo para la futura
opción de lanza. Con el dispositivo seleccionado, haga clic en el botón Aceptar para instalar y ejecutar la
aplicación en el dispositivo. Al igual que con el medio ambiente emulador, salida de diagnóstico en relación con
la instalación y puesta en marcha de la aplicación 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 aplicación
correctamente en un dispositivo Android física. Esto, después de todo, es donde la aplicación se utiliza en el
mundo real.
Por defecto, sin embargo, el entorno Android estudio no está configurado para detectar los dispositivos Android
como un dispositivo de pruebas 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 capítulo, hemos cubierto los pasos para Linux, Mac OS X y Windows
plataformas basadas.
Desarrollo de aplicaciones para Android implica una cantidad considerable de trabajo de programación que, por
definición, implica escribir a máquina, revisión y modificación de líneas de código. No debería ser ninguna
sorpresa que la mayoría del tiempo de un programador dedicado al uso de Android Studio suelen implicar la
edición de código dentro de la ventana del editor.
El editor de código moderno tiene que ir mucho más allá de los fundamentos originales de escribir, borrar, cortar
y pegar. Hoy en día la utilidad de un editor de código se mide generalmente por factores tales como la cantidad
en que se reduce la tipificación requerida por el programador, la facilidad de la navegación a través de grandes
archivos de código fuente y la capacidad del editor para detectar y poner de relieve los errores de programación
en tiempo real, como se escribe el código. Como se pondrá de manifiesto en este capítulo, estas son sólo
algunas de las áreas en las que el editor de Android Estudio sobresale.
Aunque no es un panorama exhaustivo de las características del editor de Android de estudio, este capítulo
tiene como objetivo proporcionar una guía de las principales características de la herramienta. Los
programadores experimentados encontrarán que algunas de estas características son comunes a la mayoría de
los editores de código disponible en la actualidad, mientras que un número son exclusivas de este entorno de
edición especial.
Los elementos que componen la ventana del editor se puede resumir de la siguiente manera:
A - Aquí el documento - Android Studio es capaz de contener múltiples archivos abiertos para la edición en un
momento dado. Como se abre cada archivo, se le asigna una ficha de documento que muestra el nombre del
archivo en la barra de pestañas situado a lo largo del borde superior de la ventana del editor.Un pequeño menú
desplegable aparecerá en la esquina derecha de la barra de pestañas 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 línea roja ondulada debajo de un nombre de archivo en una pestaña indica que el código en el
archivo contiene uno o más errores que deben ser abordados antes de que el proyecto se puede compilar y
ejecutar.
Cambio entre archivos es simplemente una cuestión de hacer clic en la ficha correspondiente o utilizando los
atajos de teclado Alt-Derecha-Izquierda y Alt. La navegación entre archivos también se puede realizar utilizando
el mecanismo Switcher (accesible a través de la combinación de teclas Ctrl-Tab).
Para desmontar un panel de editor desde la ventana principal de Android Estudio para que aparezca en una
ventana independiente, haga clic en la ficha y arrastrarlo a un área en el escritorio fuera de la ventana
principal. Para volver al editor a la ventana principal, haga clic en la pestaña archivo en la ventana del editor
separado y arrastrar y soltarlo en la barra de pestañas editor original en la ventana principal.
B - The Gutter área Editor - El área de alcantarilla es utilizado por el editor para mostrar iconos y controles
informativos. Algunos elementos típicos, entre otros, que aparecen en esta área cuneta está depurando
marcadores de punto de interrupción, los controles de plegar y desplegar bloques de código, marcadores,
marcadores y cambiar los números de línea. Los números de línea están apagados por defecto, pero se pueden
activar haciendo clic derecho en la cuneta y seleccionando la opción de menú Mostrar números de línea.
C - La barra de estado - A pesar de la barra de estado es en realidad parte de la ventana principal, en
contraposición con el editor, contiene alguna información acerca de la sesión de edición activa. Esta información
incluye la posición actual del cursor en términos de líneas y caracteres y el formato de codificación 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 número de línea, por ejemplo, muestra el pase a la línea de diálogo.
D - El área Editor - Esta es el área principal donde se muestra el código, entró y editado por el usuario. Las
secciones posteriores de este capítulo cubrirán las principales características de la zona de edición en detalle.
E - La validación y Marker Sidebar - Android estudio incorpora una función denominada "análisis de código
sobre la marcha". Lo que esto significa básicamente es que a medida que está escribiendo código, el editor está
analizando el código para comprobar si hay advertencias y errores de sintaxis. El cuadrado de color en la parte
superior de la barra lateral de validación 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 código en el editor como se
ilustra en la Figura 7-2:
Figura 7-2
La barra lateral también muestra los marcadores en los lugares donde los problemas se han detectado
utilizando el mismo código de colores. Al pasar el puntero del ratón sobre una marca, cuando la línea de código
es visible en el área de edición se mostrará una ventana emergente que contiene una descripción del problema
(Figura 7-3):
Figura 7-3
Al pasar el puntero del ratón sobre una marca para una línea de código que se desplaza actualmente fuera del
área de visualización del editor mostrará un overlay "lente" que contiene el bloque de código en el que se
encuentra el problema (Figura 7-4) que le permite ser visto sin la necesidad de desplazarse a la ubicación en el
editor:
Figura 7-4
También vale la pena señalar que la plantilla del objetivo no se limita a las advertencias y errores en la barra
lateral. Al pasar el ratón sobre cualquier parte de la barra lateral se traducirá en una lente que aparece con el
código presente en ese lugar en el archivo de origen.
Después de haber proporcionado una visión general de los elementos que componen el editor de Android
Studio, el resto de este capítulo explorará las características clave del entorno de edición con más detalle.
La orientación de un panel de división se puede cambiar en cualquier momento haciendo clic derecho sobre la
pestaña correspondiente y seleccionando la opción de menú Orientación Cambio Splitter. Repita estos pasos
para cancelar la división de un solo panel, esta vez seleccionando la opción Unir la del menú.Todos los paneles
de división se puede eliminar con un clic derecho en cualquier pestaña y seleccionando la opción de menú Unir
la All.
Ventana división se puede utilizar para mostrar diferentes archivos, o para proveer varias ventanas en el mismo
archivo, lo que permite diferentes áreas del mismo archivo para ser vistos y editados simultáneamente.
Código de finalización
El editor de Android Studio tiene una cantidad considerable de conocimiento incorporado en la sintaxis de
programación Java y las clases y métodos que componen el SDK de Android, así como el conocimiento de su
propia base de código. Como se escribe código, el editor analiza lo que se ha escrito y, en su caso, se hacen
sugerencias con respecto a lo que podría ser necesario para completar una declaración o de referencia. Cuando
una sugerencia conclusión es detectado por el editor, aparecerá un panel que contiene una lista de
sugerencias. En la Figura 7-6, por ejemplo, el editor está sugiriendo posibilidades para el inicio de una
declaración de la secuencia:
Figura 7-6
Si ninguna de las sugerencias de terminación automática son correctas, simplemente siga escribiendo y el editor
seguirá perfeccionando las sugerencias en su caso. Para aceptar la sugerencia más arriba, basta con 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 más el uso de la Confirmar o la tecla Tab para seleccionar el elemento
resaltado.
Sugerencias de terminación pueden ser invocadas manualmente utilizando la secuencia de teclas Ctrl-
Espacio. Esto puede ser útil cuando se cambia una palabra o declaración en el editor. Cuando el cursor se
encuentra sobre una palabra en el editor, esa palabra resaltará automáticamente. Al pulsar Ctrl-Espacio
mostrará una lista de sugerencias alternativas. Para reemplazar la palabra actual con el elemento resaltado en
la lista de sugerencias, simplemente pulse la tecla Tab.
Además de la función de autocompletado en tiempo real, el editor de Android Studio también ofrece un sistema
denominado inteligente Finalización.Terminación inteligente se invoca utilizando la secuencia de teclas Shift +
Ctrl + Espacio y, si está activa, proporcionará sugerencias más detalladas basadas en el contexto actual del
código. Al pulsar la secuencia de atajo Shift-Ctrl-Espacio segunda vez proporcionará más sugerencias de una
gama más amplia de posibilidades.
Finalización de código puede ser una cuestión de preferencia personal por muchos programadores. En
reconocimiento de este hecho, Android Studio proporciona un alto nivel de control sobre la configuración de
terminación automática. Estos se pueden ver y modificar seleccionando Archivo -> Configuración ... opción de
menú y eligiendo Editor -> Código de finalización de la sección Configuración IDE del panel de configuración,
como se muestra en la Figura 7-7:
Figura 7-7
Finalización de instrucciones
Otra forma de realización automática proporcionada por el editor de Android Studio es la finalización de
instrucciones. Esto puede ser usado para llenar automáticamente los paréntesis y los apoyos para los artículos
tales como los métodos y las declaraciones de bucle. Finalización de instrucciones se invoca utilizando el Shift-
Ctrl-Enter (Shift-Cmd-Intro en Mac OS X) secuencia de teclas. Considere por ejemplo el siguiente código:
Después de haber escrito este código en el editor, lo que provocó la finalización de instrucciones hará que el
editor para agregar automáticamente los frenos para el método:
Información de parámetros
También es posible pedir al editor para proporcionar información sobre los parámetros de argumentos
aceptados por un método. Con el cursor colocado entre los soportes de una llamada a un método, el Ctrl-P
(Cmd-P en Mac OS X) secuencia de teclado mostrará los parámetros conocidos para ser aceptado por ese
método, con la sugerencia más probable resaltado en negrita:
Figura 7-8
Generación de código
Además de completar código tal como se escribe el editor puede, bajo ciertas condiciones, también generar el
código para usted. La lista de opciones de generación de código 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 ubicación en el
archivo en el que el código se va a generar.
Figura 7-9
A los efectos de un ejemplo, considere una situación en la que queremos ser notificados cuando una actividad
en nuestro proyecto está a punto de ser destruido por el sistema operativo. Como se describe en un capítulo
posterior de este libro, esto se puede lograr mediante la sustitución del método del ciclo de vida OnStop () de la
superclase Actividad. Para tener Android Estudio generar un método talón para esto, sólo tiene que seleccionar
los métodos de reemplazo ... opción de la lista de generación de código y seleccione el método OnStop () de la
lista resultante de los métodos disponibles:
Figura 7-10
Una vez seleccionado el método para sustituir, al hacer clic en Aceptar generará el método talón en la posición
actual del cursor en el archivo fuente de Java de la siguiente manera:
@ Override
protegida OnStop void () {
super.onStop ();
}
Plegable Código
Una vez que un archivo de código fuente alcanza cierto tamaño, incluso el código más cuidadosamente
formateado y bien organizada puede llegar a ser abrumadora y difícil de navegar. Android Estudio considera que
no siempre es necesario contar con el contenido de cada bloque de código visible en todo momento. Código de
navegación puede ser más fácil con el uso de la función de plegado de código del editor de Android
Studio. Plegado de código se controla el uso de marcadores que aparecen en la cuneta editor al principio y al
final de cada bloque de código en un archivo de origen. Figura 7-11, por ejemplo, pone de relieve los
marcadores de inicio y fin de una declaración de método que no se dobla en la actualidad:
Figura 7-11
Al hacer clic en cualquiera de estos marcadores se pliegue la declaración de tal manera que sólo la línea de la
firma es visible como se muestra en la Figura 7-12:
Figura 7-12
Para desplegar una sección colapsado de código, simplemente haga clic en el marcador de "+" en la cuneta
editor. Para ver el código oculto sin desdoblarla, pase el puntero del ratón sobre el "{...}" indicador como se
muestra en la Figura 7-13. El editor mostrará entonces la superposición de lentes que contiene el bloque de
código plegada:
Figura 7-13
Todos los bloques de código en un archivo puede doblarse o desplegarse utilizando las secuencias de teclado
Ctrl-Shift-Plus y Ctrl-Shift-Minus.
Por defecto, el editor de Android Studio automáticamente doblar algún código cuando se abre un archivo de
origen. Para configurar las condiciones en que esto sucede, seleccione Archivo -> Configuración ... y seleccione
el Editor -> entrada plegado de código que aparece en Configuración de IDE en el panel de configuración
resultante (Figura 7-14):
Figura 7-14
Búsqueda de Documentación Rápida
Contexto Java sensible y documentación Android se puede acceder al poner el cursor sobre la declaración para
la que se requiere documentación y pulsando la combinación de teclas Ctrl-Q (Ctrl-J en Mac OS X). Esto
mostrará una ventana emergente que contiene la documentación de referencia pertinente para el artículo. Figura
7-15, por ejemplo, muestra la documentación de la clase Menu Android.
Figura 7-15
Una vez que aparece, el emergente documentación se puede mover por la pantalla según sea necesario. Al
hacer clic en el icono de alfiler situado en la esquina derecha de la barra de título emergente se asegurará de
que la ventana emergente permanece visible una vez que el foco se mueve de nuevo al editor, dejando la
documentación visible como una referencia al escribir código.
Figura 7-16
La gama completa de las preferencias de estilo de código se puede cambiar desde dentro del diálogo de
configuración del proyecto. Seleccione Archivo -> Configuración de opciones de menú y elija Estilo Código
enumerados en Configuración del proyecto en el panel de la izquierda para acceder a una lista de lenguajes de
programación y de marcas compatibles. Selección 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 código preferido.
Resumen
El editor de Android Estudio va a la gran longitud para reducir la cantidad de escritura necesaria para escribir
código y hacer que el código más fácil de leer y navegar. En este capítulo hemos cubierto algunas de las
características del editor clave, incluyendo la finalización de código, generación de código, editor de ventanas
división, plegado de código, formatear y búsqueda de documentación.
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 también se ha tenido en el proceso de
desarrollo de aplicaciones a través de la creación de un proyecto de aplicación de Android Estudio simple.
Antes de ahondar aún más en las cuestiones prácticas de desarrollo de aplicaciones de Android, sin embargo,
es importante obtener una comprensión de algunos de los conceptos más abstractos, tanto del SDK de Android
y el desarrollo de Android en general. Para una comprensión clara de estos conceptos ahora proporcionará una
base sólida sobre la que construir nuevos conocimientos. Comenzando con una visión general de la arquitectura
de Android en este capítulo, y continuando en los próximos capítulos de este libro, el objetivo es proporcionar
una visión detallada de los fundamentos del desarrollo de Android.
El resto de este capítulo se trabajará a través 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 núcleo de Linux proporciona un nivel de abstracción
entre el hardware del dispositivo y las capas superiores de la pila de software Android. Basado en Linux versión
2.6, el kernel proporciona multitarea preventiva, servicios del sistema base de bajo nivel, tales como la memoria,
los procesos y la administración de energía, además de proporcionar una pila y dispositivos de red
controladores para hardware, como la pantalla del dispositivo, Wi-Fi y audio.
El núcleo 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 Free Software Foundation
para crear un sistema operativo completo denominado GNU / Linux. Varias distribuciones de Linux se han
derivado de estos fundamentos básicos como Ubuntu y Red Hat Enterprise Linux.
Es importante señalar, sin embargo, que Android sólo utiliza el kernel de Linux. Dicho esto, vale la pena señalar
que el núcleo Linux fue desarrollado originalmente para su uso en los ordenadores tradicionales en forma de
equipos de sobremesa y servidores. De hecho, Linux está ahora más ampliamente desplegada en entornos de
servidores empresariales de misión crítica. Es un testimonio tanto a la potencia de los dispositivos móviles de
hoy en día y la eficiencia y el rendimiento del kernel de Linux que se encuentra este software en el corazón de la
pila de software Android.
Bibliotecas Android
Esta categoría abarca aquellas bibliotecas basadas en Java que son específicos para el desarrollo de
Android. Los ejemplos de las bibliotecas en esta categoría incluyen las bibliotecas marco de aplicación, además
de los que facilitan la creación de interfaz de usuario, el dibujo de gráficos y el acceso de base de datos.
Un resumen de algunas bibliotecas Android núcleo tecla disponible para el programador Android es el siguiente:
C / C ++ Bibliotecas
Las bibliotecas del núcleo de ejecución Android descritos en la sección anterior son basadas en Java y
proporcionan las API primaria para los desarrolladores que escriben aplicaciones de Android. Es importante
señalar, sin embargo, que las bibliotecas del núcleo en realidad no realizan gran parte del trabajo real y están,
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 gráficos 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 gráficos 3D,
Secure Sockets Layer (SSL), gestión de base de datos SQLite, reproducción de audio y vídeo, mapa de bits y
vectores renderización de fuentes, subsistema de visualización y capa gráfica gestión y una implementación de
la biblioteca del sistema estándar de C (libc).
En la práctica, el desarrollador típica aplicación Android accederá a estas bibliotecas únicamente a través 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), cuyo propósito es llamar a
los métodos nativos de lenguajes de programación no Java (tales como C y C ++) de en el código 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 más en una aplicación que también es capaz de publicar sus capacidades junto con los datos
correspondientes de modo que se pueden encontrar 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 aplicación y pila actividad.
Proveedores de Contenido - Permite que las aplicaciones para publicar y compartir datos con otras
aplicaciones.
Resource Manager - Proporciona acceso a los recursos no código incrustado como cuerdas, ajustes
de color y diseños de interfaz de usuario.
Notificaciones Gerente - Permite a las aplicaciones para mostrar alertas y notificaciones para el
usuario.
Vista System - Un conjunto ampliable de puntos de vista que se utilizan para crear interfaces de
usuario de aplicaciones.
Gestor de Paquetes - El sistema por el cual las aplicaciones son capaces de buscar información
acerca de otras aplicaciones instaladas actualmente en el dispositivo.
Telefonía Gerente - Proporciona información a la aplicación de los servicios telelphony disponibles en
el dispositivo, tales como información de estado y abonado.
Location Manager - Proporciona acceso a los servicios de localización que permiten una aplicación
para recibir actualizaciones sobre los cambios de ubicación.
Aplicaciones
Situado en la parte superior de la pila de software Android son las aplicaciones. Estos comprenden tanto las
aplicaciones nativas proporcionadas con la aplicación Android en particular (por ejemplo, las aplicaciones de
navegador web y correo electrónico) y las aplicaciones de terceros instaladas por el usuario después de la
compra del dispositivo.
Resumen
Una buena base de conocimientos de desarrollo de Android requiere una comprensión de la estructura general
de Android. Android se implementa en forma de una arquitectura de pila de software que consiste en un núcleo
de Linux, un entorno de ejecución y las bibliotecas correspondientes, un marco de aplicación y un conjunto de
aplicaciones. Las aplicaciones están escritas principalmente en Java y se ejecutan dentro de instancias
individuales de la máquina virtual Dalvik. Los objetivos clave de la arquitectura de Android son el rendimiento y
la eficiencia, tanto en la ejecución de aplicaciones y en la ejecución de su reutilización en el diseño de
aplicaciones.
8 La Anatomía de una aplicación Android Android Estudio
Actividades Android
Quienes están familiarizados con los lenguajes de programación orientados a objetos como Java, C ++ o C #
estarán familiarizados con el concepto de elementos de funcionalidad de la aplicación en las clases que luego
son instanciados como objetos y manipuladas para crear una aplicación que encapsula.Dado que las
aplicaciones de Android están escritos en Java, esto sigue siendo mucho el caso. Android, sin embargo,
también lleva el concepto de componentes reutilizables a un nivel superior.
Aplicaciones de Android son creados por reunir uno o más componentes conocidos como Actividades. Una
actividad es un único módulo, independiente de la funcionalidad de la aplicación que normalmente se
correlaciona directamente con una única pantalla de interfaz de usuario y su funcionalidad correspondiente.Una
aplicación citas podría, por ejemplo, tener una pantalla de actividad que muestra las citas establecidas para el
día actual. La aplicación también puede utilizar una segunda actividad que consiste en una pantalla donde las
nuevas citas pueden ser introducidos por el usuario.
Las actividades están destinadas como bloques completamente reutilizables e intercambiables de construcción
que pueden ser compartidos entre diferentes aplicaciones. Una aplicación de correo electrónico existente, por
ejemplo, podría contener una actividad específicamente para redactar y enviar un mensaje de correo
electrónico. Un desarrollador podría estar escribiendo una aplicación que también tiene la obligación de enviar
un mensaje de correo electrónico. En lugar de desarrollar una actividad de la composición de correo electrónico
específicamente para la nueva aplicación, el desarrollador puede simplemente utilizar la actividad de la
aplicación de correo electrónico existente.
Las actividades se crean como subclases de la clase Actividad Android y deben implementarse de manera que
sea totalmente independiente de otras actividades en la aplicación. 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 métodos
o datos de la instancia de acceso de otra actividad. Esto, en cambio, se consigue utilizando los Fines y
proveedores de contenido.
Por defecto, una actividad no puede devolver resultados a la actividad de la que se invoca. Si se requiere esta
función, la actividad debe iniciarse específicamente como un sub-actividad de la actividad de origen.
Intenciones Android
Intenciones son el mecanismo por el que una actividad es capaz de lanzar otro y poner en práctica el flujo a
través de las actividades que componen una aplicación. Intenciones consisten en una descripción de la
operación a realizar y, opcionalmente, los datos sobre los que se va a realizar.
Intenciones puede ser explícita, en que solicitan la puesta en marcha de una actividad específica haciendo
referencia a la actividad por nombre de la clase, o implícito por el que se establezca el tipo de acción a realizar o
el suministro de datos de un tipo específico en el que la acción se va a realizar . En el caso de las intenciones
implícitas, el tiempo de ejecución Android seleccionará la actividad para lanzar que más se ajuste a los criterios
especificados por la Intención mediante un proceso conocido como la Resolución Intención.
Broadcast Intenciones
Otro tipo de intención, la intención de difusión, es una amplia intención sistema que se envía a todas las
aplicaciones que se han registrado un receptor de radiodifusión "interesado". El sistema Android, por ejemplo,
suelen enviará Broadcast Intenciones para indicar cambios en el estado del dispositivo, tales como la realización
de inicio del sistema, la conexión de una fuente de alimentación externa al dispositivo o la pantalla que se está
encendido o apagado.
A Intención de emisión puede ser normal (asíncrono) en que se envía a todos los receptores de radiodifusión
interesadas en más o menos al mismo tiempo, o ordenó en que se envía a un receptor en un momento en el
que se puede procesar y luego o bien abortado o permitido que pasar a la siguiente Receptor Broadcast.
Receptores de radiodifusión
Receptores de radiodifusión son el mecanismo por el cual las aplicaciones son capaces de responder a
Broadcast Intenciones. Un receptor de radiodifusión debe ser registrado por una aplicación y configurado con un
filtro de Intención para indicar los tipos de emisión en la que esté interesado. Cuando se emite una intención
coincidente, el receptor será invocada por el tiempo de ejecución de Android, independientemente de si la
aplicación que ha registrado el receptor se está ejecutando actualmente. El receptor dispone de 5 segundos
para completar cualquier tarea que se le exigen (como el lanzamiento de un servicio, por lo que las
actualizaciones de datos o emitir una notificación al usuario) antes de regresar. Receptores de radiodifusión
funcionar en segundo plano y no tienen una interfaz de usuario.
El Manifiesto de la aplicación
El pegamento que reúne los diferentes elementos que componen una aplicación es el archivo de manifiesto de
aplicación. Es dentro de este archivo basado en XML que la aplicación se esbozan las actividades, servicios,
receptores de radiodifusión, proveedores de datos y los permisos que componen la solicitud completa.
De recursos de aplicaciones
Además del archivo de manifiesto y los archivos de Dex que contienen el código de bytes ejecutable de la
máquina virtual Dalvik, una aplicación para Android también contendrá típicamente una colección de archivos de
recursos. Estos archivos contienen recursos tales como las cadenas, imágenes, fuentes y colores que aparecen
en la interfaz de usuario junto con la representación XML de los diseños de interfaz de usuario. De forma
predeterminada, estos archivos se almacenan en el / res subdirectorio de la jerarquía de la aplicación del
proyecto.
Contexto de aplicación
Cuando se compila una aplicación, se crea una clase llamada R que contiene referencias a los recursos de la
aplicación. El archivo de manifiesto de aplicación y estos recursos se combinan para crear lo que se conoce
como el contexto de aplicación. Este contexto, representada por la clase Contexto Android, se puede utilizar en
el código de la aplicación para obtener acceso a los recursos de la aplicación en tiempo de ejecución. Además,
una amplia gama de métodos puede ser llamado en el contexto de una aplicación para recopilar información y
realizar cambios en el medio ambiente de la aplicación en tiempo de ejecución.
Resumen
Una serie de diferentes elementos se puede reunió con el fin de crear una aplicación Android. En este capítulo,
hemos proporcionado una visión general de alto nivel de las actividades, servicios, los intentos y los receptores
de radiodifusión, junto con un resumen de los recursos de archivos y aplicaciones de manifiesto. Máxima
reutilización y la interoperabilidad son promovidos a través de la creación de módulos individuales,
independientes de la funcionalidad en forma de actividades y las intenciones, mientras que el intercambio de
datos entre las aplicaciones se consigue mediante la aplicación de los proveedores de contenidos.
Mientras que las actividades se centran en las áreas donde el usuario interactúa con la aplicación (una actividad
que equivale esencialmente a una sola pantalla de interfaz de usuario), el proceso de fondo se maneja
normalmente por servicios y receptores de radiodifusión.
Los componentes que constituyen la aplicación se describen para el sistema de ejecución de Android en un
archivo de manifiesto que, junto con los recursos de la aplicación, representa el contexto de la aplicación.
Mucho se ha cubierto en este capítulo que es más probable nuevo para el desarrollador promedio. Tenga la
seguridad, sin embargo, que una amplia exploración y la utilización práctica de estos conceptos se harán en los
capítulos siguientes para garantizar una base de conocimientos sólida sobre la que construir sus propias
aplicaciones.
9 Entender Aplicación para Android y Actividad Lifecycles
(Android Studio)
En los capítulos anteriores hemos aprendido que las aplicaciones de Android se ejecutan dentro de los procesos
de la máquina virtual y que se componen de varios componentes en forma de actividades, servicios y receptores
de radiodifusión. El objetivo de este capítulo es ampliar este conocimiento observando el ciclo de vida de
aplicaciones y actividades dentro del sistema de ejecución de Android.
Independientemente de la fanfarria sobre la cantidad de memoria y potencia de cálculo reside en los dispositivos
móviles de hoy en día en comparación con los sistemas de escritorio de ayer, es importante tener en cuenta que
estos dispositivos todavía se consideran "recursos limitados" según las normas de la moderna sistemas de
escritorio y portátiles basados, sobre todo en términos 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 completo 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
comprensión tanto de los modelos de gestión del ciclo de vida de la aplicación y de la actividad de Android, y las
formas en que una aplicación puede reaccionar a los cambios de estado que es probable que se le ha impuesto
durante su curso de la vida ejecución.
Figura 10-1
Proceso de Servicio
Los procesos que contienen un servicio que ya se ha iniciado y está ejecutando actualmente.
Proceso de fondo
Un proceso que contiene una o más actividades que actualmente no están visibles para el usuario, y no aloja un
servicio que califica para Servicio estado del proceso. Los procesos que entran en esta categoría se encuentran
en alto riesgo de extinción en caso de que la memoria adicional necesita ser liberado para procesos de prioridad
superior. Android mantiene una lista dinámica de los procesos de fondo, finalizar procesos en orden cronológico
de tal manera que los procesos que eran los menos recientemente en el primer plano se matan primero.
Proceso de vacío
Procesos vacíos ya no contienen todas las aplicaciones activas y se mantienen en la memoria el momento de
servir como anfitriones para las aplicaciones recién lanzados. Esto es algo análogo a mantener las puertas
abiertas y el motor en marcha en un autobús a la espera de los pasajeros que llegan. Dichos procesos son,
obviamente, considera la prioridad más baja y son los primeros en ser asesinados para liberar recursos.
La Actividad Pila
Para cada aplicación que se ejecuta en un dispositivo Android, el sistema de ejecución mantiene una actividad
Stack. Cuando se inicia una aplicación, la primera de las actividades de la aplicación 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, que se extrae de la pila por el tiempo de ejecución y la actividad
situada inmediatamente debajo de ella en la pila se convierte en la actividad activo actual. Podría, 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 botón "Atrás" en la pantalla para
volver a la actividad anterior, haciendo que la actividad actual para hacer estallar de la pila por el sistema de
ejecución y por lo tanto destruida. Una representación 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 activa actual se encuentra en la parte superior de la pila hasta que se empuja hacia abajo o
bien la pila por una nueva actividad, o se desprendió la pila cuando sale o el usuario navega a la actividad
anterior. En el caso de que los recursos se vuelven restringido, el tiempo de ejecución matará actividades,
empezando por los que están en la parte inferior de la pila.
La Actividad Stack es lo que se conoce en la terminología de programación como-In-First-Out Last (LIFO) pila
en que el último elemento que se inserta en la pila es el primero en hacer estallar apagado.
Actividad Unidos
Una actividad puede estar en uno de un número de diferentes estados durante el curso de su ejecución dentro
de una aplicación:
Activo / Running - La actividad es en la parte superior de la Actividad Pila, es la tarea de primer plano
visible en la pantalla del dispositivo, tiene el foco 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
información de estado y rápidamente se puede restaurar al estado activo cuando se trasladó a la parte
superior de la Actividad Stack.
Stopped - La actividad actualmente no es visible para el usuario (en otras palabras, está totalmente
oscurecido en la pantalla del dispositivo por otras actividades). Al igual que con las actividades en pausa,
se conserva toda la información de estado y miembro, pero está en mayor riesgo de extinción en
situaciones de poca memoria.
Muerto - La actividad ha sido terminado por el sistema de ejecución con el fin de liberar memoria y ya
no está presente en la actividad Stack. Tales actividades deben reiniciarse si es requerido por la aplicación.
Los cambios de configuración
Hasta ahora, en este capítulo, hemos visto dos de las causas para el cambio de estado de una actividad
Android, es decir, el movimiento de una actividad entre el primer plano y el fondo, y la terminación de una
actividad por el sistema de ejecución con el fin de liberar la memoria. De hecho, hay un tercer escenario en el
que el estado de una actividad puede cambiar radicalmente y esto implica un cambio en la configuración del
dispositivo.
Por omisión, cualquier cambio en la configuración que afecta a la apariencia de una actividad (por ejemplo, la
rotación de la orientación del dispositivo entre el retrato y el paisaje, o cambiar una configuración de fuentes del
sistema) harán que la actividad sea destruido y recreado. El razonamiento detrás de esto es que los cambios
afecten a recursos tales como el diseño de la interfaz de usuario y simplemente destruir y volver a crear
actividades impactado es la forma más rápida para una actividad para responder a los cambios de
configuración.
Resumen
Los dispositivos móviles son típicamente considerados como recursos limitados, especialmente en términos 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 (esencialmente las instancias de la máquina virtual
Dalvik). Cada aplicación, a su vez, se compone de los componentes en forma de actividades y servicios.
El sistema de ejecución Android tiene el poder de poner fin a los procesos y actividades individuales con el fin
de liberar memoria. Se toma el estado del proceso en consideración por el sistema de ejecución de la hora de
decidir si un proceso es un candidato adecuado para la terminación. El estado de un proceso depende en gran
medida del estado de las actividades organizadas por ese proceso.
El mensaje clave de este capítulo es que una aplicación se mueve a través de una variedad de estados durante
su vida útil ejecución y tiene muy poco control sobre su destino dentro del entorno de ejecución de
Android. Esos procesos y actividades que no están interactuando directamente con el usuario corren un mayor
riesgo de rescisión por parte del sistema de ejecución. Un elemento esencial del desarrollo de aplicaciones de
Android, por lo tanto, consiste en la capacidad de una aplicación para responder a las notificaciones de cambio
de estado desde el sistema operativo, un tema que se trata en el capítulo siguiente.
actividad de la clase
Con pocas excepciones, las actividades en una aplicación se crean como subclases de cualquiera de la clase
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 Creación de una aplicación para Android Ejemplo en Android Studio. Cargar este proyecto en el entorno
Android Estudio y busque el archivo AndroidSampleActvity.java (ubicado en AndroidSample -> aplicación -> src
-> principal -> Java -> com.ebookfrenzy.androidsample). Después de haber localizado el archivo, haga doble clic
en él para cargarlo en el editor en el que se leerá como sigue:
com.ebookfrenzy.androidsample paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_android_sample);
}
@ Override
public boolean onCreateOptionsMenu (menú Menú) {
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
// Elemento de la barra de acción Mango clic aquí. La barra de acción hará
// Manejar automáticamente los clics en el botón / 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 también para crear una actividad inicial llamado
AndroidSampleActivity. Como es evidente por el código anterior, la clase AndroidSampleActivity se extiende, y
por lo tanto es una subclase de la clase ActionBarActivity.
Una revisión de la documentación de referencia para la clase ActionBarActivity revelaría 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 Jerarquía. Con el archivo AndroidSampleActivity.java cargado en el editor, haga clic en
ActionBarActivity en la línea de declaración de la clase pública y presionar la combinación de teclas Ctrl-H. La
ventana de herramientas jerarquía posteriormente aparecerá mostrando la jerarquía 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:
Figura 11-1
Esto plantea la pregunta de por qué se utiliza en lugar de la clase Actividad ActionBarActivity. La razón de esto
se remonta a las selecciones realizadas cuando el proyecto fue creado por primera vez. Al elegir los objetivos de
la versión SDK para el proyecto en el capítulo titulado Creación de una aplicación Android en Android Ejemplo
de estudio, el proyecto se ha configurado para llegar a un nivel mínimo de SDK API 8: Android 2.2. Desde la
introducción de Android 3.0, sin embargo, las aplicaciones han incluido una vista Barra de acciones en la parte
superior de la pantalla que proporciona opciones de menú y la información al usuario. El propósito 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 hubiéramos especificamos API 11: Android 3.0 o posterior como el SDK mínimo para el
proyecto AndroidSample, sin embargo, la actividad se habría declarado que no habría sido necesaria una
subclase de la clase de actividad en lugar de ActionBarActivity ya la compatibilidad hacia atrás para la Barra de
acciones.
La clase de actividad y sus subclases contienen una serie de métodos que están destinados a ser llamado por el
tiempo de ejecución de Android para notificar una actividad que su estado está cambiando. A los efectos de este
capítulo, nos referiremos a estos como los métodos de la actividad del ciclo de vida. Una clase de actividad
simplemente necesita reemplazar estos métodos e implementar la funcionalidad necesaria dentro de ellos con el
fin de reaccionar en consecuencia a los cambios de estado.
Uno de estos métodos es el nombre onCreate () y, volviéndose una vez más al fragmento de código anterior,
podemos ver que este método ya ha sido anulado y puesto en práctica por nosotros en la clase
AndroidSampleActivity. En una sección posterior exploraremos en detalle tanto onCreate () y los otros métodos
de ciclo de vida pertinentes de la clase de actividad.
La apariencia de la interfaz de usuario (tales como texto introducido en un campo de texto, pero todavía no
comprometida con modelo de datos interno de la aplicación) se conoce como el estado dinámico, ya que está
normalmente sólo conservó durante una única invocación de la aplicación (y también denominado estado de la
interfaz de usuario o la instancia estatal).
Comprender las diferencias entre estos dos estados es importante porque tanto las formas en que se salvan, y
las razones para hacerlo, difieren.
El propósito de salvar el estado persistente es evitar la pérdida de datos que pueden resultar de una actividad
que está siendo asesinado por el sistema de ejecución, mientras que en el fondo. El estado dinámico, por otra
parte, se guarda y restaurado por razones que son ligeramente más complejo.
Consideremos, por el bien de ejemplo, para que una aplicación 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 aplicación, el usuario introduce un texto en el campo de texto y hace una selección de los botones de
radio. Antes de realizar una acción 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. Después de
algún tiempo, el sistema de ejecución comprueba que la memoria es baja y, en consecuencia mata Actividad A
para liberar recursos. En lo que se refiere al usuario, sin embargo, la 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, con bastante razón, esperan que el texto introducido y selecciones de botones 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 dinámico no se ha guardado y restaurado, perdió la entrada del usuario anterior.
El objetivo principal de salvar estado dinámico, por lo tanto, es dar la percepción de conmutación sin fisuras
entre las actividades de primer y segundo plano, independientemente del hecho de que las actividades en
realidad pueden haber sido asesinados y reiniciar sin el conocimiento del usuario.
Los mecanismos de ahorro de estado persistente y dinámico se harán más claras en las siguientes secciones
de este capítulo.
Los métodos de ciclo de vida para Android Actividad
Como se explicó anteriormente, la clase de actividad contiene una serie de métodos de ciclo de vida que actúan
como controladores de eventos cuando el estado de un cambio de actividad. Los métodos principales
soportados por la clase Actividad Android son los siguientes:
onCreate (Bundle savedInstanceState) - El método que se llama cuando se creó por primera vez la
actividad y el lugar ideal para la mayoría de tareas de inicialización que se realizará. El método se pasa un
argumento en la forma de un objeto de paquete que puede contener información de estado dinámico
(normalmente en relación con el estado de la interfaz de usuario) de una invocación antes de la actividad.
onRestart () - Se llama cuando la actividad está a punto de reiniciar después de haber sido detenido
previamente por el sistema de ejecución.
onStart () - Siempre llamó inmediatamente después de la llamada a los métodos onCreate () o
onRestart (), este método indica que la actividad que se está a punto de llegar a ser visibles para el
usuario. Esta llamada será seguido por una llamada a onResume () si la actividad se mueve 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 el primer plano la
actividad. Esta llamada será seguido por una llamada al método ya sea la onResume () o OnStop ()
dependiendo de si la actividad se mueve hacia atrás al primer plano o se vuelve invisible para el
usuario. Se deben tomar medidas dentro de este método para almacenar todos los datos requeridos por la
persistencia de la actividad (por ejemplo, los datos almacenados a un proveedor de contenido, base de
datos o archivo). Este método también debe garantizar que las tareas intensivas de la CPU como la
animación 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 traslada a la parte
frontal o OnDestroy () si está siendo terminada 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 método de acabado () o debido a que el tiempo de ejecución está
terminando ya sea para liberar memoria o debido a un cambio de configuración (como el orientación del
cambio de dispositivo). Es importante tener en cuenta que no siempre se realiza una llamada a OnDestroy
() cuando se termina una actividad.
Además de los métodos de ciclo de vida descritos anteriormente, existen dos métodos destinados
específicamente para guardar y restaurar el estado dinámico de una actividad:
Si no se hace esta llamada superclase en las anulaciones de método dará lugar a la ejecución lanzar una
excepción durante la ejecución de la actividad.Mientras que las llamadas a la súper clase en el
onRestoreInstanceState () y onSaveInstanceState () son opcionales existen considerables beneficios al hacerlo,
un tema que se tratará en el capítulo titulado Cómo 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 través del
cual una actividad pasará durante la ejecución:
Todo el curso de la vida - El término "toda la vida" se utiliza para describir todo lo que ocurre dentro
de una actividad entre la llamada inicial al método onCreate () y el llamado a OnDestroy () antes de la
terminación de la actividad.
Lifetime Visible - Cubre los períodos de ejecución de una actividad entre la llamada a onStart () y
OnStop (). Durante este período 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 períodos de ejecución entre llamadas al onResume () y
onPause () métodos.
Es importante señalar que una actividad puede pasar a través del primer plano y visibles vidas varias veces
durante el transcurso de toda la vida útil.
Los conceptos de vidas y los métodos de ciclo de vida se ilustran en la Figura 11-2:
Figura 11-2
Resumen
Todas las actividades se derivan de la clase Actividad Android que, a su vez, contiene una serie de métodos de
evento que están diseñados para ser llamado por el sistema de tiempo de ejecución cuando el estado de un
cambio de actividad. Por imperiosas de estos métodos, una actividad puede responder a los cambios de estado
y, en su caso, adoptar las medidas necesarias para salvar y restaurar el estado actual de la actividad y la
aplicación. 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 aplicación (por ejemplo, a un archivo o base de
datos). Estado dinámico, por otra parte, se refiere en cambio a la aparición actual de la interfaz de usuario.
En este capítulo, hemos destacado los métodos de ciclo de vida a disposición de las actividades y se cubre el
concepto de vida útil de actividad. En el siguiente capítulo, titulado Actividad Android Estado Cambios - Un
ejemplo de aplicación, vamos a implementar una aplicación de ejemplo que pone gran parte de esta teoría a la
práctica.
12 Android Actividad Estado Cambios - Ejemplo Estudio
Android
Los capítulos anteriores han discutido con cierto detalle los diferentes estados y ciclos de vida de las actividades
que componen una aplicación para Android.En este capítulo, vamos a poner la teoría de la manipulación de los
cambios de estado de actividad en práctica a través de la creación de una aplicación de ejemplo. El propósito de
este ejemplo de aplicación es el de proporcionar una demostración real mundo de una actividad a medida que
pasa a través de una variedad de diferentes estados en el tiempo de ejecución Android.
En el siguiente capítulo, titulado Cómo guardar y restaurar la actividad del Estado en Android estudio , el
proyecto de ejemplo construido en este capítulo se extenderán a demostrar el ahorro y la restauración del
estado de actividad dinámica.
Figura 12-1
La siguiente acción a tomar consiste en el diseño de la interfaz de usuario para la actividad. Este se almacena
en un archivo denominado activity_state_change.xml. Una forma de acceder a este fichero es la de navegar
hacia él en la ventana de herramientas del proyecto en el que se puede encontrar en el StateChange -> src ->
res -> carpeta de presentación. Una vez localizado, haga doble clic en el archivo se cargará en la herramienta
Android Studio Designer. Una opción más rápida, sin embargo, es utilizar el acceso directo Ir al editor de
declaraciones, cuyo propósito es que lo llevarán directamente al archivo y la ubicación en la que se declaró el
elemento seleccionado en la ventana del editor.
En este caso, la disposición activity_state_change se hace referencia en el método onCreate () de la Actividad:
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_state_change);
}
Para abrir el archivo en el Diseñador, haga clic en la referencia activity_state_change para que se resalte y
pulse la secuencia de atajo de teclado Ctrl-B.Android Studio abra el archivo activity_state_change.xml en la
herramienta Diseñador listo para el trabajo de diseño para comenzar.
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 configuración 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 serán introducidos por el usuario. Por ejemplo, si el tipo de entrada está establecido en el
teléfono, el usuario será restringido a entrar dígitos numéricos en la vista. Alternativamente, si el tipo de entrada
está establecido en TextCapCharacters, la entrada será por defecto caracteres en mayúsculas. La configuración
del tipo de entrada también se pueden combinar.
A los efectos de este ejemplo, vamos a establecer el tipo de entrada para apoyar la introducción de texto en
general. Para ello, haga clic en el icono de la bombilla seguida de la derecha frente a la flecha al final del
mensaje que describe el problema. En la lista de posibles soluciones (Figura 12-3) haga clic en la opción
Agregar atributo InputType:
Figura 12-3
Desde el diálogo Establecer valor de atributo resultante, seleccione la opción de texto desde el menú
desplegable.
El paso final en el proceso de diseño de la interfaz de usuario es aumentar la anchura del componente
TextView. Con el componente seleccionado en el diseño, desplácese 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:
Figura 12-4
com.ebookfrenzy.statechange paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_state_change);
}
@ Override
public boolean onCreateOptionsMenu (menú Menú) {
Hasta ahora el único método de ciclo de vida se reemplaza por la actividad es el método onCreate (), que se ha
implementado para llamar la instancia superclase del método antes de configurar la interfaz de usuario para la
actividad. Ahora modificaremos este método de forma que produzca un mensaje de diagnóstico en el panel
Android Estudio LogCat cada vez que se ejecuta. Para ello, vamos a utilizar la clase Log, que 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 importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.util.Log importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_state_change);
Log.i (TAG, "onCreate");
}
@ Override
public boolean onCreateOptionsMenu (menú Menú) {
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
// Elemento de la barra de acción Mango clic aquí. La barra de acción hará
// Manejar automáticamente los clics en el botón / 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);
}
La siguiente tarea es reemplazar algunos más métodos, cada uno que contiene una llamada de registro
correspondiente. Estos métodos de reemplazo pueden añadir manualmente o generados utilizando el Alt-Insert
atajo de teclado como se indica en el capítulo titulado Los fundamentos de la Android Estudio Editor de
código. Tenga en cuenta que el registro de llamadas todavía tendrá que agregar manualmente si los métodos se
generan automáticamente:
@ 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 () {
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");
}
En el cuadro de diálogo Nuevo filtro Logcat Crear (Figura 12-6), el nombre del ciclo de vida del filtro y, en el
campo por Tag Log (regex), introduzca el valor declarado en la etiqueta StateChangeActivity.java (en el ejemplo
de código anterior era com.ebookfrenzy .StateChange pero pueden haber cambiado esto para reflejar la URL de
su empresa).
Figura 12-6
Al completar los cambios, haga clic en el botón Aceptar para crear el filtro y cerrar el diálogo. En vez de
enumerar Sin filtros, el filtro recién creado ahora debe ser seleccionado en la ventana de herramientas Android.
Ejecutar la aplicación
Para obtener resultados óptimos, la aplicación debe ejecutarse en un dispositivo Android física, cuyos detalles
se pueden encontrar en el capítulo titulado Aplicaciones Prueba de Android en un dispositivo Android físico con
ADB. Con el dispositivo configurado y conectado al equipo de desarrollo, haga clic en el botón de ejecución
representado por un triángulo verde ubicado en la barra de herramientas de Android Studio como se muestra en
la Figura 12-7 a continuación, seleccione la opción Ejecutar -> opción Ejecutar ... del menú o utilizar las teclas
Shift + F10 atajo de teclado:
Figura 12-7
Seleccione el dispositivo Android física del Elija diálogo Dispositivo si aparece (suponiendo que todavía no lo ha
configurado para que sea el destino predeterminado). Después de Android Studio ha incorporado la aplicación e
instalado en el dispositivo debe poner en marcha y se ejecuta en segundo plano.
Una revisión del panel LogCat debe indicar que hasta el momento se han activado los métodos (teniendo
cuidado para asegurarse de que se selecciona el filtro del ciclo de vida creado en la sección anterior para filtrar
los eventos de registro que no son actualmente de interés para nosotros):
Figura 12-8
onCreate
onStart
onResume
Claramente, los cambios iniciales estatales son exactamente como se indica en la Figura 9 2. Tenga en cuenta,
sin embargo, que una llamada no fue hecho para onRestoreInstanceState (), ya que el tiempo de ejecución
Android detectó que no había estado para restaurar en esta situación.
Toque en el icono Inicio en la barra de estado inferior de la pantalla del dispositivo y observar la secuencia de
llamadas a métodos reportados en el registro de la siguiente manera:
onPause
onSaveInstanceState
OnStop
En este caso, el tiempo de ejecución se ha dado cuenta de que la actividad ya no está en el primer plano es, no
es visible para el usuario y se ha detenido la actividad, pero no sin dar una oportunidad para que la actividad de
guardar el estado dinámico. Dependiendo de si el tiempo de ejecución en última instancia, destruyó la actividad
o simplemente reinicia ella, la actividad o bien se le notificará que se ha reiniciado a través de una llamada a
onRestart () o pasará a través de la secuencia de creación de nuevo cuando el usuario vuelve a la actividad.
Como se indica en la Comprensión Aplicación para Android y Actividad Ciclos de vida, la destrucción y la
reconstrucción de la actividad pueden ser provocados por hacer un cambio de configuración en el dispositivo,
tales como la rotación de vertical a horizontal. Para ver esto en acción, basta con girar el dispositivo mientras la
aplicación StateChange está en primer plano. Cuando se utiliza el emulador, rotación dispositivo puede ser
simulado utilizando el atajo de teclado Ctrl-F12 o pulsando el número 7 en el teclado teclado mientras Bloq Num
está desactivado. Tenga en cuenta, sin embargo, que la versión actual del emulador falla al manejar la rotación
correctamente. La secuencia resultante de llamadas a métodos en el registro debe ser el siguiente:
onPause
onSaveInstanceState
OnStop
OnDestroy
onCreate
onStart
onRestoreInstanceState
onResume
Es evidente que el sistema de ejecución ha dado la actividad una oportunidad de guardar el estado antes de ser
destruida y reiniciado.
Resumen
El viejo adagio de que una imagen vale más que mil palabras tiene tan cierto para los ejemplos en el
aprendizaje de un nuevo paradigma de programación. En este capítulo, hemos creado un ejemplo de aplicación
de Android para el fin de demostrar los diferentes estados del ciclo de vida a través de las cuales es probable
que pasar una actividad. En el transcurso del desarrollo del proyecto en este capítulo, también se fijó en un
mecanismo para la generación de información de registro de diagnóstico dentro de una actividad.
En el próximo capítulo, vamos a ampliar el proyecto de ejemplo StateChange para demostrar cómo guardar y
restaurar el estado dinámico de una actividad.
onPause
onSaveInstanceState
OnStop
OnDestroy
onCreate
onStart
onRestoreInstanceState
onResume
Es evidente que esto ha resultado en la actividad que está siendo destruido y re-creado. Una revisión de la
interfaz de usuario de la aplicación en ejecución, sin embargo, debe demostrar que el texto introducido en el
campo EditarTexto se ha conservado. Dado que la actividad fue destruido y reconstruido, y que no añadimos
ningún código específico para asegurarse de que el texto se guarda y se restaura, este comportamiento requiere
una explicación.
En realidad la mayoría de los widgets de vista incluidas en el SDK de Android ya implementan el
comportamiento necesario para guardar automáticamente y restaurar el estado cuando se reinicia una
actividad. El único requisito para habilitar este comportamiento es que el onSaveInstanceState () y
onRestoreInstanceState () métodos de reemplazo en la actividad para incluir las llamadas a los métodos
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 automático de estado para una vista de la interfaz de usuario se puede desactivar en el archivo de
diseño XML estableciendo el androide: propiedad saveEnabled false. A los efectos de un ejemplo, vamos a
desactivar el mecanismo automático de ahorro de estado para la vista EditarTexto en el diseño de la interfaz de
usuario y luego agregar el código en la aplicación 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 de la vista es el 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"
android: layout_height = "wrap_content"
android: id = "@ + / Identificación del EDITTEXT"
android: saveEnabled = "false"
android: InputType = "text"
android: layout_centerVertical = "true"
android: layout_centerHorizontal = "true"
android: width = "200dp" />
Después de hacer el cambio, ejecute la aplicación, 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 más allá de la funcionalidad por defecto
proporcionado 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 aplicación del conjunto de los
métodos definidos en la interfaz parcelable (cuyos detalles se pueden encontrar en la documentación de Android
enhttp://developer.android.com/reference/android/os/Parcelable.html ).
La clase Bundle también contiene un conjunto de métodos que se pueden utilizar para obtener y definir pares
clave-valor para una variedad de tipos de datos que incluye los dos tipos primitivos (como los operadores
booleanos, char, doble y valores flotantes) y objetos (como cadenas y CharSequences ).
A los efectos de este ejemplo, y después de haber desactivado el guardado automático 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 demostración de cómo guardar
manualmente y restaurar el estado dentro de una aplicación para Android y se logrará mediante el
putCharSequence () y getCharSequence () de la clase Bundle respectivamente.
Guardar el Estado
El primer paso para extender la aplicación StateChange es asegurarse de que el texto introducido por el usuario
se extrae del componente EditarTexto dentro del método 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 código Java para la actividad (que figura en el
archivo de código fuente StateChangeActivity.java) y la representación XML de la interfaz de usuario (incluido 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 acceder a dicho objeto de interfaz de usuario.
Cada componente dentro de una interfaz de usuario está asociada con un identificador único. De forma
predeterminada, la herramienta Diseñador construye el ID de un componente recién añadida por el tipo de
objeto. Si más de una vista del mismo tipo está contenida en la disposición el nombre del tipo es seguido de un
número secuencial (aunque esto puede, y debe, ser cambiado a algo más significativo por el promotor). Como
puede verse por el control del panel de componentes dentro de la ventana principal de Android Studio cuando
se selecciona el archivo activity_state_change.xml y la herramienta Diseñador mostrada, el componente
EditarTexto se ha asignado el ID EDITTEXT:
Figura 13-1
Como se indica en el capítulo titulado La Anatomía de una aplicación Android, todos los recursos que componen
una aplicación se compilan en una clase denominada R. Entre esos recursos son los que definen los diseños,
incluyendo el diseño de nuestra actividad actual. Dentro de la clase R es una subclase llamada diseño, que
contiene los recursos de diseño, y dentro de esa subclase es nuestro diseño activity_state_change. Con este
conocimiento, podemos hacer una llamada al método findViewById () de nuestra actividad objeto de obtener una
referencia al objeto EDITTEXT de la siguiente manera:
Después de haber obtenido una referencia al objeto EditarTexto y asignado a TextBox, ahora podemos obtener
el texto que contiene llamando al método del objeto getText (), que, a su vez, devuelve el texto actual en la
forma de un objeto CharSequence:
Por último, podemos guardar el texto utilizando el método del objeto Bundle putCharSequence (), pasando por la
llave (esto puede ser cualquier valor de cadena, pero en este caso, la declararemos como "savedText") y el
objeto usertext como argumentos:
com.ebookfrenzy.statechange paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.util.Log importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.widget.EditText importación;
Ahora que se han tomado medidas para salvar el estado, la siguiente fase es asegurar que se restaura cuando
sea necesario.
@ Override
protected void onRestoreInstanceState (Bundle savedInstanceState) {
super.onRestoreInstanceState (savedInstanceState);
Log.i (TAG, "onRestoreInstanceState");
CharSequence usertext =
savedInstanceState.getCharSequence ("savedText");
textBox.setText (usertext);
}
Prueba de la aplicación
Todo lo que queda es una vez más para generar y ejecutar la aplicación StateChange. Una vez que se ejecuta y
en primer plano, toque el componente EditarTexto e introduzca algún texto antes de girar el dispositivo a otra
orientación. Mientras que se perdieron previamente el texto cambia, el nuevo texto se mantiene dentro de los
componentes EDITTEXT gracias al código que hemos añadido a la actividad en este capítulo.
Resumen
El ahorro y la restauración del estado dinámico de una aplicación para Android es simplemente una cuestión de
aplicación del código apropiado en los métodos de ciclo de vida adecuadas. Para la mayoría de los puntos de
vista de la interfaz de usuario, esto se maneja de forma automática por la súper clase de actividad. En otros
casos, esto normalmente consiste en extraer los valores y ajustes en el método onSaveInstanceState () y
guardar los datos como pares de valores clave dentro del objeto Bundle pasado a través de la actividad por
parte del sistema de ejecución.
Estado se puede restaurar ya sea en el onCreate () o la onRestoreInstanceState () de la actividad de extracción
de valores desde el objeto Bundle y la actualización de la actividad basándose en los valores almacenados.
En este capítulo, hemos utilizado estas técnicas para actualizar el proyecto StateChange de modo que la
actividad conserva cambios a través de la destrucción y posterior reconstrucción de una actividad.
14 Entendiendo Vistas Android, Ver grupos y diseños en
Android Estudio
Con la posible excepción de escuchar el streaming de audio, la interacción de un usuario con un dispositivo
Android es principalmente visual y táctil en la naturaleza. Toda esta interacción se lleva a cabo a través de las
interfaces de usuario de las aplicaciones instaladas en el dispositivo, incluyendo tanto las aplicaciones
integradas y aplicaciones de terceros instaladas por el usuario. No debería ser ninguna sorpresa, por lo tanto,
que un elemento clave de desarrollo de aplicaciones para Android implica el diseño y creación de interfaces de
usuario.
Dentro de este capítulo, el tema de la estructura de la interfaz de usuario de Android será cubierta, junto con una
visión general de los diferentes elementos que se pueden juntar para hacer una interfaz de usuario; a saber,
Vistas, Ver grupos y diseños.
LinearLayout - Posiciones niño vistas en una sola fila o columna en función de la orientación
seleccionada. Un valor de peso se puede establecer en cada niño para especificar la cantidad de espacio
de la disposición de que los niños deben ocupar en relación con otros niños.
TableLayout - Organiza visitas del niño en un formato de cuadrícula de filas y columnas. Cada fila
dentro de una tabla está representado por un niño objeto TableRow, que, a su vez, contiene un objeto de
vista para cada célula.
La vista Jerarquía
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 rectángulo y para responder a los acontecimientos que se producen en la parte de
la pantalla (como un evento de contacto).
Una pantalla de interfaz de usuario se compone de una jerarquía de vistas con una vista raíz colocado en la
parte superior de las vistas de árbol y el niño posicionado en las ramas de abajo. El hijo de una vista de
contenedor aparece en la parte superior de la vista padre y se ve obligado a aparecer dentro de los límites del
área de visualización de la vista padre. Consideremos, por ejemplo, la interfaz de usuario ilustrada en la Figura
14-1:
Figura 14-1
Además de las vistas visibles los botones y casillas de verificación, la interfaz de usuario realmente incluye una
serie de puntos de vista de diseño que controlan cómo se posicionan las vistas visibles. Figura 14-2 muestra
una visión alternativa de la interfaz de usuario, esta vez destacando la presencia de las vistas de presentación
en relación con los puntos de vista del niño:
Figura 14-2
Como se discutió anteriormente, las interfaces de usuario están construidas en forma de una jerarquía de vistas
con una vista de la raíz en la parte superior.Siendo este el caso, también puede visualizar el ejemplo de interfaz
de usuario de arriba en forma de árbol vista ilustrada en la Figura 14-3:
Figura 14-3
El diagrama de vista de jerarquía da probablemente la visión general más clara de la relación entre las distintas
vistas que conforman la interfaz de usuario se muestra en la Figura 14-1. Cuando se muestra una interfaz de
usuario para el usuario, el tiempo de ejecución Android camina por la jerarquía de la vista, a partir de la opinión
de la raíz y de trabajo por el árbol, ya que hace que cada vista.
Con mucho, el mecanismo más fácil y más productivo para el diseño de una interfaz de usuario para una
aplicación de Android es hacer uso de la herramienta Android Studio Designer. El objetivo de este capítulo es
proporcionar una visión general de cómo crear una interfaz de usuario utilizando esta herramienta. El ejercicio
se incluye en este capítulo también se utilizará como una oportunidad para perfilar la creación de una actividad a
partir de un "escueto" proyecto Android Studio.
Después de haber cubierto el uso del Diseñador Android de estudio, el capítulo también se ofrecerá una visión
general de los conceptos detrás de los archivos de recursos de diseño de edición de XML escrito manualmente
y antes de la introducción de la herramienta Visor de Jerarquía.
En el cuadro de diálogo Nueva actividad resultante, el nombre del nuevo LayoutSampleActivity actividad y la
activity_layout_sample diseño.
Para que una aplicación sea capaz de ejecutar en un dispositivo que tiene que tener una actividad designada
como la actividad de lanzamiento. Sin una actividad lanzador, el sistema operativo no sabrá que la actividad se
inicie cuando los primeros lanzamientos de aplicaciones y, como tal, la aplicación no se iniciará. Dado que este
ejemplo sólo tiene una actividad, tiene que ser designado como la actividad lanzador de la aplicación, así que
asegúrate de que la opción Actividad Launcher está seleccionado antes de hacer clic en el botón Finalizar.
En este punto Android Estudio debería haber añadido dos archivos para el proyecto. El archivo de código fuente
de Java para la actividad debe estar ubicado en el LayoutSample -> aplicación -> src -> principal -> Java ->
carpeta com.ebookfrenzy.layoutsample y también debería haber sido precargados en la ventana del editor.
Además, el archivo XML para el diseño de la interfaz de usuario debe haber sido creado en el LayoutSample ->
aplicación -> src -> res - -> carpeta layout> principal.
Por último, se debería haber añadido 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 del proyecto bajo la
LayoutSample -> aplicación -> src -> carpeta principal y debe contener la siguiente XML:
<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">
<Intención de filtro>
<Acción android: name = "android.intent.action.MAIN" />
<Categoría
android: name = "android.intent.category.LAUNCHER" />
</ Intención de filtro>
</ Actividad>
</ Application>
</ Manifiesto>
Figura 16-2
Haga clic en el icono de la bombilla para visualizar el menú de sugerencias y hacer clic en el mensaje que dice:
"Este campo de texto no especifica un InputType o una indirecta" y seleccione Texto como tipo de entrada en el
conjunto de atributos de diálogo. Haga clic en Aceptar para cerrar el diálogo y establecer el atributo.
Ejecutar la aplicación
Todo lo que queda es probar que la aplicación se ejecuta. Haga clic en el botón de ejecución en la barra de
herramientas de la ventana principal. Seleccione el simulador o un dispositivo Android física y esperar a que la
aplicación se inicie. Suponiendo que la ausencia de errores, la aplicación y la actividad deben poner en marcha
y aparecerá exactamente como fue diseñado con la función Designer.
Esta declaración debe ser seguido por el elemento raíz de la disposición, por lo general una visión recipiente tal
como un controlador de distribución. Esto está representado por las dos etiquetas de apertura y cierre y las
propiedades que hay que establecer en la vista. La siguiente XML, por ejemplo, declara una vista RelativeLayout
como el elemento raíz y establece las propiedades match_parent de manera que llene todo el espacio
disponible de la pantalla del dispositivo con el acolchado en cada lado de densidad 64 píxeles independientes:
<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 niño que hay que añadir a los padres RelativeLayout deben estar anidadas dentro de las etiquetas de
apertura y cierre. En el siguiente ejemplo, un botón y un campo EditarTexto se han añadido 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">
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / button_string"
android: id = "@ + / Identificación del botón"
android: layout_centerVertical = "true"
android: layout_centerHorizontal = "true" />
<EditarTexto
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: id = "@ + / Identificación del EDITTEXT"
android: layout_above = "@ + / Identificación del botón"
android: layout_centerHorizontal = "true"
android: layout_marginBottom = "51dp"
android: InputType = "text"
android: width = "350dp" />
</ RelativeLayout>
También tenga en cuenta que los dos puntos de vista del niño tienen una serie de propiedades declaradas. En
el caso de la Vista de botones, se ha asignado "botón" Identificación y configurado para mostrar el texto que se
representa mediante un recurso de cadena denominada button_string. Además, se ha centrado vertical y
horizontalmente dentro de la altura vista padre y wrap_content y propiedades de ancho han sido declaradas de
modo que se dimensiona el botón para acomodar el contenido (en este caso el texto que se muestra en el
botón).
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 botón colocado.
Este archivo XML es, por supuesto, el diseño que se creó utilizando la herramienta de diseño en este
capítulo. Al escribir XML manualmente en lugar de utilizar la herramienta de diseño en el modo de diseño es una
cuestión de preferencia personal. Hay, sin embargo, las ventajas de utilizar el modo de diseño.En primer lugar,
el modo de diseño generalmente será más rápido ya que se evita la necesidad de escribir líneas de
XML. Además, el modo de diseño evita la necesidad de aprender las complejidades de los diferentes valores de
las propiedades de las clases de vista del SDK de Android. En lugar de hacer referencia continuamente a la
documentación de Android para encontrar las palabras clave y los valores correctos, la mayoría de las
propiedades se pueden localizar consultando el panel Propiedades.
Todas las ventajas del modo de diseño a un lado, es importante tener en cuenta que los dos enfoques para el
diseño de interfaces de usuario son de ninguna manera mutuamente excluyentes. Como un desarrollador de
aplicaciones, es muy probable que el resultado final será la creación de interfaces de usuario en el modo de
diseño durante la realización de ajuste y de la disposición retoques del diseño editando directamente los
recursos XML generados. Ambos puntos de vista del diseño de la interfaz son, después de todo, un solo clic del
ratón aparte dentro del entorno Android estudio por lo que es fácil cambiar un lado a otro según sea
necesario. De hecho, un consejo útil para recordar es que la selección de un punto de vista en el diseño de la
pantalla y pulsar la combinación de teclas Ctrl-B saltará automáticamente y poner de relieve el XML para esa
vista en el archivo de recursos.
Figura 16-3
Selección de la ventana muestra el diseño hará que la jerarquía para cargar en el panel de vista de árbol como
se muestra en la Figura 16-4 (tenga en cuenta que puede haber un pequeño retraso entre la selección de la
ventana y el diagrama de jerarquía 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 ratón, en la mayoría 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 dentro del panel de Vista del árbol (Figura 16-
5):
Figura 16-5
Al revisar la vista de árbol, tener en cuenta que se mostrarán algunos puntos de vista, además de las incluidas
en el diseño de actividades. Estos son los puntos de vista y diseños que, por ejemplo, muestran la barra de
acción en la parte superior de la pantalla y proporcionan un área para la actividad que se mostrará.
Selección de un nodo en la vista de árbol hará que el elemento correspondiente en la representación de interfaz
de usuario que se resalta en rojo en la vista de diseño. En la figura 16-6 la vista RelativeLayout está
seleccionado actualmente:
Figura 16-6
Del mismo modo, la selección de vistas desde la vista de diseño hará que el nodo correspondiente en la vista de
árbol para resaltar y mover a la vista.
Más información sobre un punto de vista puede ser obtenida mediante la selección del nodo dentro de la vista
de árbol. Un panel entonces emergente junto al nodo y puede ser destituido mediante la realización de un clic
derecho en el nodo. Al hacer doble clic en un nodo mostrará un cuadro de diálogo que contiene una
representación de cómo aparece la vista dentro de la interfaz de usuario de la aplicación. Figura 16-7, por
ejemplo, muestra el botón de la aplicación LayoutSample:
Figura 16-7
Las opciones también están disponibles dentro de la herramienta para llevar a cabo tareas como la invalidación
de una vista de diseño seleccionado (por lo tanto lo que obligó a volver a dibujar) y para salvar la vista de árbol
como una imagen PNG file.The espectador jerarquía también se puede utilizar para mostrar información sobre la
velocidad con la que el niño vistas de un nodo seleccionado se prestan cuando se crea la interfaz de
usuario. Para mostrar esta información de rendimiento, seleccione el nodo de actuar como la vista de la raíz y
haga clic en el botón 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 categoría (medida, diseño y dibujar) con rojo indicando un rendimiento
más lento para la vista en relación con otros puntos de vista en la actividad. Vistas de contenedores con mayor
número de visitas de niños pueden mostrar el estado rojo, simplemente porque el punto de vista tiene que
esperar a que cada niño va a representar. Esto no es necesariamente una indicación de un problema de
rendimiento con esa opinión.
Figura 16-8
Resumen
La herramienta Android Studio Designer proporciona un método visual intuitiva para el diseño de interfaces de
usuario. El uso de un paradigma de arrastrar y soltar en combinación con un conjunto de editores de
propiedades, la herramienta proporciona considerables beneficios de productividad a los desarrolladores de
aplicaciones.
Diseños de interfaz de usuario también pueden ser implementadas por escribir manualmente los archivos de
recursos de diseño XML, cuyo formato está bien estructurado y de fácil comprensión.
El hecho de que la herramienta Designer genera archivos de recursos XML significa que estos dos enfoques de
diseño de la interfaz se pueden combinar para proporcionar una "mejor de ambos mundos" enfoque para el
desarrollo de interfaces de usuario.
Por último, una descripción detallada de la vista de árbol para una actividad y una indicación de la actuación de
cada vista dentro de esa actividad se pueden obtener utilizando la herramienta Visor de Jerarquía.
16 Creación de una interfaz de usuario de Android en el
Código Java utilizando Android Estudio
Hasta este punto en el libro, todas las tareas de diseño de interfaz de usuario se han realizado utilizando la
herramienta Android Studio Designer, ya sea en texto o en modo de diseño. Una alternativa a la escritura de
archivos de recursos XML o el uso de Android Studio Designer es escribir código 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 capítulo, vamos a explorar algunas de las ventajas y desventajas de escribir código Java para
crear una interfaz de usuario antes de describir algunos de los conceptos clave, como las propiedades de vista,
los parámetros de diseño y las reglas. Por último, un proyecto de ejemplo se creará y se utiliza para demostrar
algunos de los pasos típicos en este enfoque de la creación de interfaces de usuario de Android.
Creación de vistas
Según lo establecido anteriormente, el SDK de Android incluye una caja de herramientas de vista clases
diseñadas para satisfacer la mayoría de las necesidades básicas de diseño de interfaz de usuario. La creación
de una vista en Java es simplemente una cuestión de crear instancias de estas clases, pasando a través de
como argumento una referencia a la actividad con la que este punto de vista es que se asocia.
La primera vista (normalmente una vista contenedor al que vistas adicionales del niño pueden ser añadidos) se
muestra al usuario a través de una llamada al método setContentView () de la actividad. Vistas adicionales
pueden ser agregados a la vista de la raíz a través de llamadas a método del objeto addView ().
Cuando se trabaja con código Java para manipular opiniones contenidas en archivos de recursos de diseño de
XML, es necesario para obtener el identificador de la vista. La misma regla vale para las vistas creadas en
Java. Como tal, es necesario asignar una identificación a cualquier vista para la que se necesitarán
determinados tipos de acceso en posteriores código Java. Esto se logra a través de una llamada al método setId
() del objeto de vista de que se trate. En el código más tarde, el ID de un punto de vista puede ser obtenido a
través de una llamada posterior al método del objeto getId ().
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_java_layout);
}
La siguiente modificación en el método onCreate () es escribir algo de código Java para agregar un objeto
RelativeLayout con una sola vista Botón niño a la actividad. Esto implica la creación de nuevas instancias de las
clases RelativeLayout y Button. Necesita entonces el botón Vista que se añade como un niño a la vista
RelativeLayout que, a su vez, se muestra a través de una llamada al método setContentView () de la instancia
de actividad:
com.ebookfrenzy.javalayout paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.widget.Button importación;
android.widget.RelativeLayout importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
Botón 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 aplicación (ya sea en un dispositivo
físico o un emulador). Una vez puesto en marcha, el resultado visible será un botón que no contiene ningún
texto que aparece en la esquina superior izquierda de la vista RelativeLayout como se muestra en la Figura 17-
1:
Figura 17-1
Configuración de propiedades de la vista
A los efectos de este ejercicio, necesitamos que el fondo de la vista RelativeLayout a ser azul y la vista del botón
para mostrar el texto que lee "prensa me".Ambas tareas se puede lograr mediante el establecimiento de
propiedades en las vistas en el código Java como se indica en el siguiente fragmento de código:
com.ebookfrenzy.javalayout paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.widget.Button importación;
android.widget.RelativeLayout importación;
android.graphics.Color importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
Botón myButton = new Button (this);
myButton.setText ("Presione Me");
myButton.setBackgroundColor (Color.YELLOW);
myLayout.addView (myButton);
setContentView (myLayout);
}
.
.
.
}
Cuando la aplicación está ahora compila y ejecuta, la distribución reflejará la configuración de propiedades de
manera que el diseño aparecerá con un fondo azul y el botón se mostrará el texto asignado en un fondo
amarillo.
RelativeLayout.LayoutParams buttonParams =
nuevos RelativeLayout.LayoutParams (
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
El código anterior crea un nuevo RelativeLayout LayoutParams objetos nombrados buttonParams y establece la
altura y la anchura tal que el botón sólo será lo suficientemente grande para mostrar la "prensa me" texto
configurado previamente a través de la configuración de la propiedad.
Ahora que el objeto LayoutParams ha sido creado, el siguiente paso es añadir algunas reglas adicionales a los
parámetros para instruir a los padres disposición para centrar el botón vertical y horizontalmente. Esto se logra
mediante una llamada al método addRule () del objeto buttonParams, pasando por los valores apropiados como
argumentos:
buttonParams.addRule (RelativeLayout.CENTER_HORIZONTAL);
buttonParams.addRule (RelativeLayout.CENTER_VERTICAL);
Simplemente creando un objeto nuevo LayoutParams y configuración sólo es útil si ese objeto se le asigna a la
vista de los niños. Una forma de lograr esto es pasar los LayoutParams objeto a través como argumento cuando
se añade el punto de vista del niño a los padres:
Alternativamente, los parámetros se pueden asignar al niño a través de una llamada al método de la vista
setLayoutParams ():
myButton.setLayoutParams (buttonParams);
La combinación de estos resultados juntos en un método onCreate modificado () que dice lo siguiente:
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
Botón myButton = new Button (this);
myButton.setText ("Press me");
myButton.setBackgroundColor (Color.YELLOW);
RelativeLayout.LayoutParams buttonParams =
nuevos RelativeLayout.LayoutParams (
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
buttonParams.addRule (RelativeLayout.CENTER_HORIZONTAL);
buttonParams.addRule (RelativeLayout.CENTER_VERTICAL);
Después de haber hecho los cambios mencionados, compilar y ejecutar la aplicación, una vez más, esta vez
señalando que el botón 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 comprensión más clara de los ajustes de altura y parámetros diseño de ancho,
modificar temporalmente el código de creación buttonParams de la siguiente manera, a continuación, volver a
compilar y ejecutar la aplicación:
RelativeLayout.LayoutParams buttonParams =
nuevos RelativeLayout.LayoutParams (
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
Con la altura y parámetros de ancho establecidos para MATCH_PARENT, el botón está dimensionada para que
coincida con la opinión de los padres y, en consecuencia llena toda la pantalla.
Antes de continuar, revertir la configuración de alto y ancho para WRAP_CONTENT.
com.ebookfrenzy.javalayout paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.widget.Button importación;
android.widget.RelativeLayout importación;
android.graphics.Color importación;
android.widget.EditText importación;
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);
buttonParams.addRule (RelativeLayout.CENTER_HORIZONTAL);
buttonParams.addRule (RelativeLayout.CENTER_VERTICAL);
Una prueba de funcionamiento de la aplicación debe mostrar el campo EditarTexto centrado sobre el botón con
un margen de 80 píxeles.
com.ebookfrenzy.javalayout paquete;
android.app.Activity importación;
android.os.Bundle importación;
android.widget.RelativeLayout importación;
android.widget.Button importación;
android.widget.RelativeLayout importación;
android.graphics.Color importación;
android.widget.EditText importación;
android.content.res.Resources de importación;
android.util.TypedValue importación;
@ Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
myButton.setId (1);
myEditText.setId (2);
RelativeLayout.LayoutParams buttonParams =
nuevos RelativeLayout.LayoutParams (
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);
myEditText.setWidth (px);
Compile y ejecute la aplicación una vez más y tenga en cuenta que el ancho de la vista EditarTexto ha
cambiado como se ilustra en la Figura 17-3:
Figura 17-3
Resumen
Como alternativa a la escritura de archivos de recursos de diseño XML o utilizando la herramienta Android
Studio Designer, interfaces de usuario de Android también se pueden crear de forma dinámica en código
Java. Creación de diseños en código Java consiste en crear instancias de clases de vista y configuración de
propiedades de los objetos para definir la apariencia y el comportamiento requerido.
¿Cómo se coloca un punto de vista y de tamaño con respecto a la vista padre y cualquier vistas hermano se
define mediante los parámetros de diseño, que se almacenan en objetos LayoutParams. Una vez que un objeto
LayoutParams ha sido creado e inicializado con la altura y el ancho de las opciones de comportamiento,
entonces se pueden añadir reglas adicionales para configurar los parámetros más.
La actividad ejemplo creado en este capítulo ha sido, por supuesto, creado de la misma interfaz de usuario (el
cambio en el color de fondo a pesar) como el creado en el capítulo anterior utilizando las herramientas y los
recursos XML gráfica de diseño. Por lo menos, este capítulo debería haber proporcionado una apreciación del
nivel al que la herramienta Diseñador y XML recursos Android Studio protegen el promotor de muchas de las
complejidades de la creación de diseños 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
más útil, por ejemplo, cuando la creación de diseños de interfaz de usuario dinámicas.
Un controlador de distribución ú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 niño para ser dispuestos en un diseño de
cuadrícula. Hay un número de maneras de implementar el GridLayout dentro de la interfaz de usuario de una
aplicación Android, incluso mediante el uso de los recursos de diseño y código Java. Quizás el método más
sencillo, sin embargo, es hacer uso de algunas características específicas GridLayout integradas en la
herramienta Android Studio Designer.
En este capítulo se presentarán los conceptos básicos de la clase GridLayout antes de explorar la creación de
una interfaz de usuario basada en GridLayout usando Android Studio Designer. Creando directamente
GridLayout diseños de interfaz de usuario que utilizan los recursos de diseño de XML como una alternativa al
uso de la herramienta Diseñador serán cubiertos en el siguiente capítulo, titulado Trabajar con el GridLayout
Android usando XML Recursos de diseño.
El GridLayout Ejemplo
Dada la naturaleza visual tanto de la clase GridLayout y la herramienta Android Studio Designer, la mejor
manera de obtener un nivel de familiaridad con los conceptos involucrados es trabajar a través de un ejemplo. El
resto de este capítulo, por lo tanto, va a crear una aplicación de ejemplo que muestra algunas de las
características clave de la clase GridLayout en el contexto de la herramienta Diseñador.
A los efectos de este tutorial, el GridLayout sólo está obligado a ser lo suficientemente grande para dar cabida a
las opiniones del niño en él contenidas. Como tal, los parámetros 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 Diseñador. Una opción más rápida es seleccionar la
instancia GridLayout y utilice los dos botones en la barra de herramientas Diseñador. Establezca la propiedad
anchura haciendo clic en el botón de ancho de la disposición como se destaca en la Figura 18-2:
Figura 18-2
Después de haber establecido la propiedad width de wrap_content, haga clic en el botón de la barra adyacente,
para seleccionar de manera similar la propiedad layout_height. Estos ajustes tendrán el efecto de reducir la
disposición a una pequeña plaza listo para dar cabida a algunos puntos de vista del niño.
Como es evidente a partir del mensaje mostrado por la herramienta, la liberación 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 botón se coloca en la célula como se muestra en la Figura 18-4:
Figura 18-4
Tenga en cuenta también que las barras verdes han aparecido en los márgenes en los lados superior y derecho
de la zona principal de Designer. Estas barras representan las filas y columnas presentes en el GridLayout
(actualmente el diseño tiene una fila y una columna). Como es evidente de la Figura 18-4 arriba, sin embargo,
estas barras no se alinean con el botón contenida en el GridLayout. Esto es debido a que el diseño de la
pantalla del dispositivo esté visible el marco gráfico dispositivo que está empujando el diseño fuera de alineación
con las barras verdes. Para resolver este problema, seleccione la opción de menú de configuración en la barra
de herramientas de diseño (representado por el icono de engranaje reductor) y apague los marcos de dispositivo
incluye la opción (disponible si). Sin el bastidor del dispositivo visibles las barras de fila y columna se alinearán
con el controlador de distribución, como se muestra en la Figura 18-5:
Figura 18-5
Repetir los pasos anteriores para colocar un segundo botón en el GridLayout de modo que se posiciona en la
fila cero y después de la columna 0 tal que aparece inmediatamente a la derecha de la primera botón.
Arrastre un tercer punto de vista del botón a una posición a la izquierda de la primera vista del botón hasta que
el mensaje que se muestra en la Figura 18-6 parece ofrecer la opción de cambiar la columna 0 derecha e inserte
la nueva vista en la célula en 0,0:
Figura 18-6
Cuando la vista se coloca en esta posición, las columnas existentes se desplazarán un lugar hacia la derecha,
se insertará una nueva columna en el borde izquierdo de la GridLayout y el nuevo botón colocado en la célula.
Siguiendo la misma secuencia de pasos, añadir una vista botón en la segunda fila de la parrilla colocada
después de la fila 0 en la columna 0 de modo que el diseño se asemeja a la de la Figura 18-7:
Figura 18-7
A continuación, seleccione la única vista Button en la segunda fila, esta vez cambiando el diseño
correspondiente: valor ColumnSpan en el panel Propiedades para 2.
Estos dos puntos de vista están configurados para abarcar varias células. Una revisión de la lona de la
disposición, sin embargo, muestra que las opiniones se han mantenido el mismo tamaño, aunque las células en
las que residen ahora abarcan varias filas o columnas. La razón de esto es que la configuración de gravedad
para estas vistas necesitan ser cambiados.
Figura 18-9
Habiendo establecido esta propiedad, la vista Button ahora estará centrado verticalmente entre las dos células:
Figura 18-11
Una opción alternativa a la de centrado es para la vista del niño para llenar el espacio disponible. Para lograr
esto, cambie el ajuste de relleno del trazado: la propiedad gravedad para fill_vertical. Es importante señalar que
las diferentes categorías 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 se puede verificar haciendo referencia a la disposición: línea de gravedad en el panel
Propiedades como se indica en la Figura 18-12:
Figura 18-12
Desde la propiedad center_vertical ya no es necesario, apáguelo bajar por el menú propiedad del centro (Figura
18-13) y seleccionando el <unset> opción:
Figura 18-13
Añadir una propiedad gravedad para el botón de la segunda fila, esta vez permitiendo el ajuste de la gravedad
fill_horizontal. Después de cambiar las banderas de gravedad, los dos botones deberían haber ampliado para
rellenar las celdas abarcado:
Figura 18-14
Resumen
La clase GridLayout permite vistas a ser dispuestos en un diseño de cuadrícula, donde una o más vistas están
contenidas dentro de las cuadrículas. Cada niño puede ser configurado para abarcar varias células tanto
horizontal como verticalmente. El comportamiento de la posición y el tamaño de una vista de niño dentro de una
celda o rango de celdas se controla a través de la configuración de los valores de gravedad.
GridLayouts podrán ser ejecutadas bien mediante el Diseñador de Android Estudio en modo de diseño, o
mediante el uso de código Java o recursos de diseño XML. En este capítulo se ha cubierto el enfoque de modo
de diseño. El siguiente capítulo se analizará el uso de los recursos de diseño XML para implementar
configuraciones GridLayout.
18 Trabajar con el GridLayout Android usando Recursos
Disposición XML
En el capítulo anterior (titulado Uso del Administrador de Android GridLayout en Android Studio Designer)
introdujo los conceptos básicos de la gerente Android GridLayout antes de explicar cómo crear un diseño de
interfaz de usuario basada GridLayout utilizando el modo de diseño de la herramienta Android Studio
Designer. Visualmente el diseño de una interfaz de usuario basada en GridLayout no es, sin embargo, el único
método disponible de trabajar con la clase GridLayout. Estos diseños también pueden implementarse
escribiendo directamente el código de Java o de forma manual la creación de elementos en un archivo de
formato XML, el último de los cuales es el tema de este capítulo.
</ GridLayout>
La sintaxis XML anterior se aplica cuando el GridLayout es el elemento raíz de un diseño de interfaz de usuario
(es decir, el diseño superior más importantes en la jerarquía de la vista). En situaciones en las que el GridLayout
está anidado como un hijo de otro recipiente los cambios de sintaxis ligeramente. El siguiente XML, por ejemplo,
muestra un ejemplo GridLayout incrustado en un gestor de RelativeLayout donde el RelativeLayout es el
elemento raíz de la interfaz de usuario:
<GridLayout
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_alignParentTop = "true"
android: layout_alignParentLeft = "true"
android: layout_alignParentStart = "true"
android: orientación = "vertical">
</ GridLayout>
</ RelativeLayout>
El número de filas y columnas dentro de la red puede ser declarada usando el androide: rowCount y android:
columnCount propiedades. Típicamente, sin embargo, si se declara el número de columnas de la GridLayout
inferirá el número de filas basado en el número de celdas ocupadas haciendo el uso de la propiedad rowCount
innecesario.
Del mismo modo, la orientación de la GridLayout opcionalmente se puede definir a través de la androide: la
propiedad de orientación. El siguiente ejemplo XML declara una configuración de 2 x 2 GridLayout en
orientación horizontal:
</ GridLayout>
<Botón
android: id = "@ + / Identificación del botón 1"
android: layout_gravity = "left | top"
android: text = "Button" />
<Botón
android: id = "@ + / Identificación del button2"
android: layout_gravity = "left | top"
android: text = "Button" />
<Botón
android: id = "@ + / Identificación del button3"
android: layout_gravity = "left | top"
android: text = "Button" />
<Botón
android: id = "@ + / Identificación del button4"
android: layout_gravity = "left | top"
android: text = "Button" />
</ GridLayout>
Figura 19-1
Una vista puede ser colocado dentro de una celda específica, indicando la fila y la columna número de
intersección 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 GridLayout padre:
<Botón
android: id = "@ + / Identificación del button5"
android: layout_column = "2"
android: layout_row = "1"
android: layout_gravity = "left | top"
android: text = "Button" />
<Botón
android: id = "@ + / Identificación del button4"
android: layout_columnSpan = "3"
android: layout_rowSpan = "2"
android: layout_gravity = "llenar"
android: text = "Button" />
Los márgenes alrededor de una vista dentro de una célula pueden ser declaradas para todos los lados de la
vista con el androide: propiedad margin layout_margin. Alternativamente, los márgenes de los distintos lados
pueden definirse utilizando el topmargin, BottomMargin, leftmargin y rightmargin propiedades. La siguiente vista
Botón declara un margen 10DP por los cuatro costados:
<Botón
android: id = "@ + / Identificación del button3"
android: layout_gravity = "left | top"
android: layout_margin = "10DP"
android: text = "Button" />
Llevar este conocimiento en conjunto, que ahora puede revisar el diseño de XML para la interfaz de usuario
basada en GridLayout creado en el capítulo anterior:
<GridLayout
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_alignParentTop = "true"
android: layout_alignParentLeft = "true"
android: layout_alignParentStart = "true"
android: orientación = "vertical">
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "Nuevo Botón"
android: id = "@ + / Identificación del button4"
android: layout_row = "1"
android: layout_column = "0"
android: layout_columnSpan = "2"
android: layout_gravity = "fill_horizontal" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "Nuevo Botón"
android: id = "@ + / Identificación del botón"
android: layout_row = "0"
android: layout_column = "1" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "Nuevo Botón"
android: id = "@ + / Identificación del button3"
android: layout_row = "0"
android: layout_column = "0" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "Nuevo Botón"
android: id = "@ + / Identificación del button2"
android: layout_row = "0"
android: layout_column = "2"
android: layout_rowSpan = "2"
android: layout_gravity = "fill_vertical" />
</ GridLayout>
El fragmento de archivo de recursos arriba aparece exactamente como se creó dentro de la herramienta
Diseñador Android Estudio en el capítulo anterior.Como se puede ver, que contiene un administrador de
GridLayout y cuatro vistas del botón con posiciones celulares especificadas por las propiedades de fila y
columna. Finalmente, los valores de referencia de fila y columna, junto con propiedades de gravedad se utilizan
para hacer dos de los botones de abarcar múltiples células. Cuando se implementa dentro de una aplicación,
este diseño XML aparecería como se ilustra en la figura 16-13.
Resumen
Como alternativa al uso de la herramienta Android Studio Designer en modo de diseño para crear elementos de
la interfaz de usuario basada GridLayout, el mismo objetivo también se puede lograr mediante la creación
manual de recursos de diseño XML. Después de haber cubierto el uso del enfoque de diseño gráfico en el
capítulo anterior, este capítulo ha cubierto los conceptos de declarar un GridLayout y posicionamiento y
configuración de puntos de vista del niño dentro de un archivo de recursos XML.
19 Una visión general y Android Estudio Ejemplo de Manejo
Android Evento (An Overview and Android Studio Example of Android Event Handling)
Mucho se ha cubierto en los capítulos anteriores relacionados con el diseño de interfaces de usuario para
aplicaciones de Android. Un área que todavía tiene que ser cubiertos, sin embargo, implica la manera en que la
interacción de un usuario con la interfaz de usuario desencadena la actividad subyacente para realizar una
tarea. En otras palabras, sabemos de los capítulos anteriores cómo crear una interfaz de usuario que contiene
una vista de botón, pero no la forma de hacer que algo suceda dentro de la aplicación, cuando es tocado por el
usuario.
El objetivo principal de este capítulo, por lo tanto, es proporcionar una visión general de la gestión de eventos en
las aplicaciones de Android, junto con un ejemplo de proyecto basado en Android Studio. Una vez que los
fundamentos de la gestión de eventos han sido cubiertos, el capítulo siguiente cubrirá el manejo en cuanto a la
detección de múltiples toques y toque de movimiento toque evento.
Eventos Android
Eventos en Android pueden tomar una variedad de formas diferentes, pero por lo general se generan en
respuesta a una acción exterior. La forma más común de los acontecimientos, en particular para los dispositivos
tales como tabletas y smartphones, implica algún tipo de interacción con la pantalla táctil. Estos eventos entran
en la categoría 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 eliminan 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 es pasado a la vista ubicado en la posición en la pantalla
donde el contacto se llevó a cabo. Además de la notificación de eventos, la vista también se aprobó una gama
de información (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.
Con el fin de ser capaz de manejar el caso de que no haya sido aprobada, 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 gama de interfaces de detectores de evento, cada uno de los cuales contiene una declaración abstracta de
un método de devolución de llamada. Con el fin de ser capaces de responder a un evento de un tipo particular,
una vista debe registrar el detector evento apropiado y aplicar la devolución de llamada correspondiente. Por
ejemplo, si un botón es para responder a un evento click (el equivalente a la conmovedora usuario y soltando el
botón de vista como si al hacer clic en un botón físico) se debe tanto a registrar el detector de eventos
View.OnClickListener (a través de una llamada a la meta el método de vista setOnClickListener ()) y poner en
práctica el método de devolución de llamada correspondiente onClick (). En el caso de que un evento de "click"
se detecta en la pantalla a la ubicación de la vista botón, el marco Android llamará al método onClick () de ese
punto de vista, cuando ese evento se elimina de la cola de eventos. Es, por supuesto, dentro de la
implementación del método de devolución de llamada onClick () que las tareas deben realizarse u otros métodos
llamado en respuesta a el botón de clic.
Esto proporciona una manera sencilla de capturar eventos de clic. No, sin embargo, proporciona la gama de
opciones ofrecidas por los controladores de eventos, que son el tema del resto de este capítulo. 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 diseño de la pantalla del dispositivo.
OnClickListener - Se utiliza para detectar eventos de clic de estilo por el que los toques de usuario y
luego libera un área de la pantalla del dispositivo ocupada por una vista. Se corresponde con el método de
devolución de llamada onClick () que se pasa una referencia a la opinión de que ha recibido el evento como
un argumento.
onLongClickListener - Se utiliza para detectar cuando el usuario mantiene el contacto a través de
una vista por un período prolongado. Se corresponde con el método de devolución de llamada onLongClick
() que se pasa como argumento la opinión de que recibió el evento.
onTouchListener - Se usa para detectar cualquier tipo de contacto con la pantalla táctil que incluye
toques individuales o múltiples y movimientos gestuales. En correspondencia con la devolución de llamada
onTouch (), este tema se tratará con mayor detalle en el capítulo titulado Android táctil y Multi-touch Manejo
de Eventos. El método de devolución de llamada se pasa como argumentos la opinión de que ha recibido el
evento y un objeto MotionEvent.
onCreateContextMenuListener - Escucha la creación de un menú contextual como el resultado de
una larga clic. Se corresponde con el método de devolución de llamada onCreateContextMenu (). La
devolución de llamada se pasa al menú, la opinión de que recibió el evento y un objeto de contexto menú.
onFocusChangeListener - Detecta cuando el enfoque se aleja de la vista actual como el resultado de
la interacción con un trackball o la tecla de navegación. Se corresponde con el método de devolución de
llamada onFocusChange () que se transmite la idea de que ha recibido 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. Se corresponde con el método de devolución de llamada OnKey (). Pasa como
argumentos son la opinión de que recibió el evento, el código de tecla de la tecla física que se presionó y
un objeto KeyEvent.
Un ejemplo Manejo de Eventos
En el resto de este capítulo, vamos a trabajar a través de la creación de un proyecto simple Android Estudio
diseñado para demostrar la implementación de un detector de eventos y el método de devolución de llamada
correspondiente para detectar cuando el usuario ha hecho clic en un botón. El código dentro del método de
devolución 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 aplicación y
ebookfrenzy.com como el ajuste de dominio de la empresa antes de hacer clic en el botón Siguiente.
En la pantalla de factores de forma, activar la opción de teléfono y la tableta y activar el ajuste de API 8 SDK
mínimo: Android 2.2 (Froyo). Continuar para avanzar a través de las pantallas, solicitando la creación de una
actividad en blanco denominada EventExampleActivity con una disposición correspondiente llamado
activity_event_example.
Busque y seleccione el archivo activity_event_example.xml creado por Android Studio (situado en la ventana de
herramientas Proyecto en EventExample -> aplicación -> src -> principal -> res -> layouts) y haga doble clic en
él para cargarlo en la herramienta Diseñador. Pasar del modo Diseño en modo texto usando la pestaña en la
parte inferior del panel Diseñador y borrar el contenido actual del archivo. Con un lienzo en blanco, ya sea para
uso el modo de diseño para diseñar visualmente la interfaz de usuario de la figura 20-1 (asegurándose de
cambiar los ID de la Button y TextView objeta @ + / Identificación del myButton y @ + / Identificación del
myTextView respectivamente), o directamente introducir el siguiente código XML se utiliza el modo texto:
<Botón
android: id = "@ + / Identificación del myButton"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_centerHorizontal = "true"
android: layout_centerVertical = "true"
android: text = "Pulse Me" />
<TextView
android: id = "@ + / Identificación del myTextView"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_above = "@ + / Identificación del myButton"
android: layout_centerHorizontal = "true"
android: layout_marginBottom = "41dp"
android: text = "Estado"
android: textAppearance = "android:? attr / textAppearanceLarge" />
</ RelativeLayout>
com.ebookfrenzy.eventexample paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.View importación;
android.widget.Button importación;
android.widget.TextView importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_event_example);
Botón Botón = (Button) findViewById (R.id.myButton);
button.setOnClickListener (
nueva Button.OnClickListener () {
public void onClick (View v) {
}
}
);
}
.
.
.
}
El código anterior se ha registrado el detector de eventos en el botón y aplicado el método onClick (). Si la
aplicación fuera a ser ejecutado en este punto, sin embargo, no habría ninguna indicación de que el detector de
eventos instalado en el botón estaba trabajando ya que no es, hasta ahora, ningún código implementado dentro
del cuerpo del método de devolución de llamada onClick (). La meta para el ejemplo es tener un mensaje
aparecerá en la TextView cuando se hace clic en el botón, por lo que algunos cambios de código adicionales
deben hacerse:
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_event_example);
button.setOnClickListener (
nueva Button.OnClickListener () {
public void onClick (View v) {
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText ("Botón de clic");
}
}
);
}
Completar esta fase del tutorial de compilar y ejecutar la aplicación en ambos un emulador AVD o dispositivo
Android física. Al tocar y soltar el botón de vista (también conocido como "clic") la vista de texto debería cambiar
para mostrar el texto "Botón de clic".
Utilizar eventos
La detección de clics estándar (a diferencia de clics largos) en puntos de vista es un caso muy simple de manejo
de eventos. El ejemplo se extenderá ahora para incluir la detección de eventos de clic largos que se producen
cuando el usuario hace clic y sostiene una vista en la pantalla y, al hacerlo, cubren el tema del consumo de
evento.
Considere el código para el método onClick () en la sección anterior de este capítulo. La devolución de llamada
se declara nulo y, como tal, no devuelve un valor para el sistema Android después de que haya terminado de
ejecutarse. El onLongClick () método de devolución de llamada de la interfaz onLongClickListener, por el
contrario, tiene la obligación de devolver un valor booleano al marco Android. El propósito de este valor de
retorno es para indicar que el tiempo de ejecución Android si o no la devolución de llamada ha consumido el
evento. Si la devolución de llamada devuelve un valor verdadero, el evento se descarta por el marco. Si, por el
contrario, la devolución de llamada devuelve un valor falso el marco Android considerará el evento aún estar
activo y en consecuencia lo pasará junto al detector de eventos siguiente juego que está registrado en el mismo
punto de vista.
Al igual que con muchos conceptos de programación esto es, tal vez, mejor demostrado con un ejemplo. El
primer paso es añadir un detector de eventos y el método de devolución de llamada durante largos clics a la
vista botón en la actividad de ejemplo:
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_event_example);
button.setOnClickListener (
nueva Button.OnClickListener () {
public void onClick (View v) {
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText ("Botón de clic");
}
}
);
button.setOnLongClickListener (
nueva Button.OnLongClickListener () {
public boolean onLongClick (Ver v) {
TextView myTextView =
(TextView) findViewById (R.id.myTextView);
myTextView.setText ("botón Larga clic");
return true;
}
}
);
}
Es evidente que, cuando se detecta una pulsación larga, el método de devolución de llamada onLongClick ()
mostrará "clic de botón largo" en la vista de texto.Nótese, sin embargo, que el método de devolución de llamada
también devuelve un valor de true para indicar que se ha consumido el evento. Compilar y ejecutar la aplicación
y pulse y mantenga la punta del dedo sobre la vista botón hasta que el "botón de Long clic en" texto aparece en
la vista de texto. Al soltar el botón, la vista de texto sigue mostrando el texto "botón Larga clic" que indica que el
método de devolución de llamada onClick () no fue llamado.
A continuación, modifique el código de tal manera que el método onLongClick () ahora devuelve un valor falso:
button.setOnLongClickListener (
nueva Button.OnLongClickListener () {
public boolean onLongClick (Ver v) {
TextView myTextView = (TextView) findViewById
(R.id.myTextView);
myTextView.setText ("botón Larga clic");
return false;
}
}
);
Una vez más, compilar y ejecutar la aplicación y realizar una pulsación larga en el botón hasta que aparezca el
mensaje largo clic. Al soltar el botón de este tiempo, sin embargo, tenga en cuenta que la devolución de llamada
onClick () también se activa y el texto cambia a "Botón de clic". Esto es porque el valor falso devuelto por el
método de devolución de llamada onLongClick () indica al marco Android que el evento no fue consumido por el
método y era elegible para ser pasado a la siguiente listener registrado en la vista. En este caso, el tiempo de
ejecución de determinarse que la OnClickListener en el botón también estaba interesado en los eventos de este
tipo y, posteriormente llamado el método de devolución de llamada onClick ().
Resumen
Una interfaz de usuario es de poca utilidad práctica si las opiniones que contiene no hacer nada en respuesta a
la interacción del usuario. Android cierra la brecha entre la interfaz de usuario y el código de extremo posterior
de la aplicación a través de los conceptos de los detectores de eventos y los métodos de devolución 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 también se ha asociado con un método de devolución 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 manejado en un primero en entrar, primero en salir por la base de tiempo de ejecución 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
método de devolución de llamada correspondiente. El método de devolución de llamada y luego realiza las
tareas requeridas por la actividad antes de regresar. Se requieren algunos métodos de devolución 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.
Después de haber cubierto los conceptos básicos de la gestión de eventos, el siguiente capítulo explorará con
cierta profundidad el tema de los eventos de toque con un énfasis particular en el manejo de múltiples toques.
20 Touch Android y multi-touch control de eventos en
Android Estudio
La mayoría de los dispositivos basados en Android utilizan una pantalla táctil como interfaz principal entre el
usuario y el dispositivo. En el capítulo anterior introdujo el mecanismo por el cual un toque en la pantalla se
traduce en una acción dentro de una aplicación de Android corriendo. Hay, sin embargo, mucho más que toque
la gestión de eventos de responder a un solo toque del dedo sobre un objeto de vista. La mayoría de los
dispositivos Android pueden, por ejemplo, detectar más de un contacto a la vez. Tampoco son toques limitados
a un solo punto en la pantalla del dispositivo. Toques pueden, por supuesto, ser dinámico como el usuario
desliza uno o más puntos de contacto a través de la superficie de la pantalla.
Toques también pueden ser interpretados por una aplicación como un gesto. Consideremos, por ejemplo, que
un golpe horizontal se suele utilizar para pasar la página de un libro electrónico, o cómo un movimiento de
pellizco se puede utilizar para acercar y alejar una imagen que aparece en la pantalla.
El objetivo de este capítulo es para resaltar el manejo de los detalles que implican movimiento y para explorar el
concepto de interceptar múltiples toques simultáneos. El tema de la identificación de los gestos distintos se
cubrirá en el próximo capítulo.
myLayout.setOnTouchListener (
nueva RelativeLayout.OnTouchListener () {
onTouch public boolean (Ver v, MotionEvent m) {
// Realizar tareas aquí
return true;
}
}
);
Como se indica en el ejemplo de código, se requiere la devolución de llamada onTouch () para devolver un valor
booleano que indica que el sistema de ejecución Android si el evento debe ser transmitida a otros detectores de
eventos registrados en el mismo punto de vista o descartados. El método 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 método de devolución de llamada onTouch () es la clave para la obtención
de información sobre el evento. La información contenida en el objeto incluye la ubicación del contacto dentro de
la vista y el tipo de acción realizada. El objeto MotionEvent es también la clave para el manejo de múltiples
toques.
A.Táctiles Comprensión
Un aspecto importante de la gestión de eventos táctil implica ser capaz de identificar el tipo de acción realizada
por el usuario. El tipo de acción asociado a un evento se puede obtener mediante una llamada al método del
objeto MotionEvent que fue aprobada mediante el método de devolución de llamada onTouch ()
getActionMasked (). Cuando se produce el primer contacto en una vista, el objeto MotionEvent contendrá un tipo
de acción de ACTION_DOWN junto con las coordenadas de tacto. Cuando ese contacto se levanta de la
pantalla, se genera un evento ACTION_UP. Cualquier movimiento del contacto entre los eventos
ACTION_DOWN y ACTION_UP estará representada por eventos ACTION_MOVE.
Cuando más de un toque se realiza simultáneamente en una vista, los toques se conocen como punteros. En un
escenario multi-touch, punteros comienzan y 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 activa el
evento, el método de devolución de llamada getActionIndex () del objeto MotionEvent debe ser llamado.
Tenga en cuenta que el recuento de puntero siempre será mayor que o igual a 1 cuando se llama a un método
onTouch () (por lo menos desde un solo toque debe haber ocurrido durante la devolución de llamada para ser
activado).
Un toque en una vista, en particular uno que implica el movimiento a través de la pantalla, se generará un flujo
de eventos antes del punto de contacto con los que se levante la pantalla. Como tal, es probable que una
aplicación tendrá que realizar un seguimiento de toques individuales sobre múltiples eventos táctiles.Mientras
que el ID de un gesto táctil específica no cambiará de un evento a otro, es importante tener en cuenta que el
valor del índice cambiará a medida que otros eventos táctiles van y vienen. Cuando se trabaja con un gesto
contacto a través de múltiples 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 métodos que
requieren un valor de índice, este debe ser obtenido mediante la conversión de la ID de un toque para el valor
del índice correspondiente a través de una llamada al método findPointerIndex () del objeto MotionEvent.
<TextView
android: id = "@ + / Identificación del textView2"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_centerHorizontal = "true"
android: layout_centerVertical = "true"
android: text = "Toque Dos Status" />
<TextView
android: id = "@ + / Identificación del textView1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_above = "@ + / Identificación del textView2"
android: layout_alignLeft = "@ + / Identificación del textView2"
android: layout_marginBottom = "47dp"
android: text = "Touch Uno de estado" />
</ RelativeLayout>
Cambiar al modo de diseño y seleccione el TextView superior en el diseño 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 diálogo Extract Resource. En el cuadro de diálogo, el nombre de la cadena
status1_string recurso y haga clic en el botón Aceptar. Repita estos pasos para el segundo componente
TextView, esta vez nombrando el status2_string recurso de cadena.
Figura 21-1
com.ebookfrenzy.motionevent paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.MotionEvent importación;
android.view.View importación;
android.widget.RelativeLayout importación;
android.widget.TextView importación;
@ Override
protected void 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 aplicación es poner en práctica el método handleTouch () convocada por el
método de devolución de llamada onTouch (). El código de este método es el siguiente:
switch (acción)
{
caso MotionEvent.ACTION_DOWN:
actionString = "DOWN";
break;
caso MotionEvent.ACTION_UP:
actionString = "UP";
break;
caso MotionEvent.ACTION_POINTER_DOWN:
actionString = "RCNP DOWN";
break;
caso MotionEvent.ACTION_POINTER_UP:
actionString = "RCNP UP";
break;
caso MotionEvent.ACTION_MOVE:
actionString = "MOVE";
break;
por defecto:
actionString = "";
}
si (id == 0)
textView1.setText (touchStatus);
más
textView2.setText (touchStatus);
}
}
Antes de compilar y ejecutar la aplicación, vale la pena tomarse el tiempo para caminar a través de este código
de forma sistemática para poner de relieve las tareas que se están realizando. El código empieza por la
obtención de referencias a los dos objetos TextView en la interfaz de usuario e identificar cuántos punteros
están activos actualmente en la vista:
A continuación, la variable pointerCount se utiliza para iniciar un bucle que realiza un conjunto de tareas para
cada puntero activo. Las primeras líneas del bucle obtienen la coordenadas X e Y del tacto junto con el
correspondiente identificador de evento, tipo de acción y el índice de la acción. Por último, una variable de
cadena se declara:
Puesto que los tipos de acción equivalen a valores enteros, una declaración interruptor se utiliza para convertir
el tipo de acción a un valor de cadena más significativo, que se almacena en la variable de actionString
declarada:
switch (acción)
{
caso MotionEvent.ACTION_DOWN:
actionString = "DOWN";
break;
caso MotionEvent.ACTION_UP:
actionString = "UP";
break;
caso MotionEvent.ACTION_POINTER_DOWN:
actionString = "RCNP DOWN";
break;
caso MotionEvent.ACTION_POINTER_UP:
actionString = "RCNP UP";
break;
caso MotionEvent.ACTION_MOVE:
actionString = "MOVE";
break;
por defecto:
actionString = "";
}
Por último, el mensaje de cadena se construye utilizando el valor actionString, el índice de acción, el tacto y el
ID 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:
si (id == 0)
textView1.setText (touchStatus);
más
textView2.setText (touchStatus);
Figura 21-2
Resumen
Actividades recibir notificaciones de eventos de toque al registrar un detector de eventos onTouchListener e
implementar el método de devolución de llamada onTouch () que, a su vez, se pasa un objeto MotionEvent
cuando se le llama por el tiempo de ejecución de Android. Este objeto contiene información sobre el tacto, tales
como el tipo de evento táctil, las coordenadas del tacto y un recuento del número de toques actualmente en
contacto con la vista. Cuando múltiples toques están 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 capítulo se ha trabajado a través de la creación de una aplicación para Android ejemplo diseñado para
mostrar las coordenadas y las acciones tipo de hasta dos toques simultáneos en una pantalla del dispositivo.
Tener toques cubiertos en general, el siguiente capítulo (titulado Detección Común Gestos con el Estudio de
Android y el Gesto Detector Class ) se verá más a fondo en la pantalla táctil de la gestión de eventos a través de
la aplicación de reconocimiento de gestos.
com.ebookfrenzy.commongestures paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.GestureDetector importación;
android.widget.TextView importación;
@ Override
protected void 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 interfaces oyentes que los métodos correspondientes
también se implementarán en la clase:
com.ebookfrenzy.commongestures paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.GestureDetector importación;
android.widget.TextView importación;
android.view.MotionEvent importación;
public class CommonGesturesActivity extiende ActionBarActivity
implementa GestureDetector.OnGestureListener,
GestureDetector.OnDoubleTapListener {
@ Override
protected void 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");
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 métodos devuelven true. Esto indica al Marco de Android que el evento ha
sido consumido por el método y no necesita ser pasado al siguiente controlador de eventos en la pila.
com.ebookfrenzy.commongestures.commongestures paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.GestureDetector importación;
android.widget.TextView importación;
android.view.MotionEvent importación;
android.support.v4.view.GestureDetectorCompat importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_common_gestures);
gestureText =
(TextView) findViewById (R.id.gestureStatusText);
@ Override
onTouchEvent public boolean (evento MotionEvent) {
this.gDetector.onTouchEvent (evento);
// Asegúrese de llamar a la implementación de la superclase
volver super.onTouchEvent (evento);
}
Prueba de la aplicación
Compila y ejecuta la aplicación en un dispositivo Android, ya sea físico o un emulador AVD. Una vez puesto en
marcha, experimentar con golpes, prensas, movimientos de desplazamiento y grifos dobles e
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 físico entre el usuario y la pantalla táctil de un dispositivo puede ser considerado como un
"gesto". Careciendo el teclado físico y el puntero del ratón de un sistema informático tradicional, los gestos se
utilizan ampliamente como un método de interacción entre el usuario y la aplicación. 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 táctil se han familiarizado. Un número de estos
llamados "gestos comunes" se puede detectar fácilmente dentro de una aplicación, haciendo uso de las clases
Detector Gesto Android. En este capítulo, el uso de esta técnica se ha descrito tanto en la teoría como a través
de la implementación de un proyecto de ejemplo.
Tener gestos comunes tratados en este capítulo, el siguiente capítulo se verá en la detección de una gama más
amplia de tipos de gestos, incluyendo la capacidad de diseño y detectar sus propios gestos.
El capítulo anterior examinó los pasos involucrados en la detección de lo que se conoce como "gestos comunes"
desde una aplicación Android. En la práctica, sin embargo, un gesto puede tener componentes casi cualquier
secuencia de movimientos táctiles en la pantalla de un dispositivo Android. En reconocimiento de este hecho, el
SDK de Android permite gestos personalizados de casi cualquier naturaleza a ser definidas por el desarrollador
de la aplicación 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 capítulo.
Gestor de Android Application Builder
El SDK de Android permite a los desarrolladores diseñar gestos personalizados que luego se almacenan en un
archivo gesto liado con un paquete de aplicaciones Android.Estos archivos gesto personalizado se crean más
fácilmente utilizando la aplicación Generador de gestos que se incluye con el paquete de muestras suministrado
como parte del SDK de Android. La creación de un archivo de gestos implica el lanzamiento de la aplicación
Generador de Gesto, ya sea en un dispositivo físico o emulador, y "dibujar" los gestos que necesitarán para ser
detectado por la aplicación. Una vez que los gestos se han diseñado, el archivo que contiene los datos de
gestos se puede sacar la tarjeta SD del dispositivo o emulador y se agrega al proyecto de aplicación. Dentro del
código de la aplicación, 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 detección de gestos dentro de una aplicación, 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 propósito de gestos de detección.
La detección de gestos
Los gestos son detectados por la carga del archivo gestos creado utilizando la aplicación 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 método de devolución de llamada onGesturePerformed correspondiente
requerida por dicha interfaz. En el caso de que un gesto es detectado por el oyente, una llamada al método de
devolución de llamada onGesturePerformed se activa el sistema de ejecución Android.
El código fuente de la aplicación 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 en un proyecto existente (no es posible importar un proyecto
desde la pantalla de bienvenida Android Studio), seleccione Archivo -> Importar proyecto ... menú de opciones
y, en el cuadro de diálogo resultante, busque y seleccione el GestureBuilder carpeta dentro del directorio de
ejemplos de SDK y haga clic en Aceptar. Confirme el directorio de destino y haga clic en Siguiente seguido
Finalizar para aceptar la configuración 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
Studio y construir la estructura.
Una vez importados, instale y ejecute la utilidad GestureBuilder en un dispositivo Android conectado al sistema
de desarrollo.
Creación de un archivo Gestos
Una vez que la solicitud Constructor Gesto ha cargado, se debe indicar que no hay gestos todavía no se ha
creado. Para crear un nuevo gesto, haga clic en el botón Agregar gesto situado en la parte inferior de la pantalla
del dispositivo, introduzca el nombre de Círculo 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 -2. Suponiendo que el gesto aparece
como requerida (representada por la línea amarilla en la pantalla del dispositivo), haga clic en el botón Hecho
para añadir el gesto para el archivo de gestos:
Figura 23-2
Después de que el gesto se ha guardado, la aplicación Generador de Gesto mostrará una lista de gestos
definidos en la actualidad, lo que, en este punto, consistirá únicamente en la nueva Gesto Circle.
Repita el proceso de creación de gesto para agregar otro gesto al archivo. Esto debería implicar un gesto de dos
tiempos de la creación de una X en la pantalla el nombre X Gesto. Al crear gestos que implican múltiples golpes,
asegúrese de dejar el menor tiempo posible entre cada carrera para que el constructor sabe que los trazos son
parte de un mismo gesto. Una vez que este gesto se ha añadido, la lista dentro de la aplicación Constructor
gesto debe ser similar a la expuesta en la Figura 23-3:
Figura 23-3
adb devices
En el caso de que el comando adb no se encuentra, consulte Configuración de un entorno de desarrollo Estudio
Android para orientación sobre sumando esto a la variable de entorno PATH del sistema.
Una vez ejecutado, el comando listará todos los dispositivos físicos activos e instancias AVD conectados al
sistema. La siguiente salida, por ejemplo, indica que tanto un dispositivo físico y un emulador de AVD se han
detectado en el sistema de equipo de desarrollo:
Con el fin de tirar de los gestos archivo desde el emulador en el ejemplo anterior y colocarlo en el directorio de
trabajo actual de la ventana del símbolo del Terminal o Comando, necesitaría el siguiente comando para
ejecutar:
Alternativamente, el archivo de gestos se puede jalar de un dispositivo conectado a través de adb con el
comando siguiente (donde se utiliza la opción -d para indicar un dispositivo físico):
Una vez que el archivo de gestos ha sido creado y se quitó la tarjeta SD, que está listo para ser añadido a un
proyecto Android Studio como un archivo de recursos. El siguiente paso, por lo tanto, es crear un nuevo
proyecto.
Una vez que el gerente RelativeLayout se ha eliminado de la presentación, haga clic en la (Vertical) Artículo
LinearLayout de la sección Diseños de la paleta de Diseñador y arrastre y suéltelo en el diseño de la pantalla del
dispositivo. Encienda la herramienta Diseñador de modo de texto utilizando la ficha Texto a lo largo del borde
inferior del panel y compruebe que coincide con el XML para el diseño que en el siguiente listado:
<LinearLayout
android: orientación = "vertical"
android: layout_width = "fill_parent"
android: layout_height = "fill_parent"
xmlns: android = "http://schemas.android.com/apk/res/android">
</ LinearLayout>
Vuelva al modo Diseño, busque la sección de Expertos de la paleta y arrastrar y soltar un objeto
GestureOverlayView al lienzo de diseño. Seleccione la instancia GestureOverlayView en el diseño y el uso de
los paneles o de la barra de herramientas Diseñador botones Propiedades para cambiar el diseño: la anchura y
el diseño: 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 @ + / Identificación del GOverlay. Cuando se haya completado, el archivo activity_custom_gestures.xml
debería decir lo siguiente:
<LinearLayout
android: orientación = "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 = "@ + / Identificación del GOverlay"
android: layout_gravity = "center_horizontal">
</android.gesture.GestureOverlayView>
</ LinearLayout>
com.ebookfrenzy.customgestures paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.gesture.GestureLibraries de importación;
android.gesture.GestureLibrary importación;
android.gesture.GestureOverlayView importación;
android.gesture.GestureOverlayView.OnGesturePerformedListener importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_custom_gestures);
gLibrary =
GestureLibraries.fromRawResource (esto, R.raw.gestures);
if (! gLibrary.load ()) {
acabado ();
}
}
.
.
.
}
Además de algunas directivas de importación necesarios, los cambios de código anteriores al método onCreate
() para crear una instancia de GestureLibrary llamado gLibrary y luego carga en ella el contenido del archivo de
gestos ubicado en la carpeta de recursos en bruto. La clase de actividad también se ha modificado para
implementar la interfaz OnGesturePerformedListener, que requiere la aplicación del método de devolución de
llamada onGesturePerformed (que se creó en una sección posterior de este capítulo).
@ Override
protected void 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);
}
com.ebookfrenzy.customgestures paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.gesture.GestureLibraries de importación;
android.gesture.GestureLibrary importación;
android.gesture.GestureOverlayView importación;
android.gesture.GestureOverlayView.OnGesturePerformedListener importación;
android.gesture.Prediction importación;
android.widget.Toast importación;
android.gesture.Gesture importación;
java.util.ArrayList importación;
@ Override
protected void 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);
}
Cuando un gesto en la vista de los objetos gráficos gesto es detectado por el tiempo de ejecución de Android, se
llama al método onGesturePerformed. Pasado a través de como argumentos son una referencia al objeto
GestureOverlayView en la que se detectó el gesto junto con un objeto de tipo gesto. La clase Gesto está
diseñado para contener la información que define un gesto específico (esencialmente una secuencia de puntos
cronometrados en la pantalla que representa la trayectoria de los trazos que componen un gesto).
El objeto se pasa a través de gestos con el método de reconocer () de nuestro ejemplo gLibrary, el propósito 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 predicción para
cada comparación realizada. La lista está clasificada por orden desde el mejor partido (en la posición 0 de la
matriz) para lo peor. Contenido dentro de cada objeto de predicción es el nombre de la correspondiente gesto de
archivo de gestos y una puntuación de predicción que indica hasta qué punto coincide con el gesto actual.
El código en el método anterior, por lo tanto, lleva a la predicción en la posición 0 (el valor más cercano) se
asegura de que tiene una puntuación superior a 1,0 y luego muestra un mensaje de Toast (una clase de Android
diseñada para mostrar la notificación pop ups para el usuario) mostrando el nombre del gesto a juego.
Prueba de la aplicación
Genere y ejecute la aplicación a ambos un emulador o en un dispositivo Android física y realizar los gestos
circulares y banda magnética en la pantalla. Cuando se realiza la notificación tostadas debería aparecer con 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. Además, tenga en cuenta que cuando se reconoce un gesto, se perfila en la pantalla con una
línea de color amarillo brillante, mientras que los gestos sobre el que la superposición es incierto aparecen como
una línea amarilla descolorida. Mientras útil durante el desarrollo, esto probablemente no es ideal para una
aplicación en el mundo real. Claramente, por lo tanto, todavía hay algunos más trabajo de configuración de
hacer.
<LinearLayout
android: orientación = "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 = "@ + / Identificación del GOverlay"
android: layout_gravity = "center_horizontal"
android: gestureColor = "# 00000000"
android: uncertainGestureColor = "# 00000000"
android: gestureStrokeType = "múltiple">
</android.gesture.GestureOverlayView>
</ LinearLayout>
Al volver a ejecutar la aplicación, los gestos deben ser ahora invisible (ya que se dibujan en blanco sobre 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
superposición gesto entonces deben ser transmitidos a las vistas subyacentes cuando un gesto ha sido
reconocido. Esto se controla a través del androide: propiedad eventsInterceptionEnabled 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 están realizando gestos
sobre una vista que podrían ser configurado para desplazarse en respuesta a ciertos gestos. Al establecer esta
propiedad en true evitará gestos también se interpreta como instrucciones para la vista subyacente para
desplazarse en una dirección particular.
com.ebookfrenzy.pinchexample paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.MotionEvent importación;
android.view.ScaleGestureDetector importación;
android.view.ScaleGestureDetector.SimpleOnScaleGestureListener importación;
android.widget.TextView importación;
TextView scaleText;
ScaleGestureDetector scaleGestureDetector;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_pinch_example);
scaleGestureDetector =
nueva ScaleGestureDetector (esto,
nueva MyOnScaleGestureListener ());
}
@ Override
onTouchEvent public boolean (evento MotionEvent) {
scaleGestureDetector.onTouchEvent (evento);
return true;
}
@ Override
onScale public boolean (detector ScaleGestureDetector) {
si (scaleFactor> 1) {
scaleText.setText ("Zoom Out");
} Else {
scaleText.setText ("Zoom In");
}
return true;
}
@ Override
onScaleBegin public boolean (detector ScaleGestureDetector) {
return true;
}
@ Override
public void onScaleEnd (detector ScaleGestureDetector) {
}
}
.
.
.
}
El código 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 métodos (onScale (), onScaleBegin () y onScaleEnd ()) ser realizados. En este caso, el
método 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 método onCreate (), se obtiene una referencia al objeto de vista de texto y se asigna a la variable
scaleText. A continuación, se crea una nueva instancia ScaleGestureDetector, pasando a través de una
referencia a la actividad envolvente y una instancia de nuestra nueva clase MyOnScaleGestureListener como
argumentos.Por último, un onTouchEvent () método de devolución de llamada se implementa para la actividad,
que simplemente llama al método del objeto ScaleGestureDetector correspondiente onTouchEvent (), pasando a
través del objeto MotionEvent como argumento.
Compila y ejecuta la aplicación en un dispositivo Android física y realizar pellizcos gestos en la pantalla, y señaló
que la vista Texto muestra tanto el zoom o alejar mensaje dependiendo del movimiento de pellizco.
Resumen
Un gesto es esencialmente el movimiento de puntos de contacto en una pantalla táctil que implican uno o más
golpes y puede ser utilizado como un método de comunicación entre el usuario y la aplicación. Android permite
gestos para ser diseñados utilizando la aplicación 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 ejecución de aplicaciones utilizando
la GestureLibrary.
Los gestos pueden ser detectados en áreas de la pantalla mediante la superposición de puntos de vista
existentes con instancias de la clase GestureOverlayView transparente e implementación de un detector de
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
puntuación de predicción para decidir si un gesto es un partido bastante cerca.
23 Introducción al uso de fragmentos en Android Estudio
A medida que avance a través de los capítulos de este libro será cada vez más evidente que muchos de los
conceptos de diseño detrás del sistema Android se concibieron con el objetivo de promover la reutilización de, y
la interacción entre los diferentes elementos que componen una aplicación. Una de esas áreas que será
explorado en este capítulo implica el uso de fragmentos. En este capítulo se ofrecerá una visión general de los
conceptos básicos de fragmentos en términos de lo que son y cómo pueden ser creados y utilizados dentro de
las aplicaciones. El siguiente capítulo trabajará a través de un tutorial diseñado para mostrar fragmentos en
acción cuando el desarrollo de aplicaciones en Android de estudio, incluida la aplicación de la comunicación
entre los fragmentos.
Qué es un fragmento?
Un fragmento es una sección modular autónomo de la interfaz de usuario de una aplicación 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 diseño de la aplicación, y se añaden a, o se quitan de una actividad
durante la ejecución de la aplicación para crear una interfaz de usuario que cambia dinámicamente.
Los fragmentos sólo se pueden utilizar como parte de una actividad y no puede ser instanciada como elementos
aplicación 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 diseño XML y pueden ser añadidos a una actividad ya
sea mediante la colocación apropiada <fragmento> elementos de archivo de diseño de la actividad, o
directamente a través de código dentro de implementación de la clase de la actividad.
Antes de comenzar a utilizar fragmentos de una aplicación para Android, es importante tener en cuenta que los
fragmentos no se introdujeron a Android hasta la versión 3.0 del SDK de Android. Una aplicación que utiliza
fragmentos deben, por lo tanto, hacer uso del androide-support-v4 Android Biblioteca de compatibilidad con el
fin de ser compatible con las versiones de Android de mayor edad. Los pasos para lograr esto se tratarán en el
próximo capítulo, titulado Uso de fragmentos en Android Studio - Un Ejemplo .
Creación de un fragmento
Los dos componentes que componen un fragmento son un archivo de formato XML y una clase Java
correspondiente. El archivo de diseño XML para un fragmento lleva el mismo formato que un diseño para
cualquier otra disposición actividad y puede contener cualquier combinación y la complejidad de los
controladores de distribución y puntos de vista. El siguiente esquema XML, por ejemplo, es para un fragmento
que consta simplemente de un RelativeLayout con un fondo rojo que contiene un único TextView:
<TextView
android: id = "@ + / Identificación 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 diseño debe ser una subclase de la clase Fragmento Android. Si la solicitud
es para que sea compatible con los dispositivos que ejecutan versiones de Android anteriores a la versión 3.0, el
archivo de clase debe importar android.support.v4.app.Fragment. La clase debe, como mínimo, reemplazar el
método onCreateView (), que es responsable de cargar el diseño fragmento. Por ejemplo:
com.example.myfragmentdemo paquete;
android.os.Bundle importación;
android.support.v4.app.Fragment importación;
android.view.LayoutInflater importación;
android.view.View importación;
android.view.ViewGroup importación;
Además del método onCreateView (), la clase también puede anular los métodos de ciclo de vida estándar.
Tenga en cuenta que con el fin de hacer que el fragmento anterior compatible con las versiones de Android
anteriores a la versión 3.0, la clase Fragmento de la biblioteca de soporte v4 se ha importado.
Una vez que se han creado la disposición fragmento y la clase, el fragmento está listo para ser utilizado dentro
de las actividades de aplicación.
com.example.myfragmentdemo paquete;
android.os.Bundle importación;
android.support.v4.app.FragmentActivity importación;
android.view.Menu importación;
@ Override
protected void 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 están incrustados en archivos de diseño de actividad utilizando el <fragmento> elemento. El
siguiente ejemplo de diseño incorpora el fragmento creado en la sección anterior de este capítulo en una
maquetación de la actividad:
<Fragmento
android: id = "@ + / Identificación 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 diseño: = "@ diseño / fragment_one_layout" />
</ RelativeLayout>
Las propiedades clave dentro de la <fragmento> elemento son androide: nombre, que debe hacer referencia a la
clase asociada con el fragmento, y las herramientas: diseño, lo que debe hacer referencia al archivo de recursos
XML que contiene la disposición del fragmento.
Una vez añadido a la disposición de una actividad, fragmentos se pueden ver y manipular dentro de la
herramienta Android Studio Designer. Figura 24-1, por ejemplo, muestra la disposición anterior con el fragmento
incrustado dentro Diseñador Android Estudio:
Figura 24-1
El código anterior se descompone cada paso en una declaración por separado a los efectos de claridad. Las
últimas cuatro líneas pueden, sin embargo, ser abreviados en una sola línea de código de la siguiente manera:
Una vez añadido a un recipiente, un fragmento posteriormente puede ser eliminado a través de una llamada al
método remove () de la instancia de transacción fragmento, pasando a través 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 método replace () de la
instancia de transacción fragmento. Esto toma como argumentos el id de la vista que contiene el fragmento y
una instancia del nuevo fragmento. El fragmento reemplazado también se puede colocar en lo que se conoce
como la pila hacia atrás para que se puede restaurar rápidamente en el caso de que el usuario se desplaza de
nuevo a él. Esto se logra mediante una llamada al método addToBackStack () del objeto de transacción
fragmento antes de hacer el commit () llamada al método:
button.setOnClickListener (
nueva Button.OnClickListener () {
public void onClick (View v) {
// Código que se lleva a cabo cuando
// Se hace clic en el botón
}
}
);
En el caso de interceptar eventos de clic, el segundo enfoque implicó establecer el androide: propiedad onClick
en el archivo de diseño XML:
<Botón
android: id = "@ + / Identificación del botón 1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: onClick = "onClick"
android: text = "Haga clic en mí" />
La regla general para los eventos generados por una vista de un fragmento es que si el detector de eventos fue
declarado en la clase fragmento utilizando el enfoque de detector de eventos y el método de devolución de
llamada, entonces el evento 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.
ToolbarListener activityCallback;
El código anterior dicta que cualquier clase que implemente la interfaz ToolbarListener también debe
implementar un método de devolución de llamada con nombre onButtonClick que, a su vez, acepta un entero y
una cadena como argumentos.
A continuación, el método onAttach () de la clase fragmento se necesita omitir e implementado. Este método es
llamado automáticamente por el sistema Android cuando el fragmento se ha inicializado y se asocia con una
actividad. El método se pasa una referencia a la actividad en la que se contiene el fragmento. El método debe
almacenar una referencia local a esta actividad y verificar que implementa la interfaz ToolbarListener:
@ Override
public void onAttach (actividad Actividad) {
super.onAttach (actividad);
try {
activityCallback = actividad (ToolbarListener);
} Catch (ClassCastException e) {
throw new ClassCastException (activity.toString ()
+ "Debe implementar ToolbarListener");
}
}
Tras la ejecución de este ejemplo, una referencia a la actividad se almacena en la variable activityCallback local
y una excepción será lanzada si esa actividad no implementa la interfaz ToolbarListener.
El siguiente paso es llamar al método de devolución de llamada de la actividad desde dentro del
fragmento. ¿Cuándo y cómo sucede esto es totalmente dependiente de las circunstancias en que la actividad
tiene que ser contactado por el fragmento. En aras de un ejemplo, el código siguiente llama al método de
devolución de llamada en la actividad cuando se hace clic en un botón:
public void buttonClicked (Ver vista) {
activityCallback.onButtonClick (arg1, arg2);
}
Todo lo que queda es modificar la clase de actividad para que se implemente la interfaz ToolbarListener. Por
ejemplo:
Como podemos ver en el código anterior, la actividad declara que implementa la interfaz ToolbarListener de la
clase ToolbarFragment y luego procede a aplicar el método onButtonClick () como es requerido por la interfaz.
Resumen
Fragmentos proporcionan un poderoso mecanismo para la creación de módulos reutilizables de diseño de la
interfaz de usuario y el comportamiento de la aplicación, que, una vez creado, puede ser embebido en las
actividades. Un fragmento consiste en un archivo de diseño de interfaz de usuario y una clase. Los fragmentos
pueden ser utilizados en una actividad, ya sea mediante la adición del fragmento de archivo de diseño de la
actividad, o escribiendo código para administrar los fragmentos en tiempo de ejecución. Fragmentos añadido a
una actividad en el código pueden ser removidos y reemplazados dinámicamente en tiempo de ejecución. Toda
la comunicación entre los fragmentos se debe realizar a través de la actividad en que se enmarcan las
actividades.
Después de haber cubierto los fundamentos de fragmentos en este capítulo, el capítulo siguiente ( Usando
fragmentos en Android Studio - Un Ejemplo ) funcionará a través de un tutorial diseñado para reforzar las
técnicas descritas en este capítulo.
<RelativeLayout
xmlns: android = "http://schemas.android.com/apk/res/android"
android: layout_width = "match_parent"
android: layout_height = "match_parent">
<Botón
android: id = "@ + / Identificación del botón 1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_below = "@ + / Identificación del seekBar1"
android: layout_centerHorizontal = "true"
android: layout_marginTop = "17dp"
android: text = "texto del cambio" />
<EditarTexto
android: id = "@ + / Identificación 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: id = "@ + / Identificación del seekBar1"
android: layout_width = "match_parent"
android: layout_height = "wrap_content"
android: layout_alignParentLeft = "true"
android: layout_below = "@ + / Identificación del editText1"
android: layout_marginTop = "14dp" />
</ RelativeLayout>
Una vez que se han realizado los cambios, cambiar la herramienta Diseñador de nuevo a modo de
diseño. Seleccione la vista botón y haga clic en el icono de la bombilla seguido del mensaje I18N para mostrar el
diálogo Extract Resource. Nombre del button_text recurso y haga clic en Aceptar para crear un recurso de
cadena para el botón.
Al completar estos pasos, el diseño de la interfaz de usuario debe ser similar a la de la Figura 25-2:
Figura 25-2
Con la disposición para el primer fragmento implementado, el siguiente paso es crear una clase para ir con ella.
com.ebookfrenzy.fragmentexample paquete;
/ **
* Creado por <nombre> el <fecha>.
* /
public class ToolbarFragment {
}
Por el momento, los únicos cambios en esta clase son para añadir algunas directivas de importación y
reemplazar el método onCreateView () para asegurarse de que el archivo de diseño se infla y se visualiza
cuando se utiliza el fragmento dentro de una actividad. La declaración de la clase también debe indicar que la
clase amplía la clase Fragmento Android:
com.ebookfrenzy.fragmentexample paquete;
android.os.Bundle importación;
android.support.v4.app.Fragment importación;
android.view.LayoutInflater importación;
android.view.View importación;
android.view.ViewGroup importación;
@ Override
pública Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup, Bulto
savedInstanceState) {
Más adelante en este capítulo, se agregará más funcionalidad a esta clase. Antes de eso, sin embargo, tenemos
que crear el segundo fragmento.
<TextView
android: id = "@ + / Identificación del textView1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_centerHorizontal = "true"
android: layout_centerVertical = "true"
android: text = "Fragmento Dos"
android: textAppearance = "android:? attr / textAppearanceLarge" />
</ RelativeLayout>
Una vez que se han realizado los cambios XML, volver al modo Diseño, seleccione el componente TextView y
haga clic en el icono de la bombilla seguido del mensaje I18N para mostrar el diálogo Extract Resource. Nombre
del text_label recurso y haga clic en Aceptar para crear un recurso de cadena para el botón. Al completar estos
pasos, el diseño de la interfaz de usuario para este segundo fragmento debe ser similar a la de la Figura 25-3:
Figura 25-3
Al igual que con el primer fragmento, éste también tendrá que tener una clase asociada a ella. Despliegue la
categoría src bajo el proyecto FragmentExample (si no está ya desplegado) en la ventana de herramientas del
proyecto y haga clic derecho en el nombre del paquete. En el menú que aparece, seleccione la nueva opción ->
Java Class. 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 método onCreateView () y
designar a la clase como una ampliación de la clase Android Fragmento:
com.ebookfrenzy.fragmentexample paquete;
android.os.Bundle importación;
android.support.v4.app.Fragment importación;
android.view.LayoutInflater importación;
android.view.View importación;
android.view.ViewGroup importación;
@ Override
pública Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup,
Bundle savedInstanceState) {
Ver view = inflater.inflate (R.layout.text_fragment,
contenedor, false);
vista regresar;
}
}
Ahora que la estructura básica de los dos fragmentos se ha implementado, que están listos para ser embebido
en la actividad principal de la aplicación.
Figura 25-4
Seleccione la entrada ToolbarFragment de la lista y haga clic en el botón Aceptar para cerrar el diálogo
Fragmentos. Mueva el puntero del ratón al borde superior central del área de disposición de los padres para que
se muestren las opciones centerHorizontal y alignParentTop (Figura 25-5).
Figura 25-5
Una vez colocado correctamente, liberar el fragmento para añadirlo a la disposición. Una vez añadido, un panel
de mensaje aparecerá (Figura 25-6) lo que indica que la herramienta Diseñador necesita saber qué fragmento
para mostrar durante la sesión de vista previa. Visualizar el fragmento ToolbarFragment haciendo clic en el uso
@ diseño / toolbar_fragment enlace dentro del mensaje:
Figura 25-6
Haga clic en el <fragmento> entrada en la sección de Uso de la paleta, una vez más, esta vez seleccionando la
entrada TextFragment desde el diálogo fragmento antes de hacer clic en el botón Aceptar. Mueva el puntero del
ratón hasta el centro de la distribución de modo que las propiedades centerHorizontal y centerVertical se activan
y liberar el fragmento. Cuando aparezca el mensaje de representación, haga clic en la opción Usar @ diseño /
text_fragment. Tenga en cuenta que los fragmentos son ahora visibles en la disposición como se demuestra en
la Figura 25-7:
Figura 25-7
Antes de proceder con el siguiente paso, haga doble clic en la instancia TextFragment en el diseño y, en el
panel resultante, cambiar el id del fragmento de @ + / Identificación del text_fragment.
com.ebookfrenzy.fragmentexample paquete;
android.os.Bundle importación;
android.support.v4.app.Fragment importación;
android.view.LayoutInflater importación;
android.view.View importación;
android.view.ViewGroup importación;
android.app.Activity importación;
android.widget.Button importación;
android.widget.EditText importación;
android.widget.SeekBar importación;
android.widget.SeekBar.OnSeekBarChangeListener importación;
@ Override
pública Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup, Bulto
savedInstanceState) {
// Inflar el diseño de este fragmento
Ver view = inflater.inflate (R.layout.toolbar_fragment,
contenedor, false);
seekbar.setOnSeekBarChangeListener (this);
vista regresar;
}
@ 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 tener un poco de tiempo para explicar los cambios en el código de arriba. En
primer lugar, la clase se declara como la implementación de la interfaz OnSeekBarChangeListener. Esto se
debe a que la interfaz de usuario contiene una instancia de SeekBar y el fragmento necesita recibir
notificaciones cuando el usuario desliza la barra para cambiar el tamaño de la fuente. Implementación de la
interfaz OnSeekBarChangeListener requiere que se apliquen los métodos onProgressChanged (),
onStartTrackingTouch () y onStopTrackingTouch (). Estos métodos se han aplicado, pero sólo el método
onProgressChanged () es realmente necesario para realizar una tarea, en este caso almacenar el nuevo valor
en un llamado seekvalue variable que ha sido declarado al comienzo de la clase. También declarado es una
variable en la que almacenar una referencia al objeto EditarTexto.
El método onCreateView () se ha modificado para obtener referencias al EditarTexto, SeekBar y puntos de vista
de los botones en el diseño. Una vez se ha obtenido una referencia al botón se utiliza para establecer un
OnClickListener en el botón que está configurado para llamar a un método llamado buttonClicked () cuando se
detecta un evento de clic. También entonces se implementa este método, aunque en este punto que no hace
nada.
La siguiente fase de este proceso es establecer el oyente que permitirá el fragmento para llamar a la actividad
cuando se hace clic en el botón. Esto sigue el mecanismo descrito en el capítulo anterior:
ToolbarListener activityCallback;
interfaz pública ToolbarListener {
onButtonClick void (posición int, String text) pública;
}
@ Override
public void onAttach (actividad Actividad) {
super.onAttach (actividad);
try {
activityCallback = actividad (ToolbarListener);
} Catch (ClassCastException e) {
throw new ClassCastException (activity.toString ()
+ "Debe implementar ToolbarListener");
}
}
@ Override
pública Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup, Bulto savedInstanceState) {
// Inflar el diseño de este fragmento
seekbar.setOnSeekBarChangeListener (this);
vista regresar;
}
com.ebookfrenzy.fragmentexample paquete;
android.support.v7.app.ActionBarActivity importación;
android.support.v4.app.FragmentActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
public class FragmentExampleActivity extiende FragmentActivity implementa
ToolbarFragment.ToolbarListener {
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_fragment_example);
}
}
.
.
.
}
Con los cambios de código en su estado actual, el fragmento de la barra de herramientas detectará cuando el
botón se hace clic por el usuario y llamar a un método de la actividad pasa por el contenido del campo
EditarTexto y la configuración actual de la vista SeekBar. Ahora es el trabajo de la actividad de comunicarse con
el fragmento de texto y pasar a lo largo de estos valores para que el fragmento se puede actualizar el objeto
TextView en consecuencia.
com.ebookfrenzy.fragmentexample paquete;
android.os.Bundle importación;
android.support.v4.app.Fragment importación;
android.view.LayoutInflater importación;
android.view.View importación;
android.view.ViewGroup importación;
android.widget.TextView importación;
@ Override
pública Vista onCreateView (LayoutInflater inflado,
Contenedor ViewGroup,
Bundle savedInstanceState) {
Ver view = inflater.inflate (R.layout.text_fragment,
contenedor, false);
vista regresar;
}
}
Cuando el fragmento TextFragment se colocó en el diseño 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. Editar el archivo FragmentExampleActivity.java y modificar el método
onButtonClick () como sigue:
TextFragment textFragment =
(TextFragment)
. getSupportFragmentManager () findFragmentById (R.id.text_fragment);
Prueba de la aplicación
Con la codificación para este proyecto ha finalizado, la última tarea que queda es ejecutar la aplicación. Cuando
se inicia la aplicación, la actividad principal se iniciará y, a su vez, crear y mostrar los dos fragmentos. Cuando el
usuario toca el botón de la barra de herramientas de fragmento, el método onButtonClick () de la actividad será
llamado por el fragmento de la 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 changeTextProperties () método del segundo fragmento,
que modificará el TextView para reflejar el nuevo texto y tamaño de fuente:
Figura 25-8
Resumen
El objetivo de este capítulo ha sido la de trabajar a través de la creación de un proyecto de ejemplo destinado
específicamente para demostrar los pasos involucrados en el uso de fragmentos dentro de una aplicación
Android. Los temas cubiertos incluyen el uso de la Biblioteca de compatibilidad de Android para la
compatibilidad con versiones de Android anteriores a la introducción de fragmentos, la inclusión de fragmentos
dentro de un diseño de la actividad y la puesta en práctica de la comunicación inter-fragmento.
25 Android estudio Maestro / Detalle Flujo Tutorial
Una comprensión clara de cómo utilizar fragmentos (como se indica en los capítulos anteriores) es esencial para
poder hacer uso de la plantilla de flujo de maestro / detalle. En este capítulo se aplicará ninguna de estas
habilidades para explicar el concepto de diseño de la interfaz de usuario maestro / detalle antes de explorar en
detalle los elementos que conforman la plantilla de flujo de maestro / detalle incluido con Android Studio. Por
último, un ejemplo de aplicación se creará que muestra los pasos involucrados en la modificación de la plantilla
a las necesidades específicas de los desarrolladores de aplicaciones.
Figura 26-1
El más pequeño, teléfono dimensionado dispositivos Android, la lista maestra ocupa toda la pantalla y el panel
de detalles aparece en una pantalla separada que aparece cuando se hace una selección de la lista
principal. En este modo, la pantalla de detalle incluye una barra de entrada de acción 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 teléfono 4 ":
Figura 26-2
Figura 26-3
La siguiente pantalla (Figura 26-4) ofrece la posibilidad de configurar los objetos que se mostrarán dentro de la
actividad de maestro / detalle. En el tutorial más adelante en este capítulo, 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 ajustes título a "sitios web".
Figura 26-4
Por último, haga clic en Finalizar para crear el nuevo Maestro / proyecto de aplicación basado Detalle Flow.
<Kind_name> ListActivity.java - Esta es la actividad principal del proyecto, cuyo objetivo es mostrar
la lista maestra para el usuario (la disposición de que se almacena en el archivo activity_ <kind_name>
_list.xml recurso fragmento XML) . Si la clase detecta que la pantalla es suficientemente grande 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 también implementa y configura el método de
devolución de llamada onItemSelected () que se llama cuando el usuario realiza una selección de la lista
principal. Es la responsabilidad de este método para crear y mostrar un ejemplo del panel de detalle.En el
caso del modo de dos paneles, el panel de detalles está a cargo de la creación de una instancia de la
<kind_name> clase DetailFragment y agregarlo a la actividad actual. En las pantallas de dispositivos más
pequeños, 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 aplicación se ejecuta en un dispositivo de pantalla lo suficientemente grande como para soportar
el modo de dos paneles.
fragment_ <kind_name> _detail.xml - El <kind_name> _detail interfaz de usuario del panel de detalle
que se muestra en el método de la clase <kind_name> DetailFragment onCreateView (). Por defecto, este
contiene una sola instancia de objeto TextView y se utiliza tanto en dos-panel y los modos de pantalla
pequeña.
@ Override
public String toString () {
volver website_name;
}
}
Tenga en cuenta que la clase DummyContent encapsular supone en la actualidad tres elementos en forma de
cadenas que se leía "Punto 1", "Sección 2" y "Sección 3":
static {
// Añadir 3 elementos de la muestra.
addItem (nuevo DummyItem ("1", "Punto 1"));
addItem (nuevo DummyItem ("2", "Artículo 2"));
addItem (nuevo DummyItem ("3", "Tema 3"));
}
Este código debe ser modificado para inicializar el modelo de datos con los datos del sitio web deseado:
static {
// Añadir 3 elementos de la muestra.
addItem (nuevo DummyItem ("1", "eBookFrenzy",
"Http://www.ebookfrenzy.com"));
addItem (nuevo DummyItem ("2", "Amazonas",
"Http://www.amazon.com"));
addItem (nuevo DummyItem ("3", "Wikipedia",
"Http://www.wikipedia.org"));
}
Ahora, el código se aprovecha de la clase DummyItem modificado para almacenar un ID, nombre del sitio web y
la URL de cada artículo.
Figura 26-5
Haga doble clic en la instancia WebView en el diseño y, en el panel resultante, cambie el ID del componente que
@ + / Identificación del website_detail.
com.ebookfrenzy.masterdetailflow paquete;
android.os.Bundle importación;
android.support.v4.app.Fragment importación;
android.view.LayoutInflater importación;
android.view.View importación;
android.view.ViewGroup importación;
android.widget.TextView importación;
com.example.masterdetailflow.dummy.DummyContent importación;
Ver rootView =
inflater.inflate (R.layout.fragment_website_detail,
contenedor, false);
volver rootView;
}
Con el fin de cargar la página web URL correspondiente al elemento seleccionado en la actualidad sólo una
línea de código que hay que cambiar. Una vez que se ha realizado este cambio, el método debe ser el siguiente
(nota también la incorporación de la directiva de importación para la biblioteca android.webkit.WebView):
com.ebookfrenzy.masterdetailflow paquete;
android.os.Bundle importación;
android.support.v4.app.Fragment importación;
android.view.LayoutInflater importación;
android.view.View importación;
android.view.ViewGroup importación;
android.widget.TextView importación;
android.webkit.WebView importación;
com.example.masterdetailflow.masterdetailflow.dummy.DummyContent importación;
Todo lo que este cambio hace es encontrar la visión con el ID de website_detail (esto fue formalmente la
TextView pero ahora es un WebView), extrae la dirección URL del sitio web desde el elemento seleccionado y
encarga al objeto WebView para cargar la página.
<Application
android: allowBackup = "true"
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl"
android: theme = "@ style / AppTheme">.
.
.
</ Manifiesto>
Ejecutar la aplicación
Compila y ejecuta la aplicación en un emulador configurado adecuadamente o un dispositivo Android
conectado. Dependiendo del tamaño de la pantalla, la aplicación aparecerá ya sea en pequeña 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
correspondiente aparezca en el panel de detalles, como se ilustra en el modo de dos paneles en la Figura 26-6:
Figura 26-6
Resumen
Una interfaz de usuario maestro / detalle consiste en una lista maestra de artículos que, cuando se selecciona,
muestran información adicional acerca de que la selección dentro de un panel de detalles. El maestro / detalle
Flow es una plantilla proporcionada con Android Studio que permite una disposición maestro / detalle que se
creará de forma rápida y con relativa facilidad. Como se ha demostrado en este capítulo, con modificaciones
menores a los archivos de plantilla por defecto, una amplia gama de maestro / detalle funcionalidad basada
puede ser implementado con la codificación mínima y esfuerzo de diseño.
26 Creación y administración de desbordamiento de los
menús en Android Estudio
Un espacio de diseño de la interfaz de usuario que aún no ha sido cubierto en este libro se relaciona con el
concepto de menús dentro de una aplicación Android. Menús proporcionan un mecanismo para ofrecer opciones
adicionales para el usuario más allá de los componentes de vista que están presentes en el diseño de interfaz
de usuario.Aunque hay un número de diferentes sistemas de menú disponibles para el desarrollador de
aplicaciones Android, este capítulo se centrará en el menú Desbordamiento más comúnmente utilizado.
menú de desbordamiento
El menú de desbordamiento (también 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 aplicación más
allá de los incluidos en la interfaz de usuario de la aplicación. La ubicación del menú de desbordamiento
depende de la versión 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 búsqueda) de la barra de herramientas tecla inferior como se ilustra en la Figura 27-
1:
Figura 27-1
Con el lanzamiento de Android 4.0 y posteriores, por el contrario, el menú de desbordamiento se encuentra en la
esquina superior derecha (Figura 27-2) en la barra de herramientas de la acción representada por la pila de tres
plazas:
Figura 27-2
En el XML anterior, el androide: propiedad orderInCategory dicta el orden en el que aparecerán 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
acción. Si se establece en ifRoom, por ejemplo, el artículo aparecerá en la barra de acción si no hay suficiente
espacio. La figura 27-3 muestra el efecto de establecer esta propiedad en ifRoom para ambos elementos del
menú:
Figura 27-3
Esta propiedad se debe utilizar con moderación para evitar el exceso de abarrotar la barra de acción.
De forma predeterminada, un archivo XML menú es creado por Android Studio cuando se crea un nuevo
proyecto de aplicación para Android. Este archivo se encuentra en el src -> principal -> res -> carpeta del
proyecto de menús y contiene un elemento de menú único titulado "Ajustes":
Este menú ya está configurado para que aparezca cuando el usuario selecciona el menú de desbordamiento en
la interfaz de usuario cuando la aplicación se está ejecutando, por lo que simplemente modificar éste para
satisfacer sus necesidades.
@ Override
public boolean onCreateOptionsMenu (menú Menú) {
. getMenuInflater () inflar (R.menu.activity_menu_app, menú);
return true;
}
Al igual que con el archivo de menú XML, Android Estudio ya se habrá anulado este método en la actividad
principal de un proyecto de aplicación de Android que acaba de crear.En el caso de que un menú de
desbordamiento no se requiere en su actividad, ya sea quitar o comente este método.
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
interruptor (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);
}
}
Cuando un grupo de menú está configurado para ser comprobable, un pequeño círculo aparece junto al
elemento en el menú, como se ilustra en la Figura 27-4. Es importante tener en cuenta que la conexión y la
desconexión de este indicador no se realiza de forma automática. Es, por lo tanto, la responsabilidad de la
aplicación para comprobar y desmarque la opción de menú.
Figura 27-4
Siguiendo con el ejemplo del color utilizado anteriormente en este capítulo, esto se llevaría a cabo de la
siguiente manera:
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
interruptor (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;
por defecto:
volver super.onOptionsItemSelected (punto);
}
}
Crear el proyecto de ejemplo
Para ver el menú de desbordamiento en la acción, crear un nuevo proyecto en Android de estudio, entrar
MenuExample en el campo Nombre de la aplicación y ebookfrenzy.com como el ajuste de dominio de la
empresa antes de hacer clic en el botón Siguiente.
En la pantalla de factores de forma, activar la opción de teléfono y la tableta y activar el ajuste de API 8 SDK
mínimo: Android 2.2 (Froyo). Continuar para avanzar a través de las pantallas, solicitando la creación de una
actividad en blanco denominada MenuExampleActivity con una disposición correspondiente llamado
activity_menu_example.
Cuando se ha creado el proyecto, vaya a la MenuExample -> aplicación -> src -> principal -> res -> carpeta de
diseño 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 . Encienda la herramienta al modo, haga doble clic en el
fondo de la disposición (el área que representa la vista RelativeLayout) Diseñar e introducir layoutView en el
campo id de la emergente del panel.
<Item
android: id = "@ + / Identificación del menu_green"
android: orderInCategory = "2"
android: showAsAction = "nunca"
android: title = "@ string / green_string" />
<Item
android: id = "@ + / Identificación del menu_yellow"
android: orderInCategory = "3"
android: showAsAction = "nunca"
android: title = "@ string / yellow_string" />
<Item
android: id = "@ + / Identificación del menu_blue"
android: orderInCategory = "4"
android: showAsAction = "nunca"
android: title = "@ string / blue_string" />
</ Group>
</ Menú>
Busque y haga doble clic en la aplicación -> src -> principal -> res -> Valores -> archivo strings.xml. Dentro del
archivo, añadir nuevos recursos de cadena para los nombres de color según se menciona por los elementos del
menú:
com.ebookfrenzy.menuexample paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.widget.RelativeLayout importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_menu_example);
}
@ Override
public boolean onCreateOptionsMenu (menú Menú) {
// Inflar el menú; esto agrega elementos a la barra de acción si está
presente.
. getMenuInflater () inflar (R.menu.menu_example, menú);
return true;
}
@ Override
public boolean onOptionsItemSelected (elemento MenuItem) {
RelativeLayout mainLayout =
(RelativeLayout) findViewById (R.id.layoutView);
}
.
.
}
Prueba de la aplicación
Genere y ejecute la aplicación a ambos un emulador o dispositivo Android física. 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 el elemento activado en el
menú.
Figura 27-5
Resumen
En las versiones anteriores de Android, el menú de desbordamiento es accesible desde la barra de
herramientas tecla de función 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 barra de herramientas en la parte superior de la
pantalla. Este menú ofrece una ubicación para aplicaciones para proporcionar opciones adicionales para el
usuario.
La estructura del menú se define más fácilmente dentro de un archivo XML y la actividad de la aplicación recibe
notificaciones de las selecciones de elementos de menú por razones imperiosas e implementar el método
onOptionsItemSelected ().
27 Animación de interfaces de usuario en Android Studio
usando el Marco Transiciones
El marco Transiciones Android fue introducido como parte de la versión Android 4.4 KitKat y está diseñada para
hacer más fácil para usted, como un desarrollador de Android, añadir efectos de animación a las opiniones que
conforman las pantallas de las aplicaciones. Como se indica en ambos éste y los siguientes capítulos, efectos
animados tales como hacer las visitas en una interfaz de usuario se desvanecen suavemente dentro y fuera de
la vista y se deslizan suavemente a nuevas posiciones en la pantalla se puede implementar con sólo unos
simples líneas de código cuando utilizando el marco de transiciones en Android Studio.
<Botón
android: id = "@ + / Identificación del botón 1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_alignParentLeft = "true"
android: layout_alignParentTop = "true"
android: onClick = "goToScene2"
android: text = "@ string / one_string" />
<Botón
android: id = "@ + / Identificación del button2"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_alignParentRight = "true"
android: layout_alignParentTop = "true"
android: onClick = "goToScene1"
android: text = "@ string / two_string" />
<Botón
android: id = "@ + / Identificación del button3"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_centerHorizontal = "true"
android: layout_centerVertical = "true"
android: text = "@ string / three_string" />
</ RelativeLayout>
Suponiendo que el diseño anterior reside en un archivo llamado scene1_layout.xml ubicado en la carpeta res /
layout del proyecto, el diseño se puede cargar en una escena utilizando el método getSceneForLayout () de la
clase de escena. Por ejemplo:
Tenga en cuenta que la llamada al método requiere una referencia al contenedor raíz. Esta es la vista en la
parte superior de la jerarquía de la vista en la que la escena se va a mostrar.
Para mostrar una escena para el usuario sin ninguna animación de transición, la tecla ENTER () método se
llama en la instancia de escena:
scene1.enter ();
Las transiciones entre dos escenas usando la clase AutoTransition defecto se pueden activar utilizando el
método go () de la clase TransitionManager:
TransitionManager.go (scene2);
Casos de escena se pueden crear fácilmente en código agrupando los elementos de la vista en uno o más
ViewGroups y luego la creación de una escena de esos grupos. Por ejemplo:
Esta nueva transición a continuación, se puede utilizar cuando se realiza una transición:
Múltiples transiciones pueden ser agrupados juntos en una instancia TransitionSet. El siguiente código, por
ejemplo, crea un nuevo objeto TransitionSet consistente en ambos límites de cambio y efectos de transición de
fundido:
Las transiciones pueden ser configurados para apuntar vistas específicas (referenciados por una vista de
ID). Por ejemplo, el código siguiente configurará la transición de fundido anterior sólo estén dirigidos a la vista
con un ID que coincide myButton1:
Aspectos adicionales de la transición también pueden ser personalizados, tales como la duración de la
animación. El código siguiente especifica la duración sobre los que la animación se va a realizar:
Al igual que con el enfoque basado en código para trabajar con transiciones, cada entrada de transición en un
archivo de recursos puede ser personalizado. El XML a continuación, por ejemplo, configura una duración para
una transición de cambio de límites:
<Fade
android: duración = "2000"
android: fadingMode = "fade_out" />
<changeBounds
android: duración = "5000">
<objetivos>
<Androide objetivo: targetId = "@ id / button2" />
</ objetivos>
</ ChangeBounds>
<Fade
android: duración = "2000"
android: fadingMode = "fade_in" />
</ TransitionSet>
Transiciones contenidas dentro de un archivo de recursos XML deben guardarse en la carpeta res / transición
del proyecto en el que están siendo utilizados y deben ser inflados antes de ser referencia en el código de una
aplicación. El siguiente código, por ejemplo, infla los recursos de transición contenidos en un archivo llamado
transition.xml y asigna los resultados a una referencia con nombre myTransition:
Una vez inflado, la nueva transición se puede hacer referencia en la forma habitual:
<TransitionSet
xmlns: android = "http://schemas.android.com/apk/res/android"
android: transitionOrdering = "secuencial">
<Fade
android: duración = "2000"
android: fadingMode = "fade_out" />
<changeBounds
android: duración = "5000">
</ ChangeBounds>
</ TransitionSet>
Cambie el valor de "secuencial" para "juntos" para indicar que las secuencias de animación se han de realizar
en paralelo.
AccelerateDecelerateInterpolator ()
AccelerateInterpolator (factor de flotación)
AnticipateInterpolator (tensión de flotación)
AnticipateOvershootInterpolator (tensión de flotación)
BounceInterpolator ()
CycleInterpolator (ciclos float)
DecelerateInterpolator (factor de flotación)
LinearInterpolator ()
OvershootInterpolator (tensión de flotación)
Una vez creado, una instancia interpolador se puede conectar a una transición utilizando el método
setInterpolator () de la clase de transición. El siguiente código, por ejemplo, agrega un interpolador rebote para
una transición de cambio de límites:
Del mismo modo, el código siguiente añade un interpolador acelerar a la misma transición, especificando un
factor de aceleración de 1,2:
En el caso de los recursos de transición basados en XML, un interpolador predeterminada se declara con la
siguiente sintaxis:
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 transición de cambio de límites
contenida dentro de un conjunto de transición:
<changeBounds
android: interpolador = "@ android: anim / bounce_interpolator"
android: duración = "2000" />
<Fade
android: duración = "1000"
android: fadingMode = "fade_in" />
</ TransitionSet>
Este enfoque de la adición de interpoladores a las transiciones dentro de los recursos XML funciona bien
cuando se requiere que el comportamiento predeterminado del interpolador. La tarea se vuelve un poco más
compleja cuando el comportamiento predeterminado de un interpolador necesita ser cambiado. Tomemos, por el
bien de un ejemplo, el interpolador ciclo. El propósito de este interpolador es hacer una animación o de
transición repiten un número 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 número de ciclos
(o cualquier otro atributo interpolador para el caso) cuando se añade un interpolador utilizando la técnica
anterior. En cambio, un interpolador personalizado debe ser creado y luego hace referencia en el archivo de
transición.
En la sintaxis anterior, interpolatorElement debe ser reemplazado con 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 tensión para cambiar el atributo de la tensión de un interpolador exceso). 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: androide = "http://schemas.android.com/apk/res/android"
android: ciclos = "7" />
Suponiendo que el XML anterior se almacena en un archivo de recursos denominado my_cycle.xml almacenado
en la carpeta / proyecto anim res, el interpolador costumbre podría añadirse a un archivo de recursos de
transición con la siguiente sintaxis XML:
<changeBounds
xmlns: android = "http://schemas.android.com/apk/res/android"
android: duración = "5000"
android: interpolador = "@ anim / my_cycle">
Resumen
El Android 4.4 SDK liberación KitKat introdujo el Marco de transición, cuyo objetivo es simplificar la tarea de
añadir animación a los puntos de vista que componen la interfaz de usuario de una aplicación Android. Con un
poco de configuración sencilla y unas pocas líneas de código, efectos de animación tales como el movimiento, la
visibilidad y el cambio de tamaño de puntos de vista pueden ser animados mediante el uso del marco de
transición. Una serie de diferentes enfoques para las transiciones de aplicación están disponibles implica una
combinación de código y los archivos de recursos XML Java. Los efectos de animación de transiciones también
se pueden mejorar mediante el uso de una gama de interpoladores.
Después de haber cubierto algunos de la teoría de las transiciones en Android, los dos capítulos siguientes se
ponga en práctica esta teoría trabajando a través de algunas implementaciones de transición basados ejemplo
Android Studio.
com.ebookfrenzy.transitiondemo paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.MotionEvent importación;
android.view.View importación;
android.view.ViewGroup importación;
android.widget.RelativeLayout importación;
ViewGroup myLayout;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_transition_demo);
myLayout.setOnTouchListener (
nueva RelativeLayout.OnTouchListener () {
public boolean onTouch (Ver v,
MotionEvent m) {
handleTouch ();
return true;
}
}
);
}
.
.
.
}
El código anterior simplemente establece un oyente contacto en el recipiente RelativeLayout y lo configura para
llamar a un método llamado handleTouch () cuando se detecta un toque. La siguiente tarea, por lo tanto, es
poner en práctica el método handleTouch () como sigue:
params.addRule (RelativeLayout.ALIGN_PARENT_RIGHT,
RelativeLayout.TRUE);
params.addRule (RelativeLayout.ALIGN_PARENT_BOTTOM,
RelativeLayout.TRUE);
view.setLayoutParams (params);
lparams.width = 500;
lparams.height = 350;
view.setLayoutParams (lparams);
}
Este método obtiene una referencia a la opinión de botón en el diseño de la interfaz de usuario y crea un nuevo
conjunto de reglas de parámetros de diseño diseñados para mover el botón de la esquina inferior derecha de la
disposición de los padres y para aumentar las dimensiones del botón. Una vez creados, estos nuevos
parámetros se aplican al botón.
Pruebe el código hasta el momento por compilar y ejecutar la aplicación. Una vez puesto en marcha, toque el
fondo (no el botón) y observe que el botón se mueve y cambia el tamaño, como se ilustra en la Figura 29-1:
Figura 29-1
Aunque los cambios en la disposición entró en vigor, lo hicieron de forma instantánea y sin ningún tipo de
animación. Aquí es donde la llamada al método beginDelayedTransition () de la clase TransitionManager entra.
Todo lo que se necesita para agregar animación a este cambio de diseño es la adición de una sola línea de
código antes de implementar los cambios de diseño. Permanecer dentro del archivo
TransitionDemoActivity.java, modifique el código de la siguiente manera:
com.ebookfrenzy.transitiondemo paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.MotionEvent importación;
android.view.View importación;
android.view.ViewGroup importación;
android.widget.RelativeLayout importación;
android.transition.TransitionManager importación;
TransitionManager.beginDelayedTransition (myLayout);
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 aplicación una vez más y tenga en cuenta que la transición es ahora animado.
Personalización de la Transición
La tarea final en este ejemplo es modificar la transición changeBounds de modo que se realiza sobre una
duración más larga e incorpora un efecto de rebote cuando la vista alcanza su nueva ubicación de la
pantalla. Esto implica la creación de una instancia de Transición con la configuración del interpolador de
duración apropiada, que es, a su vez, pasa a través de un argumento al método beginDelayedTransition ():
com.ebookfrenzy.transitiondemo paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.MotionEvent importación;
android.view.View importación;
android.view.ViewGroup importación;
android.widget.RelativeLayout importación;
android.transition.TransitionManager importación;
android.transition.ChangeBounds de importación;
android.transition.Transition importación;
android.view.animation.BounceInterpolator importación;
TransitionManager.beginDelayedTransition (myLayout,
changeBounds);
TransitionManager.beginDelayedTransition (myLayout);
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 aplicación, la animación será más lento para que coincida con el nuevo ajuste de la
duración y el botón saltará al llegar a la esquina inferior derecha de la pantalla.
Resumen
La forma más básica de la animación de transición implica el uso del método beginDelayedTransition () de la
clase TransitionManager. Una vez llamada, cualquier cambio en el tamaño y la posición de los puntos de vista
en el siguiente fotograma renderizado interfaz de usuario, y dentro de un grupo vista definida, estarán animados
usando las transiciones especificadas. En este capítulo se ha trabajado a través de un ejemplo sencillo Android
estudio que demuestra el uso de este enfoque a las transiciones de ejecución.
29 Ejecución Escena Android Transiciones - Un Estudio
Android Tutorial
Arrastre un segundo punto de vista Botón de la paleta y colóquelo en la esquina superior derecha de la vista de
diseño de modo que las propiedades alignParentRight y alignParentTop se muestran antes de bajar la vista en
su lugar. La repetición de los pasos para el primer botón, asignar el texto que dice "Dos" al botón y extraer en un
recurso de cadena denominada y two_string.
Arrastre un tercer punto de vista de Button y colocarlo de manera que quede centrado tanto horizontal como
verticalmente dentro del diseño, esta vez la configuración de una llamada three_string recurso de cadena que
dice "Tres". Al completar los pasos anteriores, el diseño de la primera escena debe ser similar a la que se
muestra en la Figura 30-2:
Figura 30-2
Encienda la herramienta Diseñador de modo de texto para editar directamente los recursos de XML para el
diseño. Verifique que coincida con el XML que se enumeran a continuación antes de añadir las propiedades
OnClick en el primer y segundo botón. Estos métodos se ejecutarán después de activar las transiciones de una
escena a otra:
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / one_string"
android: id = "@ + / Identificación del botón"
android: layout_alignParentTop = "true"
android: layout_alignParentLeft = "true"
android: layout_alignParentStart = "true"
android: onClick = "goToScene2" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / two_string"
android: id = "@ + / Identificación del button2"
android: layout_alignParentTop = "true"
android: layout_alignParentRight = "true"
android: layout_alignParentEnd = "true"
android: onClick = "goToScene1" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / three_string"
android: id = "@ + / Identificación del button3"
android: layout_centerVertical = "true"
android: layout_centerHorizontal = "true" />
</ RelativeLayout>
Figura 30-3
Interruptor Designer para el modo de texto y compruebe que coincide con el XML que se enumeran a
continuación:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / one_string"
android: id = "@ + / Identificación del botón"
android: onClick = "goToScene2"
android: layout_alignParentBottom = "true"
android: layout_alignParentRight = "true"
android: layout_alignParentEnd = "true" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / two_string"
android: id = "@ + / Identificación del button2"
android: onClick = "goToScene1"
android: layout_alignParentBottom = "true"
android: layout_alignParentLeft = "true"
android: layout_alignParentStart = "true" />
</ RelativeLayout>
com.ebookfrenzy.scenetransitions paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.transition.Scene importación;
android.transition.Transition importación;
android.transition.TransitionManager importación;
android.view.ViewGroup importación;
android.view.View importación;
ViewGroup rootContainer;
Scene1 escena;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_scene_transitions);
rootContainer =
(ViewGroup) findViewById (R.id.rootContainer);
scene1.enter ();
}
.
.
}
El código añadido a la clase de actividad declara algunas variables en el que almacenar referencias al
contenedor raíz y primera escena y obtiene una referencia a la vista contenedor raíz. El método
getSceneForLayout () de la clase de escena se utiliza entonces para crear una escena de la disposición
contenida en el archivo scene1_layout.xml para convertir ese diseño en una escena. La escena se introduce a
continuación a través de la tecla ENTER () llamada al método de manera que se muestra al usuario.
Compilar y ejecutar la aplicación en este punto y verificar que la escena 1 se muestra después de la aplicación
ha puesto en marcha.
Cargando Escena 2
Antes de la aplicación de la transición entre la primera y segunda escena es primero necesario añadir algo de
código para cargar la disposición del archivo scene2_layout.xml en una instancia de escena. Permanecer en el
archivo SceneTransitionsActivity.java, por lo tanto, agregar el código de la siguiente manera:
ViewGroup rootContainer;
Scene1 escena;
Scene2 escena;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_scene_transitions);
rootContainer =
(ViewGroup) findViewById (R.id.rootContainer);
scene1.enter ();
}
.
.
}
Ejecute la aplicación y observe que la selección de los dos primeros botones hace que la disposición para
cambiar entre las dos escenas. Dado que todavía tenemos que configurar ninguna transición, estos cambios de
diseño aún no están animados.
<TransitionSet
xmlns: android = "http://schemas.android.com/apk/res/android">
<changeBounds
android: duración = "2000">
</ ChangeBounds>
</ TransitionSet>
com.ebookfrenzy.scenetransitions paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.transition.Scene importación;
android.transition.Transition importación;
android.transition.TransitionInflater importación;
android.transition.TransitionManager importación;
android.view.ViewGroup importación;
android.view.View importación;
ViewGroup rootContainer;
Scene1 escena;
Scene2 escena;
TransitionMgr Transición;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_scene_transitions);
rootContainer =
(ViewGroup) findViewById (R.id.rootContainer);
scene1.enter ();
}
Cuando la aplicación está ahora ejecutar los dos botones se deslizarán suavemente a sus nuevas posiciones
durante la transición.
<TransitionSet
xmlns: android = "http://schemas.android.com/apk/res/android"
android: transitionOrdering = "secuencial">
<Fade
android: duración = "2000"
android: fadingMode = "fade_in">
<objetivos>
<Androide objetivo: targetId = "@ id / button3" />
</ objetivos>
</ Fade>
<changeBounds
android: duración = "2000"
android: interpolador = "@ android: anim / bounce_interpolator">
</ ChangeBounds>
</ TransitionSet>
Botones uno y dos ahora rebotarán al llegar a los destinos finales y tres botones se desvanecen suavemente a
la vista durante la transición a la escena 1 de la escena 2.
Tómese su tiempo para experimentar con diferentes transiciones y interpoladores al hacer cambios en el archivo
transition.xml y volver a ejecutar la aplicación.
Resumen
Transiciones basadas Escena proporcionan un enfoque flexible para la animación de los cambios de diseño de
interfaz de usuario de una aplicación Android. En este capítulo se ha demostrado los pasos implicados en la
animación de la transición entre las escenas representadas por dos archivos de recursos de diseño. Además, el
ejemplo también se utiliza un archivo de recursos XML transición para configurar los efectos de animación de
transición entre las dos escenas.
Intenciones explícitos
Una intención explícita solicita la puesta en marcha de una actividad específica haciendo referencia al nombre
del componente (que es en realidad el nombre de la clase Java) de la actividad de destino. Este enfoque es más
común en el lanzamiento de una actividad que reside en la misma aplicación que la actividad de envío (desde el
nombre de clase Java se sabe que el desarrollador de aplicaciones).
Una intención explícita es emitida por la creación de una nueva instancia de la clase Intención, pasando por el
contexto de actividad y el nombre del componente de la actividad que se lanzará. Luego se hace una llamada al
método startActivity (), pasando a través del objeto intención como argumento. Por ejemplo, el siguiente
fragmento de código emite una intención para la actividad con el nombre de la clase ActivityB para ser lanzado:
Los datos pueden ser transmitidos a la actividad receptora mediante la adición de al objeto intención antes de
que se inicia a través de llamadas al método putExtra () del objeto de la intención. Los datos deben ser añadidos
en forma de pares clave-valor. El siguiente código se extiende el ejemplo anterior para agregar valores de
cadena y enteros con las teclas "miCadena" y "myInt", respectivamente, a la intención:
startActivity (i);
Los datos se recibe en la actividad de destino como parte de un objeto Bundle que se puede obtener a través de
una llamada a getIntent (). GetExtras (). El método getIntent () de la clase Actividad devuelve la intención de que
comenzó la actividad, mientras que los getExtras método () (de la clase Intención) devuelve un objeto de
paquete para que la intención que contiene los datos. Por ejemplo, para extraer los valores de los datos
pasados a ActivityB:
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 aplicación, es esencial que esas
actividades se enumeran en el archivo de manifiesto de aplicación. Los siguientes contenidos
AndroidManifest.xml están configurados correctamente para una aplicación que contiene las actividades
nombradas ActivityA y ActivityB:
<Application
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl">
<Actividad
android: label = "@ string / nombre_apl"
android: name = "com.ebookfrenzy.intent1.intent1.ActivityA">
<Intención de filtro>
<Acción android: name = "android.intent.action.MAIN" />
<Categoría android: name = "android.intent.category.LAUNCHER" />
</ Intención de filtro>
</ Actividad>
<Actividad
android: name = "ActivityB"
android: label = "ActivityB">
</ Actividad>
</ Application>
</ Manifiesto>
Con el fin de devolver los datos a la actividad de los padres, la subactividad debe implementar el método de
acabado (), cuyo propósito es crear un nuevo objeto de la intención que contiene los datos que se devuelve, y
luego llamar al método setResult () de la que encierra la actividad, pasando a través de un código de resultado y
la intención que contiene los datos de retorno. El código de resultado es típicamente RESULT_OK o
RESULT_CANCELED, pero también puede ser un valor personalizado con sujeción a los requisitos de la
promotora. En el caso de que se bloquea un sub-actividad, la actividad padre recibirá un código de resultado
RESULT_CANCELED.
El siguiente código, por ejemplo, ilustra el código de un típico acabado subactividad () método:
Con el fin de obtener y extraer los datos devueltos, la actividad de los padres debe implementar el método
onActivityResult (), por ejemplo:
Tenga en cuenta que el método anterior comprueba el valor del código de petición vuelta para asegurarse de
que coincide con que pasó por el método () startActivityForResult. Al iniciar múltiples sub-actividades es
especialmente importante utilizar el código de solicitud para realizar un seguimiento que la actividad se
encuentra actualmente a la búsqueda, ya que todo se llame al método mismo onActivityResult () en la salida.
Intenciones implícitos
A diferencia de las intenciones explícitas, que hacen referencia al nombre de la clase Java de la actividad que
se lanzarán, las intenciones implícitas identificar la actividad que se lanzará al especificar la acción a realizar y el
tipo de datos que se maneja la actividad de recepción. Por ejemplo, un tipo de acción de ACTION_VIEW
acompañado de la URL de una página 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 intención implícita
será, cuando se ejecuta en un dispositivo Android, resultará en la página web designada que aparece en una
actividad del navegador web Chrome:
Cuando la intención implícita 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 mediante un proceso denominado resolución como intención. En el caso de que un solo partido
se encuentra, se pondrá en marcha esa actividad. Si se encuentra más de una coincidencia, el usuario se le
pedirá que elija entre las opciones de actividad disponibles.
El archivo AndroidManifest.xml siguiente ilustra una configuración para una actividad denominada
WebViewActivity con filtros intención y permisos activados para acceso a Internet:
<Application
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl">
<Actividad
android: label = "@ string / nombre_apl"
android: name = ". WebViewActivity">
<Intención de filtro>
<Acción android: name = "android.intent.action.VIEW" />
<Categoría android: name = "android.intent.category.DEFAULT" />
<Androide datos: scheme = "http" />
</ Intención de filtro>
</ Actividad>
</ Application>
</ Manifiesto>
Resumen
Intenciones son el mecanismo de mensajería mediante el cual una actividad Android puede lanzar otro. Una
intención explícita referencia a una actividad específica que se lanzará por referencia a la actividad de recepción
por nombre de la clase. Intentos explícitos son típicamente, aunque no exclusivamente, utiliza al iniciar las
actividades contenidas en la misma aplicación. Una intención implícita especifica la acción a realizar y el tipo de
datos para ser manipulados y permite que el tiempo de ejecución de Android encontrar una intención a juego
para lanzar. Intenciones implícitas se utilizan generalmente en el lanzamiento de las actividades que residen en
diferentes aplicaciones.
Una actividad puede enviar datos a la actividad de recepción por la agrupación de datos en el objeto de la
intención en forma de pares clave-valor. Los datos sólo se puede devolver desde una actividad si se inicia como
un sub-actividad de la actividad de envío.
Actividades anuncian capacidades al proceso de resolución de la intención de Android a través de la
especificación de la intención de los filtros en el archivo de manifiesto de aplicación. Ambas actividades que
envían y reciben también deben solicitar los permisos adecuados para realizar tareas tales como el acceso a la
base de datos de contactos del dispositivo o internet.
Después de haber cubierto la teoría de las intenciones, los próximos capítulos trabajarán a través de la creación
de algunos ejemplos en Android estudio que ponen las intenciones explícitas e implícitas en acción.
31 Intenciones explícitos Android - Un Estudio Android
Ejemplo
El capítulo titulado Una Visión General de Intenciones en Android estudio cubrió la teoría del uso de los destinos
para iniciar actividades. En este capítulo se pondrá en práctica esta teoría a través de la creación de una
aplicación de ejemplo.
El ejemplo de proyecto de aplicación Android estudio creado en este capítulo demostrará el uso de una
intención explícita para iniciar una actividad, incluida la transferencia de datos entre el envío y la recepción de
las actividades. El siguiente capítulo ( Intenciones implícitos Android - Un Ejemplo Android Estudio ) demostrará
el uso de las intenciones implícitas.
<TextView
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: textAppearance = "android:? attr / textAppearanceLarge"
android: text = "Texto grande"
android: id = "@ + / Identificación del textView1"
android: layout_centerVertical = "true"
android: layout_centerHorizontal = "true" />
<EditarTexto
android: layout_width = "200dp"
android: layout_height = "wrap_content"
android: id = "@ + / Identificación del editText1"
android: layout_above = "@ + / Identificación del textView1"
android: layout_centerHorizontal = "true"
android: layout_marginBottom = "77dp" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "Hacer Pregunta"
android: id = "@ + / Identificación del botón 1"
android: layout_below = "@ + / Identificación del textView1"
android: layout_centerHorizontal = "true"
android: onClick = "onClick"
android: layout_marginTop = "56dp" />
</ RelativeLayout>
Como cubierto de una visión general y Android Estudio Ejemplo de Manejo Android Evento , el androide: onClick
= "onClick" línea 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 código Java de la actividad. Al especificar el
tipo de evento onClick y el método que se llamará cuando se detecta un evento, es rápido y fácil de cablear
básico clic manejo de eventos en una vista. Una vez que el método onClick () se ha implementado en el archivo
ActivityA.java, será llamado cada vez que el botón es tocado por el usuario.
Una vez que el diseño es completa, la interfaz de usuario debe parecerse a la que se ilustra en la Figura 32-1:
Figura 32-1
Introduzca ActivityB en los campos Nombre y título de la actividad y el nombre de la activity_b diseño. Debido a
que no se pondrá en marcha esta actividad cuando se inicia la aplicación (en su lugar se pondrá en marcha a
través de una intención por ActivityA cuando se pulsa el botón), es importante asegurarse de que la opción
Actividad Launcher está desactivada antes de hacer clic en el botón Finalizar.
<Botón
android: id = "@ + / Identificación del botón 1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_below = "@ + / Identificación del editText1"
android: layout_centerHorizontal = "true"
android: layout_marginTop = "86dp"
android: onClick = "onClick"
android: text = "@ string / answer_text" />
<TextView
android: id = "@ + / Identificación del textView1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_alignParentTop = "true"
android: layout_centerHorizontal = "true"
android: layout_marginTop = "35dp"
android: text = "Texto grande"
android: textAppearance = "android:? attr / textAppearanceLarge" />
<EditarTexto
android: id = "@ + / Identificación del editText1"
android: layout_width = "300DP"
android: layout_height = "wrap_content"
android: layout_below = "@ + / Identificación del textView1"
android: layout_centerHorizontal = "true"
android: layout_marginTop = "66dp"
android: ems = "10"
android: InputType = "text" />
</ RelativeLayout>
Si el diseño del trazado con la herramienta de diseño en modo de diseño, tenga en cuenta que la propiedad
onClick en la opinión de botón se ha configurado para llamar a un método 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 disposición completado debe parecerse a la que se ilustra en la Figura 32-2:
Figura 32-3
<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">
<Intención de filtro>
<Acción android: name = "android.intent.action.MAIN" />
</ Application>
</ Manifiesto>
Con la segunda actividad creada y que figuran en el archivo de manifiesto, ahora es tiempo para escribir algo de
código en la clase ActivityA emitir la intención.
Creación de la Intención
El objetivo para ActivityA es para crear e iniciar un intento cuando el usuario toca el botón "Hacer
Pregunta". Como parte del proceso de creación de la intención, se agregará la cadena pregunta introducida por
el usuario en la vista EditarTexto al objeto intención como un par clave-valor. Cuando se creó el diseño de la
interfaz de usuario para ActivityA, el objeto de botón se ha configurado para llamar a un método llamado onClick
() cuando "clic" por el usuario. Este método necesita ahora para ser añadido al archivo de origen ActivityA.java
clase ActivityA como sigue:
com.ebookfrenzy.explicitintent paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.content.Intent importación;
android.view.View importación;
android.widget.EditText importación;
android.widget.TextView importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_a);
}
El código para el método onClick () sigue las técnicas descritas en una visión general de Intenciones
Android. En primer lugar, se crea una nueva instancia de Intención, que pasa a través de la actividad actual y el
nombre de la clase de ActivityB como argumentos. A continuación, el texto introducido en el objeto EditarTexto
se añade al objeto intención como un par clave-valor y la intención inicia a través de una llamada a startActivity
(), pasando a través del objeto intención como argumento.
Compila y ejecuta la aplicación y pulse el botón "Hacer Pregunta" para iniciar ActivityB y el botón Atrás para
volver a ActivityA.
com.ebookfrenzy.explicitintent paquete;
android.app.Activity importación;
android.os.Bundle importación;
android.content.Intent importación;
android.view.View importación;
android.widget.TextView importación;
android.widget.EditText importación;
Compila y ejecuta la aplicación, ya sea dentro de un emulador o en un dispositivo Android física. Escriba una
pregunta en el cuadro de texto en ActivityA antes de tocar el botón "Hacer Pregunta". La pregunta debería
aparecer ahora en el componente TextView en la interfaz de usuario ActivityB.
@ Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.main);
}
Cuando las salidas sub-actividad, el método onActivityResult () de la actividad de los padres se llama y se pasan
como argumentos el código de solicitud asociada con la intención, un código de resultado que indica el éxito o
no de la subactividad y un objeto que contiene toda la intención de datos devuelta por la
subactividad. Continuando todavía en el archivo de origen de clase ActivityA, este método debe aplicarse de la
siguiente manera:
TextView textView1 =
(TextView) findViewById (R.id.textView1);
Cadena ReturnString =
data.getExtras () getString ("returnData.");
textView1.setText (ReturnString);
}
}
El código en el método anterior comienza comprobando que el código de solicitud coincide con la utilizada
cuando se emitió la intención y asegurándose de que la actividad se ha realizado correctamente. Los datos de
rentabilidad se extrae de la intención y se muestra en el objeto TextView.
@ Override
acabado public void () {
Los datos de intención = new Intent ();
Prueba de la aplicación
Compila y ejecuta la aplicación, escriba una pregunta en el campo de texto en ActivityA y toque el botón "Hacer
Pregunta". Cuando aparezca ActivityB, introduzca la respuesta a la pregunta y utilizar el botón Atrás o el botón
"Enviar respuesta" para volver a ActivityA donde la respuesta debe aparecer en el objeto de visualización de
texto.
Resumen
Después de haber cubierto los conceptos básicos de las intenciones en el capítulo anterior, el objetivo de este
capítulo ha sido la de trabajar a través de la creación de un proyecto de aplicación en Android Estudio diseñado
para demostrar el uso de las intenciones explícitas, junto con los conceptos de transferencia de datos entre una
actividad y padres subactividad.
El siguiente capítulo trabajará a través de un ejemplo diseñado para demostrar las intenciones implícitas en la
acción.
<Botón
android: id = "@ + / Identificación del botón 1"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_centerHorizontal = "true"
android: layout_centerVertical = "true"
android: text = "@ string / button_text"
android: onClick = "showWebPage" />
</ RelativeLayout>
Figura 33-1
Tenga en cuenta la inclusión de la propiedad onClick que asegurará que un método llamado showWebPage ()
(que aún no ha sido implementado) será llamada cuando el botón está "clic" por el usuario.
com.ebookfrenzy.implicitintent paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.net.Uri importación;
android.content.Intent importación;
android.view.View importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_implicit_intent);
}
public void showWebPage (Ver vista) {
Intención Intención = new Intent (Intent.ACTION_VIEW,
Uri.parse ("http://www.ebookfrenzy.com"));
startActivity (intención);
}
.
.
.
}
Las tareas realizadas por este método son realmente muy simple. En primer lugar, se crea un nuevo objeto de la
intención. En lugar de especificar el nombre de clase de la intención, sin embargo, el código simplemente indica
la naturaleza de la intención (para mostrar algo que el usuario) mediante la opción ACTION_VIEW. El objeto
intención también incluye un URI que contiene la URL que se mostrará. Esto indica que el sistema de resolución
de intención Android que la actividad está solicitando que se mostrará una página web. La intención se emite a
través de una llamada al método startActivity ().
Compila y ejecuta la aplicación en ambos un emulador o en un dispositivo Android física y, una vez en
funcionamiento, toque el botón Mostrar Página Web. Al tocarla, una vista del navegador web debe aparecer y
cargar la página web designada por la URL. Una intención implícita éxito ahora se ha ejecutado.
</ RelativeLayout>
Retorno a la herramienta Diseñador de modo y arrastre Diseño y soltar un objeto WebView de la sección
Widgets de la paleta en la vista RelativeLayout existente. Ajuste la altura de diseño y las propiedades de
anchura a match_parent ya sea utilizando botones de la barra de diseño o el panel Propiedades para que el
WebView llena todo el área de visualización, como se ilustra en la Figura 33-2:
Figura 33-2
com.ebookfrenzy.mywebview paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
java.net.URL importación;
android.net.Uri importación;
android.content.Intent importación;
android.webkit.WebView importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_my_web_view);
Intención Intención = getIntent ();
try {
url = new URL (data.getScheme (),
data.getHost (),
data.getPath ());
} Catch (Exception e) {
e.printStackTrace ();
}
Obtiene una referencia a la intención que causó esta actividad que se puso en marcha
Extrae los datos Uri del objeto intención
Convierte los datos de Uri a un objeto URL
Obtiene una referencia al objeto WebView en la interfaz de usuario
Carga la URL a la vista web, la conversión de la URL en una cadena en el proceso
La parte de codificación del proyecto MyWebView ha finalizado. Todo lo que queda es modificar el archivo de
manifiesto.
Además, una revisión de los contenidos de la sección de filtro intención del archivo AndroidManifest.xml para el
proyecto MyWebView revelará los siguientes ajustes:
<Intención de filtro>
<Acción android: name = "android.intent.action.MAIN" />
<Categoría android: name = "android.intent.category.LAUNCHER" />
</ Intención de filtro>
En el XML anterior, la entrada android.intent.action.MAIN indica que esta actividad es el punto de entrada de la
aplicación 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 aplicación del dispositivo.
Debido a que no se requiere la actividad que se lanzará como punto de entrada a una aplicación, 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 intención para la actividad MyWebViewActivity hace, sin embargo, necesita ser modificado para
indicar que es capaz de manejar ACTION_VIEW acciones intención aplicables a los regímenes de datos
http. Android también requiere que todas las actividades capaces de manejar las intenciones implícitas que no
incluyen las entradas principales y el lanzador también incluyen la denominada categoría por defecto en el filtro
de la intención. La sección de filtro intención modificada debe, por lo tanto, que diga lo siguiente:
<Intención de filtro>
<Acción android: name = "android.intent.action.VIEW" />
<Categoría android: name = "android.intent.category.DEFAULT" />
<Androide datos: scheme = "http" />
</ Intención de filtro>
La combinación de estos requisitos juntos los resultados en el siguiente archivo AndroidManifest.xml completo:
<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">
<Intención de filtro>
<Acción android: name = "android.intent.action.VIEW" />
<Categoría
android: name = "android.intent.category.DEFAULT" />
<Androide datos: scheme = "http" />
</ Intención de filtro>
</ 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. Después de haber hecho las modificaciones apropiadas en el archivo de manifiesto, la
nueva actividad está listo para ser instalado en el dispositivo.
Dentro de la sección Actividad del diálogo de configuración, seleccione la opción No poner en marcha la
actividad de manera que se ha instalado la actividad pero no se iniciará y haga clic en el botón Ejecutar. La
instalación correcta del paquete se informó en la ventana de la herramienta Android Estudio Run:
Instalación com.ebookfrenzy.mywebview
DISPOSITIVO shell de comandos: pm instalar -r
"/data/local/tmp/com.ebookfrenzy.mywebview.mywebview"
pkg: /data/local/tmp/com.ebookfrenzy.mywebview
Éxito
Una vez completada la instalación, la actividad está listo para ser incluido en el proceso de resolución de la
intención del marco Android.
Prueba de la aplicación
Con el fin de probar MyWebView, simplemente vuelva a iniciar la aplicación ImplicitIntent creado anteriormente
en este capítulo y toque el botón Mostrar Página Web. Esta vez, sin embargo, el proceso de resolución de
intención encontrará dos actividades con filtros intención que concuerden con la intención implícita. Como tal, el
sistema mostrará un cuadro de diálogo (Figura 33-4) proporcionar al usuario la elección de la actividad para
lanzar.
Figura 33-4
Al seleccionar la opción MyWebView seguido del botón Sólo una vez debería hacer que la intención de ser
manejado por nuestro nuevo MyWebViewActivity, que posteriormente aparecerá y mostrará la página web
designada.
Si la página web se carga en el navegador Chrome sin el diálogo de selección que aparece más 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 categoría TODOS. Desplácese por la lista de
aplicaciones y seleccione Chrome. En la pantalla de la aplicación información Chrome, toque el botón Borrar
valores predeterminados.
Resumen
Intenciones implícitas proporcionan un mecanismo por el cual una actividad se puede solicitar el servicio de otro
simplemente especificando un tipo de acción y, opcionalmente, los datos en que esa acción se va a
realizar. Con el fin de ser elegible como candidato blanco de una intención implícita, sin embargo, una actividad
debe estar configurado para extraer los datos correspondientes del objeto intención entrante y se incluirán en un
fichero de manifiesto configurado correctamente, incluyendo los permisos adecuados y filtros intención. Cuando
se encuentra más de una actividad coincidente para una intención implícita durante una búsqueda resolución
intención, se solicita al usuario que tomar una decisión en cuanto a cuál usar.
Dentro de este capítulo un ejemplo ha sido creado para demostrar tanto la emisión de una intención implícita,
así como la creación de una actividad ejemplo capaz de manejar esa intención.
33 Broadcast Intenciones (Intents) y receivers de
radiodifusión en Android Estudio
Además de proporcionar un mecanismo para el lanzamiento de las actividades de aplicación, los intentos
también se utilizan como una forma de transmitir ancho mensajes del sistema a otros componentes en el
sistema. Esto implica la implementación de Broadcast Intenciones y receptores de radiodifusión, los cuales son
el tema de este capítulo.
El código anterior podría lanzar con éxito el receptor de difusión correspondiente en un dispositivo que ejecuta
una versión anterior a la 3.0 de Android. En las versiones más recientes de Android, sin embargo, la intención
no sería recibida por el receptor de radiodifusión. 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 través de una intención. Una aplicación se considera que está en un estado detenido si el caso 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 añadir a la intención
antes de que se envía para indicar que la intención es que se le permita iniciar un componente de una aplicación
detenido. Esta bandera es FLAG_INCLUDE_STOPPED_PACKAGES y se utilizaría como se indica en la
siguiente adaptación del fragmento de código anterior:
com.example.broadcastdetector paquete;
android.content.BroadcastReceiver importación;
android.content.Context importación;
android.content.Intent importación;
MyReceiver público () {
}
@ Override
public void OnReceive (contexto Contexto, intención Intención) {
// Implementar código aquí a realizar cuando
// Se detecta emisión
}
}
Al registrar un receptor de emisiones dentro de un archivo de manifiesto, hay que añadir un <receiver> entrada
que contenga uno o más filtros de intención, cada uno con la cadena de acción de la intención de difusión para
el que se requiere que el receptor para escuchar.
El siguiente archivo de manifiesto de ejemplo registra el receptor ejemplo emisión de arriba para escuchar las
intenciones de difusión que contienen una cadena de acción de com.example.Broadcast:
<Application
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl">
<Androide receptor: name = "MyReceiver">
<Intención de filtro>
<Acción android: name = "com.example.Broadcast">
</ Accion>
</ Intención de filtro>
</ Receptor>
</ Application>
</ Manifiesto>
El mismo efecto se puede lograr mediante el registro de la emisión en el receptor de código usando el método
registerReceiver () de la clase Actividad junto con un objeto IntentFilter configurado apropiadamente:
Es importante tener en cuenta que algunos intentos de difusión del sistema sólo pueden ser detectadas por un
receptor de emisiones si se ha registrado en el código en lugar de en el archivo de manifiesto. Compruebe la
documentación de la clase Intención Android para obtener una descripción detallada de los intentos de difusión
del sistema y los requisitos correspondientes en línea en:
http://developer.android.com/reference/android/content/Intent.html
com.ebookfrenzy.sendbroadcast paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.content.Intent importación;
android.view.View importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_send_broadcast);
}
com.ebookfrenzy.broadcastreceiver paquete;
android.content.BroadcastReceiver importación;
android.content.Context importación;
android.content.Intent importación;
public class MyReceiver extiende BroadcastReceiver {
MyReceiver público () {
}
@ Override
public void OnReceive (contexto Contexto, intención Intención) {
// TODO: Este método se llama cuando el BroadcastReceiver está recibiendo
// Una emisión de Intención.
throw new UnsupportedOperationException ("Todavía no implementado");
}
}
Como puede verse en el código, Android Studio ha generado una plantilla para la nueva clase y generado un
stub para el método 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 código
para que se lea de la siguiente manera:
com.ebookfrenzy.broadcastreceiver paquete;
android.content.BroadcastReceiver importación;
android.content.Context importación;
android.content.Intent importación;
android.widget.Toast importación;
MyReceiver público () {
}
@ Override
public void OnReceive (contexto Contexto, intención Intención) {
<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">
<Intención de filtro>
<Acción
android: name = "com.ebookfrenzy.sendbroadcast">
</ Accion>
</ Intención de filtro>
</ Receptor>
</ Application>
</ Manifiesto>
Con el archivo de manifiesto completado, el ejemplo de difusión está listo para ser probado.
Carga de archivos
ruta local: C: \ Users \ Neil \ AndroidStudioProjects \
BroadcastReceiver \ app \ build \ salidas \ apk \ app-debug.apk
ruta remota: /data/local/tmp/com.ebookfrenzy.broadcastreceiver
Instalación 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 aplicación SendBroadcast en el mismo dispositivo o AVD y esperar a
que aparezca en la pantalla. Una vez en funcionamiento, toque el botón, momento en el que el mensaje de la
tostada de leer "Intención Broadcast Detectado." Debería aparecer durante unos segundos antes de
desaparecer.
En el caso de que no aparezca el mensaje tostadas, vuelve a comprobar que la aplicación BroadcastReceiver
instalado correctamente y que el filtro de la intención en el archivo de manifiesto coincide con la cadena de
acción se utiliza cuando se transmitió la intención.
<Receptor
android: name = ". MyReceiver"
android: enabled = "true"
android: exportado = "true">
<Intención de filtro>
<Acción
android: name = "com.ebookfrenzy.sendbroadcast">
</ Accion>
<Acción
android: name = "android.intent.action.ACTION_POWER_DISCONNECTED">
</ Accion>
</ Application>
</ Manifiesto>
Dado que el método OnReceive () ahora va a estar escuchando para dos tipos de intención de difusión, vale la
pena modificar el código para que la cadena de acción de la intención actual también se muestra en el mensaje
de brindis. Esta cadena se puede obtener a través de una llamada al método getAction () del objeto intención
pasado como argumento al método OnReceive ():
A continuación, retire el conector USB que está actualmente suministrando energía al dispositivo Android,
momento en el que el receptor debe informar lo siguiente en el mensaje brindis: Broadcast intención detecta
android.intent.action.ACTION_POWER_DISCONNECTED
Resumen
Intentos de difusión son un mecanismo por el cual la intención puede ser emitido para el consumo de varios
componentes en un sistema Android. Las emisiones se detectan mediante el registro de un receptor de
radiodifusión, que, a su vez, está configurado para escuchar las intenciones que responden particulares
cadenas de acciones. En general, los receptores de radiodifusión que permanecen latentes hasta que sea
despertado por el sistema cuando se detecta un intento juego. Intentos de difusión también son utilizados por el
sistema Android para emitir notificaciones de eventos tales como una advertencia de batería baja o la conexión
o desconexión de la alimentación externa al dispositivo.
Además de proporcionar una visión general de los intentos y receptores de radiodifusión, en este capítulo
también ha trabajado a través de un ejemplo de envío de intentos de transmisión y la implementación de un
receptor de radiodifusión para escuchar para ambos intentos de transmisión personalizados y del sistema.
Haga doble clic en la vista botón y cambiar el texto que "Pulse Me". Extracto de la cadena en un recurso
denominado button_text. Con todavía seleccionada la vista de botón en el diseño, busque la propiedad onClick
en el panel Propiedades y escriba buttonClick como el nombre del método.
Una vez completado, el contenido del archivo XML debe ser similar a la siguiente lista:
<TextView
android: text = "@ string / hello_world"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_centerVertical = "true"
android: layout_centerHorizontal = "true"
android: id = "@ + / Identificación del myTextView" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / button_string"
android: id = "@ + / Identificación del botón"
android: layout_below = "@ + / Identificación del myTextView"
android: layout_centerHorizontal = "true"
android: layout_marginTop = "45dp"
android: onClick = "buttonClick" />
</ RelativeLayout>
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.View importación;
android.widget.TextView importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_thread_example);
}
Con el código cambia, ejecute la aplicación ya sea en un dispositivo físico o un emulador. Una vez que la
aplicación se está ejecutando, toque el botón, momento en el que aparecerá la solicitud para congelar. Será, por
ejemplo, no ser posible tocar el botón una segunda vez y en algunos casos el sistema operativo, como se
demuestra en la Figura 35-2, reportar la aplicación como no responder:
Figura 35-2
Claramente, cualquier cosa que se va a tomar tiempo para completar dentro del método buttonClick () debe
realizarse dentro de un hilo separado.
Cuando la aplicación se ejecuta ahora, toca el botón 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 botón adicionales. De hecho, cada vez que se pulsa el botón, se creará un nuevo hilo, lo que
permite que la tarea se lleva a cabo varias veces al mismo tiempo.
Una inspección minuciosa del código actualizado para el método buttonClick () revelará que el código para
actualizar la TextView se ha eliminado. Como se dijo anteriormente, la actualización de un elemento de la
interfaz de usuario desde un subproceso distinto del hilo principal viola una regla clave de desarrollo de
Android. Con el fin de actualizar la interfaz de usuario, por lo tanto, será necesario implementar un controlador
para el hilo.
com.ebookfrenzy.threadexample paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.View importación;
android.widget.TextView importación;
android.os.Handler importación;
android.os.Message importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_thread_example);
}
.
.
.
}
El código de cambios anteriores han declarado un manejador y aplicado dentro de ese manejador la devolución
de llamada handleMessage () que se llamará cuando el hilo envía al controlador un mensaje. En este caso, el
código simplemente muestra una cadena en el objeto TextView en la interfaz de usuario. Todo lo que queda
ahora es modificar el hilo creado en el método buttonClick () para enviar un mensaje al controlador cuando el
retraso ha completado:
}
handler.sendEmptyMessage (0);
}
};
Tenga en cuenta que el único cambio que se ha hecho es hacer una llamada al método sendEmptyMessage ()
del manejador. Desde que el manejador no tiene actualmente hace nada con el contenido de los mensajes que
reciben no es necesario para crear y enviar un objeto de mensaje al controlador.
Compilar y ejecutar la aplicación y, una vez que la ejecución, toque el botón. Después de un retraso de 20
segundos, el nuevo texto aparecerá en el objeto TextView en la interfaz de usuario.
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.view.View importación;
android.widget.TextView importación;
android.os.Handler importación;
android.os.Message importación;
java.text.SimpleDateFormat importación;
java.util.Date importación;
java.util.Locale importación;
}
.
.
.
}
A continuación, actualizar el método handleMessage () del manejador para extraer la cadena de fecha y hora del
objeto de lote en el mensaje y lo mostrará en el objeto TextView:
Por último, compilar y ejecutar la aplicación y probar que tocar el botón ahora hace que la fecha y hora actuales
a aparecer en el objeto TextView.
Resumen
El objetivo de este capítulo ha sido proporcionar una visión general de roscado dentro de las aplicaciones de
Android. Cuando se inicia una aplicación por primera vez en un proceso, el sistema de ejecución crea un hilo
conductor en el que todos los componentes de la aplicación posteriormente lanzados ejecutan de forma
predeterminada. La función 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 aplicación se ha bloqueado. Es esencial,
por tanto, que las tareas que podrían tomar 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 creación de un controlador en el hilo principal al que los
mensajes pueden ser enviados desde otros no principales hilos.
La clase de servicio de Android está diseñado específicamente para permitir a las aplicaciones iniciar y llevar a
cabo las tareas de fondo. A diferencia de los receptores de radiodifusión, que se pretende llevar a cabo una
tarea rápida y luego la salida, los servicios están diseñados para realizar tareas que tardan mucho tiempo en
completarse (como la descarga de un archivo a través de una conexión a Internet o de streaming de música
para el usuario), pero no requieren una interfaz de usuario.
En este capítulo, una visión general de los diferentes tipos de servicios disponibles serán cubiertos, incluyendo
servicios iniciados, servicios ligados y servicios intención. Una vez que estos fundamentos han sido cubiertas,
capítulos posteriores trabajarán a través de una serie de ejemplos basados en Android Estudio de los servicios
en la acción.
Servicio de Intención
Como se ha señalado 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, las tareas intensivas de la CPU que
deben ser realizadas por el servicio debe tener lugar dentro de un nuevo tema, evitando así afectar al
rendimiento de la aplicación de llamada.
La clase IntentService es una clase de conveniencia (una 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 una manera
asíncrona. 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 método onHandleIntent () que
contiene el código que se ejecutará para cada solicitud.
Para los servicios que no requieren procesamiento sincrónico de solicitudes, IntentService es la opción
recomendada. Servicios que requieren manejo sincrónico de las solicitudes serán, sin embargo, la necesidad de
crear una subclase de la clase de servicio y manual de implementar y administrar threading para manejar las
tareas intensivas de la CPU de manera eficiente.
Servicio Bound
Un servicio consolidado es similar a un servicio comenzó con la excepción de que un servicio iniciado por lo
general no devuelve resultados o permitir la interacción con el componente que lo lanzó. Un servicio unido, por
otro lado, permite que el componente de lanzamiento para interactuar con, y recibir los resultados de, el
servicio. A través de la implementación de la comunicación entre procesos (IPC), esta interacción también
puede tener lugar a través de límites de proceso. Una actividad puede, por ejemplo, iniciar un servicio para
manejar la reproducción de audio. La actividad será, con toda probabilidad, incluir una interfaz de usuario que
proporciona controles para el usuario con el propósito de pausa en la reproducción o saltar a la siguiente
pista. Del mismo modo, el servicio será muy probable que tenga que comunicar la información a la actividad de
llamadas para indicar que la pista de audio actual se ha completado y proporcionar detalles de la próxima pista
que está a punto de empezar a jugar.
Un componente (también denominado en este contexto como un cliente) se inicia y se une a un servicio unido a
través de una llamada al método bindService () y de componentes múltiples se puede unir a un servicio de
forma simultánea. Cuando el servicio de la unión ya no es necesario por un cliente, se debe hacer una llamada
al método unbindService (). Cuando el último cliente cota desvincula de un servicio, el servicio se dará por
terminado el sistema de ejecución Android. Es importante tener en cuenta que un servicio ligado también puede
iniciarse a través de llamada a StartService (). Una vez iniciado, los componentes pueden entonces unirse a ella
a través bindService () llama.Cuando se puso en marcha un servicio unido a través de una llamada a
StartService () seguirá funcionando incluso después de que el último cliente desvincula de ella.
Un servicio unido debe incluir una implementación del método onBind () que se llama tanto cuando se crea
inicialmente el servicio y cuando otros clientes posteriormente se unen a la servicio en ejecución. El propósito de
este método es devolver a la unión clientes un objeto de tipo IBinder que contiene la información que necesita el
cliente para comunicarse con el servicio.
En términos de la aplicación de la comunicación entre un cliente y un servicio de encuadernado, la técnica
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. La comunicación local se puede lograr mediante la extensión de la clase
Binder y devolver un ejemplo del método onBind (). La comunicación entre procesos, por otra parte, requiere la
aplicación Messenger y Handler. Los detalles de estos dos enfoques se tratarán en capítulos posteriores.
La Anatomía de un servicio
Un servicio debe, como ya se ha mencionado, se creará como una subclase de la clase de servicio de Android
(más específicamente android.app.Service) o una sub-clase de la misma (como
android.app.IntentService). Como parte del procedimiento de subclases, uno o más de los siguientes métodos
de devolución de llamada superclase debe ser anulado, dependiendo de la naturaleza exacta del servicio que se
está creando:
onStartCommand () - Este es el método que se llama cuando el servicio se inicia por otro
componente a través de una llamada al método StartService (). Este método no necesita ser ejecutado por
los servicios consolidados.
onBind () - Se llama cuando un componente se une al servicio a través de una llamada al método
bindService (). Al implementar un servicio consolidado, este método debe devolver un objeto IBinder
facilitar la comunicación con el cliente. En el caso de los servicios iniciados, este método debe ser
implementado para devolver un valor NULL.
onCreate () - Concebido como un lugar para llevar a cabo tareas de inicialización, este método se
llama inmediatamente antes de la llamada a cualquiera onStartCommand () o la primera llamada al método
onBind ().
OnDestroy () - Se llama cuando se está destruyendo el servicio.
onHandleIntent () - Se aplica sólo a las subclases IntentService. Este método se llama para manejar
el procesamiento por el servicio. Se ejecuta en un hilo separado de la aplicación principal.
Tenga en cuenta que la clase IntentService incluye sus propias implementaciones de los onStartCommand () y
onBind () los métodos de devolución de llamada por lo que estos no necesitan ser implementado en subclases.
<Application
android: icon = "@ estirable / ic_launcher"
android: label = "@ string / nombre_apl">
<Actividad
android: label = "@ string / nombre_apl"
android: name = ". TestActivity">
<Intención de filtro>
<Acción android: name = "android.intent.action.MAIN" />
<Categoría android: name = "android.intent.category.LAUNCHER" />
</ Intención de filtro>
</ Actividad>
<Androide servicio: name = "MiServicio>
</ Service>
</ Application>
</ Manifiesto>
De forma predeterminada, los servicios se declaran como público, en cuanto a que se puede acceder a los
componentes fuera del paquete de solicitud en el que residen. Con el fin de hacer un servicio privado, el
androide: propiedad exportado debe ser declarada como falsa dentro del elemento <service> del archivo de
manifiesto. Por ejemplo:
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 ejecutar dentro de su propio proceso, añadir un
androide: propiedad de proceso al elemento <service>, declarando un nombre para el proceso con el prefijo dos
puntos (:):
El prefijo de colon indica que el nuevo proceso es privada para la aplicación local. Si el nombre del proceso
comienza con una letra minúscula lugar de dos puntos, sin embargo, el proceso será global y disponible para su
uso por otros componentes.
Por último, utilizando los mismos mecanismos de filtro intención esbozados para las actividades, un servicio
puede también anunciar capacidades a otras aplicaciones que se ejecutan en el dispositivo. Para más detalles
sobre Intención Filtros, consulte el capítulo titulado Una Visión General de Intenciones Android.
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
aplicación 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.
Los servicios son una subclase de la clase de servicio de Android y entran en la categoría de cualquiera de los
servicios iniciadas o servicios consolidados. Servicios iniciados correr hasta que se detienen o se destruyen y no
proporcionan por sí un mecanismo de interacción o intercambio de datos con otros componentes. Servicios
Bound, por otro lado, proporcionan una interfaz de comunicación con otros componentes del cliente y, en
general, corren hasta que el último cliente se suelta del servicio.
De forma predeterminada, los servicios se ejecutan localmente en el mismo proceso y el hilo principal como la
aplicación 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. Los servicios remotos pueden comenzarse después de un proceso separado al
hacer un cambio de configuración menor a la correspondiente <service> entrada en el archivo de manifiesto de
aplicación.
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 asíncronos dentro de un subproceso de trabajo
independiente.
En el capítulo anterior cubierto una considerable cantidad de información relativa a los servicios de Android y, en
este punto, el concepto de servicios puede parecer un poco abrumador. Con el fin de reforzar la información en
el capítulo anterior, este capítulo va a funcionar a través de un tutorial Android Estudio destinado a introducir
gradualmente los conceptos de implementación del servicio iniciado.
Dentro de este capítulo, una aplicación de ejemplo se crea y se utiliza como base para la implementación 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 llevarán a cabo los pasos
necesarios para la realización de tareas en un hilo separado cuando se utiliza la clase de servicio. Tener
servicios iniciados tratados en este capítulo, el siguiente capítulo, titulado Bound Servicios de Ejecución locales
en Android Estudio , se centrará en la implementación de servicios con destino y la comunicación cliente-
servicio.
com.ebookfrenzy.serviceexample paquete;
/ **
* Creado por <nombre> el <fecha>.
* /
public class MyIntentService {
}
La clase tiene que ser modificado de manera que las subclases de la clase IntentService. Cuando subclases 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 método onHandleIntent (). Modifique el código en el archivo
MyIntentService.java, por lo tanto, para que se lea de la siguiente manera:
com.ebookfrenzy.serviceexample paquete;
android.app.IntentService importación;
android.content.Intent importación;
@ Override
protegida onHandleIntent void (arg0 Intención) {
MyIntentService público () {
super ("MyIntentService");
}
}
Todo lo que queda en este punto es implementar un código dentro del método onHandleIntent () para que el
servicio realmente hace algo cuando se invoca. Normalmente esto implicaría la realización de una tarea que
toma algún tiempo para completar, como la descarga de un archivo de gran tamaño o la reproducción 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 importación;
android.content.Intent importación;
android.util.Log importación;
@ Override
protegida onHandleIntent void (arg0 Intención) {
Log.i (TAG, "Servicio Intención comenzó");
}
MyIntentService público () {
super ("MyIntentService");
}
}
<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">
<Intención de filtro>
<Acción android: name = "android.intent.action.MAIN" />
</ Manifiesto>
com.ebookfrenzy.serviceexample paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.content.Intent importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_service_example);
Intención Intención = new Intent (esto, MyIntentService.class);
StartService (intención);
}
.
.
.
}
Todo lo que el código añadido tiene que hacer es crear un nuevo objeto de Intención cebado con el nombre de
clase de servicio para comenzar y luego utilizarlo como argumento para el método StartService ().
El servicio había recibido el encargo de una actividad a largo plazo, el servicio hubiera seguido corriendo en el
fondo en un hilo separado hasta que se completó la tarea, lo que permite que la aplicación continúe funcionando
y respondiendo al usuario. Dado que todo nuestro servicio hizo fue ingrese un mensaje, se habrá dejado
simplemente al finalizar.
com.ebookfrenzy.serviceexample paquete;
android.app.Service importación;
android.content.Intent importación;
android.os.IBinder importación;
android.util.Log importación;
MiServicio público () {
}
@ Override
public void onCreate () {
Log.i (TAG, "Servicio onCreate");
}
@ Override
public int onStartCommand (intención Intención, int banderas, int startID) {
@ Override
pública IBinder onBind (arg0 Intención) {
Log.i (TAG, "Servicio onBind");
devolver null;
}
@ Override
pública OnDestroy void () {
Log.i (TAG, "OnDestroy Servicio");
}
}
Con el servicio implementado, cargue el archivo AndroidManifest.xml en el editor y verifique que Android Studio
ha añadido una entrada apropiada para el nuevo servicio, que queda redactado como sigue:
<Servicio
android: ". MiServicio" name =
android: enabled = "true"
android: exportado = "true">
</ Service>
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / button_string"
android: id = "@ + / Identificación del botón"
android: layout_alignParentTop = "true"
android: layout_alignParentLeft = "true"
android: layout_alignParentStart = "true"
android: onClick = "buttonClick" />
</ RelativeLayout>
com.ebookfrenzy.serviceexample paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.content.Intent importación;
android.view.View importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_service_example);
}
Todo lo que el método buttonClick () hace es crear un objeto intención para el nuevo servicio e inicie
funcionando.
Ejecutar la aplicación
Ejecutar la aplicación y, una vez cargado, toque el botón Iniciar servicio. Dentro de la ventana LogCat (utilizando
el filtro ServiceExample creado previamente) los mensajes de registro aparecerá indicando que se ha llamado el
método onCreate () y que el bucle en el onStartCommand () método se está ejecutando.
Antes de que aparezca el mensaje de bucle final, tratar de tocar el botón Iniciar servicio por segunda vez. Tenga
en cuenta que el botón no responde. Después de unos 20 segundos, el sistema puede mostrar un cuadro de
diálogo de advertencia con el mensaje "ServiceExample no responde". La razón de esto es que el hilo principal
de la aplicación se encuentra detenido por el servicio mientras se realiza la tarea de bucle. Esto no sólo impide
la aplicación de responder al usuario, sino también para el sistema, que eventualmente supone que la aplicación
se ha bloqueado de alguna manera.
Claramente, el código para el servicio necesita ser modificado para realizar tareas en un hilo separado desde el
hilo principal.
Cuando la aplicación es ahora dirigido, debe ser posible tocar el botón Inicio Servicio varias veces. Cada vez
que un nuevo hilo se crea el servicio para procesar la tarea. La salida LogCat ahora también incluir un número
de referencia a la startID de cada solicitud de servicio.
Con el servicio de ahora el manejo de solicitudes fuera del hilo principal, la aplicación sigue siendo sensible a la
vez que el usuario y el sistema Android.
Resumen
En este capítulo se ha trabajado a través de un ejemplo de implementación de un servicio de Android empezado
a utilizar las clases IntentService y Servicio. El ejemplo también demuestra el uso de hilos dentro de un servicio
para evitar que el hilo principal de la aplicación que no responde.
37 Implementing Local Bound Services in Android Studio
Como se describe en detalle en los capítulos anteriores, los servicios con destino, a diferencia de los servicios
iniciados, proporcionan un mecanismo para implementar la comunicación entre un servicio de Android y uno o
más componentes de cliente. El objetivo de este capítulo es el de construir sobre el panorama general de los
servicios con destino previstos en Comprensión Android Iniciado y Bound Servicios antes de embarcarse en un
ejemplo de implementación de un servicio consolidado local en acción.
com.ebookfrenzy.localbound paquete;
android.app.Service importación;
android.content.Intent importación;
android.os.IBinder importación;
@ Override
pública IBinder onBind (intención Intención) {
// TODO: Devuelva el canal de comunicación con el servicio.
throw new UnsupportedOperationException ("Todavía no implementado");
}
}
La implementación de la Carpeta
Como se ha indicado anteriormente, los servicios ligados locales pueden comunicarse con los clientes
consolidados por pasar un objeto Carpeta configurado apropiadamente para el cliente. Esto se logra mediante la
creación de una subclase carpeta dentro de la clase de servicio consolidado y que se extiende por la adición de
uno o más nuevos métodos que pueden ser llamados por el cliente. En la mayoría de los casos, esto implica
simplemente la aplicación de un método que devuelve una referencia a la instancia de servicio unido. Con
referencia a la presente instancia, el cliente puede entonces acceder a los datos y los métodos de llamada
dentro del servicio ligada directamente.
A los efectos de este ejemplo, por lo tanto, se necesitan algunos cambios para la clase de plantilla
BoundService creado en la sección anterior. En el primer caso, una subclase Carpeta necesita ser
declarado. Esta clase contendrá un único método 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 importación;
android.content.Intent importación;
android.os.IBinder importación;
android.os.Binder importación;
BoundService público () {
}
@ Override
pública IBinder onBind (intención Intención) {
// TODO: Devuelva el canal de comunicación con el servicio.
throw new UnsupportedOperationException ("Todavía no implementado");
}
Después de haber realizado los cambios a la clase, vale la pena tomar un momento para recapitular los pasos
realizados aquí. En primer lugar, se declaró una nueva subclase de Carpeta (llamado MyLocalBinder). Esta
clase contiene un único método para el único propósito 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 continuación, el onBind () método necesita ser modificado para devolver una referencia al objeto MyBinder y
un nuevo método público implementado para devolver la hora actual cuando llamado por cualquier cliente que
se unen al servicio de:
com.ebookfrenzy.localbound paquete;
java.text.SimpleDateFormat importación;
java.util.Date importación;
java.util.Locale importación;
android.app.Service importación;
android.content.Intent importación;
android.os.IBinder importación;
android.os.Binder importación;
BoundService público () {
}
@ Override
pública IBinder onBind (intención Intención) {
volver MyBinder;
}
En este punto, el servicio unido 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 añadido un elemento <service> entrada para el servicio de la siguiente manera:
<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">
<Intención de filtro>
<Acción android: name = "android.intent.action.MAIN" />
<Servicio
android: name = ". BoundService"
android: enabled = "true"
android: exportado = "true">
</ Service>
</ Application>
</ Manifiesto>
La siguiente fase es poner en práctica el código necesario dentro de la actividad de unirse al servicio y llamar al
método GetCurrentTime ().
com.ebookfrenzy.localbound paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.os.IBinder importación;
android.content.Context importación;
android.content.Intent importación;
android.content.ComponentName importación;
android.content.ServiceConnection importación;
com.ebookfrenzy.localbound.BoundService.MyLocalBinder importación;
BoundService myService;
boolean isBound = false;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_local_bound);
}
El método onServiceConnected () será llamada cuando el cliente se une con éxito al servicio. El método se pasa
como argumento el objeto IBinder devuelto por el método onBind () del servicio. Este argumento se echa a un
objeto de tipo MyLocalBinder y luego se llama al método 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 conexión se ha establecido con éxito.
El método onServiceDisconnected () se llama cuando la conexión termina y simplemente establece el indicador
booleano false.
Después de haber establecido la conexión, el siguiente paso es para modificar la actividad para unirse al
servicio. Esto implica la creación de una intención y una llamada al método bindService (), que se puede realizar
en el método onCreate () de la actividad:
@ Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_local_bound);
Intención Intención = new Intent (esto, BoundService.class);
bindService (intención, myConnection, Context.BIND_AUTO_CREATE);
}
Completando el Ejemplo
Todo lo que queda es poner en práctica un mecanismo para llamar al método GetCurrentTime () y mostrar el
resultado al usuario. Como ya es costumbre, Android Estudio habrá creado un archivo activity_local_bound.xml
plantilla para la actividad que contiene sólo un TextView. Cargar este archivo en la herramienta Diseñador
utilizando el modo de diseño, haga doble clic en el componente TextView y cambiar el ID de @ + / Identificación
del myTextView. Mueva el TextView al centro del lienzo la pantalla, añada una vista botón debajo de la TextView
y cambiar el texto en el botón para leer "Show Time", extraer el texto a un recurso de cadena denominada
button_string. Al término de estos cambios, el diseño debe ser similar a la ilustrada en la Figura 38-1:
Figura 38-1
A continuación, cambiar Diseñador en modo texto y modificar el elemento de botón para declarar una propiedad
onClick configurado para llamar a un método llamado showTime:
<TextView
android: text = "@ string / hello_world"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_centerVertical = "true"
android: layout_centerHorizontal = "true"
android: id = "@ + / Identificación del myTextView" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / button_string"
android: id = "@ + / Identificación del botón"
android: layout_below = "@ + / Identificación del myTextView"
android: layout_centerHorizontal = "true"
android: onClick = "Showtime"
android: layout_marginTop = "44dp" />
</ RelativeLayout>
com.ebookfrenzy.localbound paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.os.IBinder importación;
android.content.Context importación;
android.content.Intent importación;
android.content.ComponentName importación;
android.content.ServiceConnection importación;
com.ebookfrenzy.localbound.BoundService.MyLocalBinder importación;
android.view.View importación;
android.widget.TextView importación;
BoundService myService;
boolean isBound = false;
Prueba de la aplicación
Con el código cambia completa, realice una prueba de funcionamiento de la aplicación. Una vez visible, toque el
botón 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 continuación llamado un método de ese servicio para
causar una tarea a realizar y resultados devueltos a la actividad.
Resumen
Cuando un servicio con destino es local y privado a una aplicación, los componentes dentro de esa aplicación
puede interactuar con el servicio sin la necesidad de recurrir a la comunicación entre procesos (IPC). En
términos generales, el método del servicio onBind () devuelve un objeto IBinder que contiene una referencia a la
instancia del servicio en ejecución. El componente de cliente implementa una subclase ServiceConnection
contiene métodos de devolución de llamada que se llaman cuando el servicio está conectado y desconectado
El primer método se pasa el objeto IBinder devuelto por el método onBind () que permite métodos públicos en el
servicio a ser llamados.
Después de haber cubierto la implementación de servicios con destino local, el siguiente capítulo se centrará en
el uso de IPC para interactuar con los servicios con destino a distancia.
38 Android Servicios Bound remoto - Un Estudio Android
Tutorial
En esto, el capítulo final dedicado a servicios de Android, una aplicación de ejemplo se desarrollará para
demostrar el uso de una configuración de controlador de mensajero y para facilitar la interacción entre un cliente
y un servicio unido a distancia.
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / button_string"
android: id = "@ + / Identificación del botón"
android: layout_centerVertical = "true"
android: layout_centerHorizontal = "true"
android: onClick = "sendMessage" />
</ RelativeLayout>
com.ebookfrenzy.remotebound paquete;
android.app.Service importación;
android.content.Intent importación;
android.os.IBinder importación;
android.os.Bundle importación;
android.os.Handler importación;
android.os.Message importación;
android.widget.Toast importación;
android.os.Messenger importación;
RemoteService público () {
}
@ Override
pública IBinder onBind (intención Intención) {
// TODO: Devuelva el canal de comunicación con el servicio.
throw new UnsupportedOperationException ("Todavía no implementado");
}
}
Con el controlador implementado, la tarea que queda en términos del código de servicio es modificar el método
onBind () de manera que devuelve un objeto IBinder que contiene un objeto mensajero que, a su vez, contiene
una referencia al controlador de:
@ Override
pública IBinder onBind (intención Intención) {
volver myMessenger.getBinder ();
}
La primera línea del fragmento de código anterior crea una nueva instancia de nuestra clase de controlador y se
lo pasa a través de al constructor de un nuevo objeto Messenger. Dentro del método onBind (), el método
getBinder () del objeto mensajero se llama a regresar objeto IBinder del mensajero.
<Servicio
android: name = ". RemoteService"
android: enabled = "true"
android: exportado = "true"
android: proceso = ": my_process">
<Intención de filtro>
<Acción android: name = "com.example.remoteservice">
</ Accion>
</ Intención de filtro>
</ Service>
</ Service>
</ Application>
</ Manifiesto>
com.ebookfrenzy.remotebound paquete;
android.support.v7.app.ActionBarActivity importación;
android.os.Bundle importación;
android.view.Menu importación;
android.view.MenuItem importación;
android.os.IBinder importación;
android.os.Message importación;
android.os.Messenger importación;
android.os.RemoteException importación;
android.content.ComponentName importación;
android.content.Context importación;
android.content.Intent importación;
android.content.ServiceConnection importación;
android.view.View importación;
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_remote_bound);
}
A continuación, algo de código necesita ser añadido para unirse al servicio remoto. Esto implica la creación de
una intención que coincida con el filtro de intención para el servicio como se declara en el archivo de manifiesto
y luego hacer una llamada al método bindService (), proporcionando la intención y una referencia a la instancia
ServiceConnection como argumentos. Para los fines de este ejemplo, este código se ejecutará en el método
onCreate de la actividad ():
@ Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_remote_bound);
Intención Intención =
nueva Intención ("com.example.remoteservice");
bindService (intención, myConnection, Context.BIND_AUTO_CREATE);
}
msg.setData (paquete);
try {
myService.send (msg);
} Catch (RemoteException e) {
e.printStackTrace ();
}
}
Con el código cambia completa, compilar y ejecutar la aplicación. Una vez cargado, toque el botón en la interfaz
de usuario, y en ese momento un mensaje de Toast debería aparecer que dice "mensaje recibido".
Resumen
Con el fin de poner en práctica la interacción entre un cliente y un servicio con destino a distancia, es necesario
implementar un marco de comunicación controlador / mensaje. Los conceptos básicos de esta técnica se han
cubierto en este capítulo junto con la implementación de una aplicación de ejemplo diseñado para demostrar la
comunicación entre un cliente y un servicio de encuadernado, cada uno en ejecución en un proceso separado.
Las aplicaciones móviles 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 mayoría de las
aplicaciones, que van desde las aplicaciones que están basadas en datos casi en su totalidad, a los que
simplemente necesitan almacenar pequeñas cantidades de datos, tales como la puntuación que prevalece de un
juego.
La importancia del almacenamiento de datos persistente se hace aún más evidente si se tiene en cuenta el ciclo
de vida un tanto transitoria de la aplicación típica Android. Con el riesgo siempre presente de que el sistema de
ejecución Android terminará un componente de aplicación para liberar recursos, una estrategia integral de
almacenamiento de datos para evitar la pérdida de datos es un factor clave en el diseño e implementación de
cualquier estrategia de desarrollo de aplicaciones.
En este capítulo se ofrecerá una visión general del sistema de gestión 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 aplicación Android. Antes
de profundizar en los detalles de SQLite en el contexto de desarrollo de Android, sin embargo, una breve
descripción de las bases de datos SQL y estará cubierta.
comprensión de las Tablas de base de datos
Tablas de la base proporcionan el nivel más básico de la estructura de datos en una base de datos. Cada base
de datos puede contener varias tablas y cada tabla está diseñada para mantener la información de un tipo
específico. Por ejemplo, una base de datos puede contener una tabla de clientes que contiene el nombre,
dirección y número de teléfono para todos los clientes de una empresa en particular. La misma base de datos
también puede incluir una tabla de productos utilizados para almacenar las descripciones de los productos con
códigos de los productos asociados a los artículos 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. Un nombre de tabla, una vez asignado a una tabla en una base de datos, sólo se podrá volver a
utilizar en el contexto de una base de datos diferente.
¿Qué es SQLite?
SQLite es una incorporado, sistema de gestión de bases de datos relacionales (RDBMS). La mayoría 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 cooperación 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á vinculada a 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 aplicación a través de las llamadas a funciones contenidas en la biblioteca SQLite.
Los desarrolladores de SQLite han colocado a la tecnología en el dominio público con el resultado de que ahora
es una solución de base de datos ampliamente desplegado.
SQLite está escrito en el lenguaje de programación 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 conjunto
de clases que se pueden utilizar en el código Java de una aplicación para crear y administrar bases de datos
basadas SQLite.
Para obtener información adicional acerca de SQLite consulte http://www.sqlite.org .
shell -e adb
Una vez conectado, el entorno de shell proporcionará un símbolo del sistema en el que podrá introducir órdenes:
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 aplicación. 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 aplicación con el nombre del paquete com.example.MyDBApp crea una base de datos
llamada mydatabase.db, la ruta de acceso al archivo en el dispositivo con el siguiente texto:
/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
jerarquía subdirectorio adecuado para un poco de experimentación SQLite:
cd / datos / datos
mkdir com.example.dbexample
com.example.dbexample cd
bases de datos mkdir
bases de datos de cd
Con una ubicación adecuada creado para el archivo de base de datos, inicie la herramienta SQLite interactivo
de la siguiente manera:
Al sqlite> y podrá introducir órdenes para llevar a cabo tareas como la creación de tablas e insertar y recuperar
datos. Por ejemplo, para crear una nueva tabla en la base de datos con los campos para contener ID, nombre,
dirección y número de teléfono campos se requiere la siguiente declaración:
crear contactos de mesa (autoincrement _id entero primaria clave, texto nombre,
dirección de texto, texto del teléfono);
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ó
SQLite para incrementar automáticamente el número cada vez que se agrega una fila. Esta es una manera
común para asegurarse de que cada fila tiene una clave principal única. En la mayoría de las otras plataformas,
la elección 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 con la 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
sqlite> .exit
Cuando se ejecuta una aplicación Android en el entorno emulador, todos los archivos de base de datos se
pueden crear en el sistema de archivos del emulador utilizando la convención de ruta discutido
previamente. Esto tiene la ventaja de que se puede conectar con adb, navegue hasta la ubicación 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 código de la aplicación.
También es importante señalar que, si bien es posible conectar con un adb shell a un dispositivo Android física,
el depósito no se concede privilegios suficientes por defecto para crear y gestionar bases de datos
SQLite. Depuración de los problemas de base de datos es, por lo tanto, realiza mejor utilizando una sesión de
AVD.
Cursor
Una clase proporcionado específicamente para proporcionar acceso a los resultados de una consulta de base
de datos. Por ejemplo, una operación de SQL SELECT se realiza en una base de datos potencialmente volverá
múltiples filas coincidentes de la base de datos. Un ejemplo Cursor se puede utilizar para pasar a través de
estos resultados, que pueden entonces accederse desde dentro del código de la aplicación utilizando una
variedad de métodos. Algunos métodos clave de esta clase son como sigue:
close () - Libera todos los recursos utilizados por el cursor y lo cierra.
getCount () - Devuelve el número 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 posición 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 posición actual del cursor (variaciones consisten en getString (), getInt (),
getShort (), getFloat () y getDouble ()).
SQLiteDatabase
Esta clase proporciona la interfaz principal entre el código de la aplicación y bases de datos SQLite subyacentes
incluyendo la capacidad de crear, eliminar y realizar operaciones basadas en SQL en bases de datos. Algunos
métodos 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 especificado y devuelve resultados que cumplan a
través de un objeto Cursor.
execSQL () - Ejecuta una única sentencia SQL que no devuelve datos de resultados.
rawQuery () - Ejecuta una sentencia de consulta SQL y devuelve los resultados que coinciden en la
forma de un objeto Cursor.
SQLiteOpenHelper
Una clase de ayuda diseñado para que sea fácil crear y actualizar bases de datos. Esta clase debe tener
subclases dentro del código de la demanda que tenga acceso a la base y los siguientes métodos de devolución
de llamada implementados dentro de esa subclase:
onCreate () - Se llama cuando se crea la base de datos por primera vez. Este método se pasa como
argumento el objeto SQLiteDatabase para la nueva base de datos. Este es el lugar ideal para inicializar la
base de datos en cuanto a la creación de una tabla e insertar las filas de datos iniciales.
ONUPGRADE () - Llamado en el caso de que el código de la aplicación contiene una versión de la
base de datos de referencia número más reciente. Esto se utiliza normalmente cuando una aplicación se
actualiza en el dispositivo y requiere que el esquema de base de datos también se actualizará para manejar
el almacenamiento de datos adicionales.
Además de los métodos de devolución de llamada obligatorios anteriormente, el método onOpen (), llamada
cuando se abre la base de datos, también puede implementarse dentro de la subclase.
El constructor de la subclase también deben ser aplicadas para llamar a la super clase, pasando por el contexto
de aplicación, el nombre de la base de datos y la versión de la base de datos.
Métodos 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 sólo lectura. 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 que se declare que consiste
en la tabla de identificadores de columna y los valores que se almacenan 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, embebido relacional de gestión de base de datos que se incluye como parte del
marco de Android y proporciona un mecanismo para la implementación del almacenamiento de datos
persistente organizado para aplicaciones de Android. Además de la base de datos SQLite, el marco Android
también incluye una serie de clases Java que pueden utilizarse para crear y gestionar bases de datos y tablas
basadas SQLite.
El objetivo de este capítulo ha sido proporcionar una visión general de las bases de datos en general y SQLite
en particular en el contexto del desarrollo de aplicaciones para Android. Los próximos capítulos trabajarán a
través de la creación de una aplicación de ejemplo la intención de poner en práctica esta teoría en la forma de
un tutorial paso a paso. Desde la interfaz de usuario de la aplicación ejemplo requerirá un diseño basado en las
formas, el primer capítulo, titulado Un TableLayout y TableRow Tutorial Android Estudio , desviará ligeramente
del tema central mediante la introducción de los conceptos básicos de las opiniones TableLayout y TableRow.
Cuando el trabajo se inició en el siguiente capítulo de este libro ( Un Tutorial Database Android Estudio SQLite )
fue pensado originalmente que incluiría los pasos para diseñar el diseño de la interfaz de usuario de la
aplicación de ejemplo de base de datos. Rápidamente 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 tema merecía un capítulo autónomo. Como resultado, este capítulo se centrará únicamente en el
diseño de interfaz de usuario de la aplicación de base de datos completa en el siguiente capítulo, y al hacerlo,
tomar algún tiempo para introducir los conceptos básicos de los diseños de tabla en Android Studio.
Figura 41-1
Desde el aspecto visual de la disposición, es difícil identificar la estructura TableLayout utilizado para diseñar la
interfaz. El árbol jerárquico ilustrado en la Figura 41-2, sin embargo, hace que la estructura un poco más fácil de
entender:
Figura 41-2
Claramente, el diseño consiste en una vista LinearLayout padre con TableLayout y LinearLayout niños. El
TableLayout contiene tres hijos TableRow representan tres filas de la tabla. Los filastabla contienen dos puntos
de vista del niño, con cada niño representa el contenido de una celda de la columna. El punto de vista del niño
LinearLayout contiene tres hijos Button.
El diseño se muestra en la Figura 41-2 es la disposición exacta que se requiere para el ejemplo de base de
datos que se completará en el próximo capítulo. El resto de este capítulo, por lo tanto, se puede utilizar para
trabajar paso a paso en el diseño de esta interfaz de usuario usando la herramienta Android Studio Designer.
Figura 41-3
Una vez que estos pasos iniciales están completos, el Árbol de componentes para el diseño debe parecerse a la
que se muestra en la Figura 41-4:
Figura 41-4
Desde dentro de la sección Widgets de la paleta, arrastre y suelte dos grandes objetos de texto TextView en la
entrada TableRow superior del árbol de componentes (Figura 41-6):
Figura 41-6
Doble click en la más TextView izquierda dentro del diseño de la pantalla y, en el panel de configuración de
propiedades rápida, cambie la propiedad de texto a "Identificación del producto".Repita este paso para el
derecho más TextView, cambiando esta vez el texto a "Sin asignar" y especificando un valor id de @ + /
Identificación del IDproducto. 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 una edición del texto en Texto sin formato de la sección 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 @ + / Identificación del productName.
Arrastre y suelte otra vista de texto sin formato y un Número (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 @ + /
Identificación del productQuantity. Antes de continuar, asegúrese de extraer todas las propiedades de texto
añadido en los pasos anteriores a recursos de cadena.
Figura 41-9
Con márgenes establecidos en los cuatro lados de los tres filastabla, la interfaz de usuario debería aparecer
como se ilustra en la Figura 41-1. En aras de la exhaustividad, y para fines de comparación en el caso de que su
diseño no coincide con el de la figura 41-1, la estructura activity_database.xml completa para este diseño se
describe a continuación.
<LinearLayout
android: orientación = "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"
android: text = "@ string / id_string"
android: id = "@ + / Identificación del TextView" />
<TextView
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: textAppearance = "android:? attr / textAppearanceLarge"
android: text = "No asignado"
android: id = "@ + / Identificación del IDproducto" />
</ 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 = "@ + / Identificación del textView3" />
<EditarTexto
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: id = "@ + / Identificación 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 = "@ + / Identificación del textView2" />
<EditarTexto
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: InputType = "numberDecimal"
android: ems = "10"
android: id = "@ + / Identificación del productQuantity" />
</ TableRow>
</ TableLayout>
<LinearLayout
android: orientación = "horizontal"
android: layout_width = "wrap_content"
android: layout_height = "fill_parent"
android: layout_gravity = "center_horizontal"
android: layout_margin = "10DP">
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / add_string"
android: id = "/ botón @ + id" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / find_string"
android: id = "@ + / Identificación del button2" />
<Botón
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: text = "@ string / delete_string"
android: id = "@ + / Identificación del button3" />
</ LinearLayout>
</ LinearLayout>
Resumen
La vista contenedor Android TableLayout proporciona una manera de organizar ver los componentes en una
configuración de filas y columnas. Mientras que la vista TableLayout proporciona el contenedor general, cada
fila, y las células contenidas en el mismo, se aplican a través de las instancias de la vista TableRow. En este
capítulo, una interfaz de usuario ha sido diseñado en Android Studio usando los contenedores TableLayout y
TableRow. El siguiente capítulo se sumará la funcionalidad detrás de esta interfaz de usuario para implementar
las capacidades de base de datos SQLite.