Programación Android Paso a Paso - Antonio Morales Carmona

352
7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 1/352

Transcript of Programación Android Paso a Paso - Antonio Morales Carmona

Page 1: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 1/352

Page 2: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 2/352

rogramación Android

Paso a Paso para principiantes” 

Page 3: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 3/352

Page 4: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 4/352

ódigo 100% TESTEADO SIN ERRORES 100% COMPLETOntonio Morales Carmona

tecnocodigo.com www.tecnocodigo.com

13

dos los nombres propios de programas, sistemas operativos, equipos hardware, logotipos, etc

e aparecen en este libro son marcas registradas de sus respectivas compañías.

servados todos los derechos. El contenido de esta obra está protegido por la ley, que establecnas de prisión y/o multas , además de las correspondientes indemnizaciones por daños oejuicios, para quienes reprodujeren, plagiaren, distribuyeren o comunicasen públicamente, en n parte, una obra literaria, artísticas o científica, o su transformación, interpretación o ejecucística fijada en cualquier tipo de soporte o comunicada a través de cualquier medio, sin laeceptiva autorización.

pósito Legal: RTA-228-13 Junio – 2013

dice

troducción y dedicatoria ................................................................ IV Formaterpretar este libro ....................................................... IX Capítulo 1eparando el sistema ............... 1 Capítulo 2 El Entorno de trabajo (IDE

clipse) 11 Capítulo 3 Hola Mundo ......................... 22 Capítulo 4 Convertidoelsius a Fahrenheit ... 34 Parte 4.1 Celsius-Fahrenheit-Kelvin (radioGroup)............................. 39 Parte 4.2 Versiones y subversiones........... 43 Parte 4.

oast ó Notificaciones ............ 46 Parte 4.4 Layout ó Capas, ordenandoementos 47 Capítulo 5 Múltiples ventanas/vistas-Activity . 53 Parte 5.1 Pas

un Activity a otro........ 54 Parte 5.2 Cerrar Activity, volver al principal

Page 5: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 5/352

errar aplicación) .......................... 61 Parte 5.3 Pasar valores entre ActivityCapitulo 6 Almacenamiento variables Permanente (SharedPreferences)

............ 63 Parte 6.1 Recordando último Acceso........... 66 Capítulo 7 Fichecuenciales .............. 72 Parte 7.1 En Memoria Interna................. 74 Parte

n SD .............................. 79 Capítulo 8 Base de Datos (SQLite) ............. 83ww.tecnocodigo.com Antonio Morales Carmona Iarte 8.1 Primera Aplicación SQLite.......... 84 Parte 8.2 Visualización DDMS

le Explorer 100 Parte 8.3 Resumen de import, declaraciones y funciones paQLite ....................... 101 Capítulo 9 Internet (WebView). Programaciónndroid con HTML5/CSS3 103 Parte 9.1 Pasar datos de Android avascript109 Parte 9.2 Pasar datos de Javascript a Android113 Capítulo 10

nviar SMS......................... 117 Capítulo 11 Menus.............................. 121 Pa.1 Menu Opciones .................... 122 Parte 11.2 Menu Opciones con iconos.... 127 Parte 11.3 Menu Opciones con submenus....... 129 Parte 11.4

ctionBar (Menu Opciones en Android 3.0 o sup.) ............... 132 Parte 11.5enu Contextual.................. 137 Capítulo 12 Multi-Idiomas,ternacionalización .. 143 Capítulo 13 Interface Vertical-Horizontalayouts).......................... 147 Capítulo 14 Listado de cualificadores Recurso1 Capítulo 15 Notificaciones del sistema ........ 155 Parte 15.1 Notificacione

mples........... 156 Parte 15.2 Notification.Builder............. 158 Parte 15.3otification.Builder, Jelly Bean (Versión API) .......... 159 Capítulo 16rvicios.......................... 170

ww.tecnocodigo.com Antonio Morales Carmona IIarte 16.1 Servicios del sistema............ 171 Parte 16.2 Broadcasteceivers.............. 177 Parte 16.3 Services......................... 184 Capítulo 17hreads / Hilos.................... 190 Parte 17.1 Thread y Handler................. 191arte 17.2 Runnable (Método POST)........... 196 Parte 17.3 AsyncTask .................... 197 Capítulo 18 ListView / BaseAdapter ............ 202 Capítuloidget............................. 216 Parte 19.1 Método actualización conppWidgetProvider/XML ............. 217 Parte 19.2 Método actualización conarmManager....................... 225 Capítulo 20 Publicar la aplicación ............

arte 20.1 Alta en Google Play Store........ 234 Parte 20.2 Generarrtificado.............. 237 Parte 20.3 Subir nuestra aplicación......... 239 CapítuMonetizando nuestra aplicación .... 244 Parte 21.1 AdMob .......................

6 Parte 21.2 WebView y AdSense................ 252 Parte 21.3 Aplicaciones dego............. 253osario alfabético........................................ 257

ww.tecnocodigo.com Antonio Morales Carmona III

Page 6: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 6/352

ntroducción y Dedicatoria

o me gusta la palabra suerte, porque la gente suele utilizarlo a su favor en tso, y sólo es una ínfima parte del éxito o fracaso conseguido. Lo más

mportante en el éxito o el fracaso está repleto de variables como el esfuerzo, crificio, la disciplina, la responsabilidad, etc… Sumando todas las variables,y muchas personas que comienzan en el mismo punto de partida y sin

mbargo obtienen resultados muy distintos en sus vidas. Yo tuve la suerte decer en un país occidental, medianamente desarrollado y en reciente expanonómica y social. También tuve la suerte de nacer con un padre y una mad

ue siempre me han apoyado en todo momento. Aunque ellos no tuvieron laortunidad de educación que los de nuestro tiempo hemos tenido, siempre sforzaban en explicarme matemáticas, lengua, ciencias naturales, …, casi tos materias aunque no tuvieran cierto nivel educativo. Este libro va dedicado

i padre, él es la variable suerte que más influido en mí. Sin duda él es el artíeste libro, y él quien hubiera querido escribirlo. Para entender estadicatoria contaré un poco mis inicios. Recuerdo a mi padre como una persuy inquieta, en casi todos los aspectos. Inquieto en el trabajo, inquieto en eber, … Toda esa inquietud la transmitía en sus aspiraciones. Se las ingeniabempre para sacar dinero para comprar un piano de cola, luego cambiarlo pn piano electrónico, un vídeo 2000 de la marca Philips recién sacado, allá po

o 1978.

tener contacto con un aparato electrónico tan pronto influye directamentmo después te desenvuelves toda tu vida con ellos. Cuando tenemos cortaad tenemos la mente muy abierta para nuevos conceptos. Lo siguiente

cuerdo que fue el Atari 2600, con el juego del ping pong, y algunos juegos m

Page 7: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 7/352

ue recuerdo de líneas y círculos, y que tengo en el recuerdo sin nombre. Estblando del año 1980, nada más y nada menos.

os joystick, o palancas de juegos, solían romperse con facilidad. Tras un paos rotos, y

ww.tecnocodigo.com Antonio Morales Carmona Vnegativa de mi padre a comprarme más, es cuando comencé a desmontarl

pararlos. Aprendí de circuitos, intenté soldar, … Hasta me llegué a construno mucho más resistente con los deshechos de los que tenía rotos. Enciembre del año 1982, lo más moderno en equipos informáticos se llamaba

ommodore 64 ó CBM64. Un ordenador con casetes para cargar video jueglugar de los cartuchos de la Atari. Para iniciar los juegos tenía que maneja

asic, que en aquellos días no tenía ni idea de lo que era. Toda la documentaistente estaba en inglés.

Page 8: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 8/352

ra el año 1984 y yo sólo sabía cargar juegos, cambiar color de las letras, fon

pantalla, y poco más. Todos los meses comprábamos revistas de informátinde venían programas completos que podías escribir y grabar en un casetayoría de los códigos contenían errores no premeditados y tenías quecontrarlos y corregirlos para hacerlos funcionar. La mayoría los reparabatuición, sin comprender realmente los porqués. Entonces fue cuando salió urso de programación en Basic para trabajadores de bancos y oficinas. Com

uedaron plazas libres se apuntaron José Ángel, Anselmo y mi padre; un

ofesor, un electrónico y un cristalero. Se reunían en casa de uno o de otro alizar los ejercicios del curso. Cuando se reunían en mi casa, yo me sentabasalón cerca para escucharlos, a ver si me enteraba de algo. Tras unos doseses leyendo los apuntes de mi padre (que aún guardo de recuerdo), tenían

ue realizar un programa que mostrara un reloj centrado en pantalla y queera actualizando y cambiando de color el borde de la pantalla; ellos no lonseguían y yo… yo ya lo tenía hecho desde mediados de semana. Creo queprimer día que me dí cuenta que había nacido para esto, de que los demás

mprendían algo que yo sí. En 1986 estaba cansado de jugar, había estadourante años jugando horas y horas sin parar, por lo que me dediqué aogramar en Basic. Me prestaban ordenadores para realizar en ellos algún programa sencillo, llevar el stock, realizar presupuestos, etc. Entre los

denadores que tuve estaban el MSX, el Sinclair ZX, Spectrum 128,ommodore Amiga, Amstrad CPC464, … es decir la crema de la época. Pere di cuenta que todos los programas realizados en unos ordenadores eran

compatibles con otros, por lo que había que programarlo de un ordenadorro siempre desde cero. En 1987 compró mi padre a mi tito Pepe un IBM P

Page 9: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 9/352

88. Una bestia con sistema operativo Ms-Dos 2.0. Rápidamente comprendue pretendía IBM con sus ordenadores

ww.tecnocodigo.com Antonio Morales Carmona VIIompatibles” y un sistema operativo que alejara al usuario de un lenguaje dogramación para usar el ordenador. El resto de la historia hasta llegar acribir este libro ya se lo pueden imaginar. Todos los ordenadores que quise

ner a partir de entonces tuve que conseguirlos por mis propios medios,reglando ordenadores, dando clases particulares, y guardando hasta la últiseta de paga que podía darme mi padre o mis abuelas/o. Con ese dinero mmpraba libros, y hasta pedí un crédito para comprar ordenadores y dar clrticulares.

tros libros de informática que vas escribiendo a lo largo de los años no losgistras, y la tecnología van tan rápido que muy pronto se quedan obsoletosna vez anticuados no los registras y caen en el olvido, perdidos para siempr

o he querido que ocurriera lo mismo con este, por lo que aquí está… esper

Page 10: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 10/352

ue os guste.edicado al factor suerte de tener un padre como el que tuve yo. Gracias Pate libro es tuyo.edicado a Antonio Morales Moreno (1949-2005)

ww.tecnocodigo.com Antonio Morales Carmona

III

Page 11: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 11/352

orma de interpretar este libro

o existe un guión predefinido para aprender la totalidad de la programacióra dispositivos móviles Android, ya que en realidad esta es una programaciva. Partimos de que el usuario sabe algo de programación, y realizamos unmino de autodescubrimiento y autoaprendizaje de cómo programar para etema Android desde cero. Con unos conocimientos previos de programaci

tructurada, y sin ser necesario unos altos conocimientos en programaciónientada a objetos. Partiendo de esta premisa, primero se ha creado unartado para disponer en el ordenador todo lo necesario para la programara Android. En segundo lugar hemos ido creando pequeños ejemplosilizando distintos elementos de la librería SDK. Con la idea de escribir ungundo libro repleto de aplicaciones útiles y completamente funcionalesomentando paso a paso el desarrollo), disponiendo de los conocimientos

quiridos en este primer “viaje” por la programación orientada a objetos pspositivos móviles Android. No espere, por lo tanto, una guía al uso sobre laogramación para Android, sino más bien un libro para ayudarle a entrar d

na forma amena y suave. Sígame, daremos un paseo.ww.tecnocodigo.com Antonio Morales Carmona IX

Page 12: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 12/352

APÍTULO

Page 13: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 13/352

PREPARANDO EL SISTEMA”

apítulo 1 “PREPARANDO EL SISTEMA”

rte 1.1 Pequeña introducción a Android

droid es una distribución de GNU/Linux adaptada a dispositivos móviles. Ha tenido tanto éxie es ha desligado de la memoria de su padre.

s aplicaciones para este SO se pueden crear en HTML5/CSS3 en JAVA.

ra este pequeño manual de introducción utilizaremos el entorno de programación Eclipse y el e suministra Android, junto con una máquina virtual para probar nuestro software antes deobarlo definitivamente en nuestro querido aparato con Android.

a cosa a tener en consideración es que para crear una aplicación Android hay que suministrar rmisos a las distintas áreas dónde nuestra aplicación tendrá acceso. Estos permisos irán escrit

fichero AndroidManifest.xml.r ejemplo: Para que nuestra aplicación Android tenga acceso a la agenda de contactos, tendree escribir una entrada para dar acceso a nuestra aplicación a dicha zona. Lo mismo sucedería GPS, WIFI, etc.

rte 1.2 Instalando el SDK Android/Google

jamos el SDK de Google para programar Android. La última versión (al escribir estas líneas)scarga en

p://developer.android.com/sdk/index.html

Page 14: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 14/352

Page 15: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 15/352

demos instalar las SDK API de la versión Android para las que queramos programar.ando termine de instalar el API, es posible que te salgan marcados tres nuevos paquetes (Insta6 Atom System Image, Google APIs, Google USB Driver) paratalar, le vuelves a pulsar tall.

to es lo que te saldrá que teinstalado en el menú de

ogramas.

Page 16: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 16/352

AVD es Android Virtual Device, es un emulador de Android donde probar tus aplicaciones. Nndrá muy bien para probar nuestros programas antes de enviarlos a un dispositivo Androidfinitivamente.

rte 1.3 Instalando Eclipsetalamos Eclipse como IDE (entorno gráfico de desarrollo)p://www.eclipse.org/downloads/

jamos la versión Eclipse IDE for Java Developers.

realidad no hay que instalar eclipse, ya que no necesita 4instalación, bastará con descomprimirlo en el sitioseado y crear un acceso directo si lo necesitamos. Podríamos incluso tenerlo grabado en una lB, pero siempre que lo ejecutemos en una máquina esta deberá disponer de las SDK.

demos encontrarnos con la siguiente ventana al ejecutar por primera vez Eclipse. Nos dice qucuentra en la ruta especificada las librerías de JAVA.

Page 17: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 17/352

En este caso deberemos descargar e instalar K o Java Development Kit.rte 1.4 Instalando JDK (Java Development Kit)p://www.oracle.com/technetwork/java/javase/downloads/index.html

scargamos e instalamos en este caso Java Platform (JDK) 7u7.a vez instalado el JDK, ya podremos ejecutar eclipse quien nos preguntará donde crear la zonbajo/programación.

Page 18: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 18/352

Parte 1.5 InstalDT Plugin para Eclipse (Android Developer Tools)

nemos que instalar un plugin de Eclipse llamado ADT que son una utilidades para desarrollo icaciones Android (Android Developer Tools).

ra ello pulsamos en la Ayuda – Instalar Software (Ayuda-Install New Software). Cuando veambotón de Find and Install (Buscar e Instalar).

nde pone escribir o seleccionar sitio (type or select a site) introducidmos en la barra deecciones http://dl.google.com/android/eclipse/ y si no funciona https://dlssl.google.com/android/eclipse/ , segupasos del asistente y reiniciamos Eclipse.

Page 19: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 19/352

arcamos tanto Developer Tools como NDK Plugins y pulsamos Siguiente (Next).

eptamos Terminos de Licencia.rte 1.6 Configurar el ADK.

ra que ADK funcione hay que indicarle dónde instalamos el paquete SDK (primera instalaciónlsando en Ventana – Preferencia. Preguntará si queremos enviar información de depuración.

Page 20: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 20/352

leccionamos Android en el panel de la izquierda y configuramos la opción SDK Location con

aminar. Normalmente deberá aparecer ya configurado, buscar el directorio de instalación en eso de que no sea correcto.

rte 1.7 Crear Máquina Virtual Androidúltimo paso antes de ponernos a programar es crear la Máquina Virtual Android.scamos en los programas el AVD Manager.

Page 21: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 21/352

lsamos en Nuevo (New), ponemos nombre a la máquina virtual, en destino (target) elegimos eversión Android si hemos instalado varias. Ponemos en CPU el tipo de procesador que tengami queremos un tamaño para una tarjeta SD virtual. Marcamos Snapshot si queremos capturas d

ntalla (esto no será necesario); y la resolución para la aplicación.

Page 22: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 22/352

lsamos el botón crear AVD.

arecerá en la lista preparado para usar, podemos cerrarlo y comenzar a programar.

Page 23: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 23/352

APÍTULO

Page 24: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 24/352

El entorno de trabajoDE Eclipse)”

apítulo 2 - El Entorno de trabajo (IDE Eclipse)

ejecutar Eclipse nos pregunta cual será nuestra carpeta de trabajo.

Tras especificárpróximo que veremos será el interfaz del programa.

Page 25: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 25/352

Para empezar con la programación de Android, pulsaremos en el menú en File – New – Othechero, Nuevo, Otro).

Page 26: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 26/352

leccionamos Android – Android Application Project. Hay también varios ejemplos creados, pmejor forma de aprender será crear el nuestro propio desde cero.

Page 27: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 27/352

lsamos en siguiente, y ponemos el nombre de la aplicación. Veremos que él auto-rellena casi to de campos.

Page 28: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 28/352

demos elegir tanto la versión SDK de Android sobre la que queremos programar, como lampatibilidad mínima que tendrá nuestra aplicación.

la siguiente ventana podremos seleccionar el icono de nuestra aplicación, el color, y variospectos.

Page 29: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 29/352

ra pantallas de dimensiones más grandes podemos crear la aplicación con BlankActivity o conasterDetailFlow. Para la segunda tendremos que tener instalado el SDK versión 11. Nosotrosndremos el BlankActivity que requiere menos y es más fácil para comenzar.

Page 30: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 30/352

siguiente que nos pregunta es si queremos darle nuevos nombres a las clases de Activity, Layme (nombre de la capa), y el tipo de navegación, como es nuestra primera aplicación pondremne (pero puedes ver las demás, de forma gráfica te especifica a qué se refiere). En Titlendremos el título de la aplicación.

Page 31: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 31/352

s puede pedir instalar dependencias, librerías que aún no tiene instaladas y le hacen falta seggido. Pulsamos en InstallUpgrade si nos sale la siguiente ventana.

Page 32: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 32/352

lsamos Finish y entramos en el entorno de desarrollo de nuestra primera aplicación.rpetas y ficheros de nuestro proyecto

ntrol de Warnings yrores.

Page 33: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 33/352

Page 34: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 34/352

ntroles para colocar en nuestro proyectoesentación Gráfica del Proyecto

opiedades del elemento seleccioandola zona inferior de la presentación Gráfica de nuestra aplicación aparecen dos pestañas, una resentación nombrada y la otra el código de programación. Pestañas Graphical Layout yivity_main.xml, que era el nombre que nos preguntó en el asistente anterior para

comenzar a crear una aplicación Android.

Page 35: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 35/352

pulsar en el menú en Run – Run. O pulsando Ctrl+11. Se compilará y se ejecutará el programemulador. Si sale un error como el siguiente…

significa que has elegido un tipo de CPU que no se ha instalado. Vuelve a la creación de laquina virtual Android, editala y cambia la CPU a ARM ó Atom.

ejecución de la máquina Virtual Android suele tardar un poco. Esto es lo que nos debe salir.

Page 36: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 36/352

guiremos familiarizándonos con el entorno de Eclipse conforme creamos nuestra primeraicación Hola Mundo.

Page 37: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 37/352

APÍTULO

Page 38: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 38/352

Hola Mundo”

apítulo 3 . “Hola Mundo”

rte 3.1 Cambiando el String Hello World

lsamos sobre Hello World! Con el botónrecho y pulsamos Edit Text. Veremos quearece el siguiente valor string/hello_world

o quiere decir que existe una claseada con el nombre hello_world y que segna al objeto TextView de nuestraicación.

ra modificarlo iremos a

olaMundo/res/values/strings.xml

cemos doble click sobre el fichero y nosdrá una ventana para añadir másursos: campos de texto, alfanuméricos,ha/hora, numéricos enteros,

tas,array

Page 39: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 39/352

s,etc.uí tenemos los elementos creados en nuestra primera aplicación. Desde aquí podremos modifvalores de los objetos mostrados en nuestra aplicación.

p_name : El nombre de nuestra aplicaciónlo_world: el mensaje que se está mostrando en textviewnu_settings: configuración menú

le_activity_main: mensaje que se muestra en la barra de título de nuestra aplicacióncemos doble click sobre hello_word y ponemos HOLA MUNDO en value (valor).

lsamos en File – Save, ó CTRL+S.lsamos sobre la pestaña activity_mail.xml, y veremos cómo ha cambiado. ¡Voila!. Fácil, ¿verrte 3.2. Propiedades

niendo seleccionado el TextView1 (hello_world) en la parte de propiedades buscamosxt_Color y en el cuadro ponemos un valor hexadecimal #FF0000 (rojo puro). Si no tienesnocimientos de estos valores te recomiendo busques algún programa como Hex Color Finder.

Page 40: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 40/352

mos a cambiar de posición el texto, que es tan fácil como pinchar y arrastrar al sitio deseado.

nforme arrastramos podemos ver como nossiciona al centro y los lados de formaomática, aunque podemos ponerloremente en la posición deseada.

mos a crear un nuevo recurso, llamadora el tamaño. Para ello buscamos en lasopiedades Text Size, pulsamos los puntospensivos y en la ventana que aparece

lsamos el botón New Dimensión (nuevamensión).

Page 41: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 41/352Name ponemos el nombre Grande y en Value 60px.ta es la muestra de cómo quedaría nuestra aplicación, de momento.

Page 42: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 42/352

ora miremos en el explorador de nuestro proyecto y veremos que tenemos un nuevo ficheromado dimens.xmlolaMundo/res/values/dimens.xmluí se guardaran los recursos de los tamaños.

demos crear en recursos todos los textos y dimensiones que vayamos a utilizar en nuestraicación y luego tan sólo tendremos que ir asignándolos a los objetos que vamos insertando en

oyecto.25

isten otras propiedades que podemos cambiar mucho más sencillas, que no necesitan crear unurso, como pueden ser TypeFace y TextStyle, nos dan varias posibilidades. Por ejemplo,xtStyle podemoseccionar Bold para poner el texto en negrita.

demos pulsar en la lengüeta de visión XML para ver cómo va cambiando nuestro código.

Page 43: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 43/352

Partsertar fondo e imgánes

ra incluir imágenes en nuestro proyecto es muy fácil, basta con arrastrar cualquier fichero deagen a las carpetas drawable- de nuestro proyecto. Las que terminan en hdpi son las de altafinición, las de ldpi baja definición, mdpi definición media, y xhdpi muy alta definición.

ando arrastramos un fichero de imagen siempre nos preguntará si queremos Copy (copiarlo deproyecto) ó Link (enlazar el fichero con el proyecto). Si utilizamos esta segunda opción, el

hero de imagen siempre tendrá que ir junto a la carpeta donde se encuentre nuestro programa omismo lugar/url donde se vinculo.

ocedo y arrastro una imagen a la carpeta drawable-hdpi,omáticamente tendré un nuevo tipo de recurso disponible que se llamará… @drawable/fondoiendo en cuenta que el fichero se llama fondoabst.jpg26 Por lo tanto tendremos que evitar ponmbres iguales a los ficheros de las imágenes que vayamos a utilizar en nuestro proyecto.

mos a poner de fondo la imagen. Seleccionamos el fondo de la aplicación y en propiedadesscamos Background, pulsamos en los puntos suspensivos y veremos que aparecen variasegorías. Abrimos Drawable y veremos tanto nuestra imagen como los iconos de la aplicación

Page 44: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 44/352

leccionamos la imagen de nuestro fondo y ok. Muy sencillo también.resultado sería el que se ve a continuación.

Parte 3.4

mbiar/Visualizar nuestra aplicación en distintos tamaños de dispositivo

Page 45: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 45/352

bre la ventana de visualizaciónáfica existe un pequeño menú parader cambiar la visualización deestra aplicación en el tamaño dentalla de distintos tipos depositivos. Vamos a configurarlora una tablet de 10,1 pulgadas.mbién se pueden crear nuevos tipos

rsonalizados.

También podemos cambiar laentación de la pantalla.

Parte 3.5 Insertando Objetootón)

ertaremos un objeto nuevo. Para ello vamos a Form Widgets y vamos a insertar un objeto But

otón) pinchando sobre él y arrastrándolo a nuestro proyecto. Podemos cambiarle las proporciosde los puntos de sus extremos, incluso podremos modificarle el tamaño y el color de su texto

Page 46: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 46/352

mo lo hicimos anteriormente.

ro podemos comprobar que sale un triángulo de advertencia informándonos de que el texto deltón no tiene

asignado

ngún recurso de cadena (string).

itaremos el warning creando primero una cadena; hacemos doble click sobre strings.xml yamos @string/boton1 pulsando en Add… y seleccionando String y Aceptar.

name escribimos boton1 y en Value, CAMBIA.

Page 47: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 47/352

Guardamos los camblsando CTRL+S o File Save.

lvemos al entorno gráfico de nuestra aplicación (activity_main.xml). Seleccionamos el botón amos y en la propiedad Text pulsamos en los puntos suspensivos.

leccionamos boton1 y pulsamos el botón OK.

hemos quitado el Warning, ahora crearemos un tamaño de letra para la letra de los botones. Stamaño 30px y se llamará txtboton. (Veáse parte 3.2 para recordar)

Page 48: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 48/352

cemos doble click en Dimension, pulsamos el botón Add…leccionamos Dimensión como recurso y OK, en Name ponemos txtboton y en tamaño 30px. Aho quedará asignárselo a la propiedad TextSize del botón.

ogramación 3.6 Programación (Botón)es hora de que programemos algunas líneas. Tenemos que dar funcionalidad al botón que

abamos de crear, por lo tanto programaremos su evento clic.

ando se pulse el botón cambiaremos la frase HOLA MUNDO por BIENVENIDO.

ra programar pulsamos sobre el botón con una C y al

lado MainActivity. Open MainActivity.javas ha llevado a la ventana de programación de nuestra aplicación.

Page 49: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 49/352

FORMA 1las líneas de import tendremos que añadir una nueva más para poder importar la programacióelemento Button.

ort android.widget.Button;

ra Línea para poder cambiar las propiedades del TextViewort android.widget.TextView;or último también añadiremos una del View (escenario) para poder buscar elementos en élort android.view.View;

función que controla el evento clic del botón se colocará dentro de la clase MainActivity, y dconstructor onCreate.

l Button button = (Button) findViewById(R.id.button_id);

on.setOnClickListener(new View.OnClickListener()

lic void onClick(View v) {erform action on click }

30 Todo querdería así:

Page 50: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 50/352

final Button buttonutton) findViewById(R.id.button1);ve para asignar a una variable llamada button1 el objeto que encuentra en la vista de la capa nombre button1.

on1.setOnClickListener( new View.OnClickListener()

lic void onClick(View v)

qui va el contenido del clic

a función lo que permite es programar el button1 antes definido para que cuando salte el evento setOnClickListener se ejecute ción public onclick de su interior.

RMA 2

Page 51: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 51/352

iste una segunda forma de programar lo mismo pero con menos líneas de código, a la larga essmo. Lo único que tenemos que hacer es asignarle al botón en su propiedad onClick el nombrefunción que se deberá ejecutar.

código deogramaciónla

nción seederoducir enalquier gar dentrola clase,

era o

ntro delCreate.edaría comola imagen.

demos ver s Warningslíneasport que ya

selizan,

Page 52: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 52/352

dríamosminarlas,que cone métodolas

cesitaríamos.ha creado una variable global llamada valor=1 de tipo entero. Para saber si estamos mostranmera o la segunda frase. En la función onclickbutton1 controlamos con una función if si valor número u otro para sacar un texto u otro, y después le cambiamos su valor.

í al pulsar el botón va alternando entre el mensaje de Hola Mundo y el de Bienvenido.

Page 53: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 53/352

ilizaré este segundo método para programar los eventos de los siguientes ejemplos, ya que resnos código y más fácil de comprender.

Page 54: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 54/352

APÍTULO

Page 55: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 55/352

Convertidor Celsius Fahrenheit”

apítulo 4 . Convertidor Celsius a Fahrenheit

mo ya conocemos el entorno,mos un poco más directos;nque en este programaguiremos mostrando uno por o todos los pasos.

lsamos en Nuevo Proyecto – licacción Android.damos el nombre Temperaturasuestro nuevo proyecto.

jamos todos los demásrámetros tal como estén,nos el título en la ventanaw Blank Activity.

Page 56: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 56/352

Page 57: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 57/352

Lo primero que

mos a crear so los Id/String necesarios para el programa que vamos a crear.

cordemos que los Id/String están en res/values/strings.xml

Page 58: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 58/352

eamos los siguientes Strings: labelCelcius con valor Celcius, labelFarenheit con valor FahrenelTitulo con valor Convertir Temperaturas, btnConvertir con valor Convertir Celcius ahrenheit.

ta: Recordemos que se pulsa el botón Add, se elige el tipo, y por último se le da el nombre y or.

lvamos a MainActivity, borramos el Mensaje de Hello World! Que nos aparece por defecto eroducimos desde Form Widgets dos textView de tamaño medio y uno de largo.

edaría como se muestra en la imagen.

Page 59: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 59/352

PORTANTE: Para que se muestren todos losStrings creados

Page 60: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 60/352

eriormente hay que guardar el proyecto. Archivo – Guardar todo (File-Save All).

n el clic derecho sobre Large Text, y pulsamos sobre Edit Text…

la ventana que aparece seleccionamos el Id/String labelTitulo y pulsamos aceptar.

alizamos lo mismo para los siguientes dos elementos textView, el primero lo asociamos con

Page 61: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 61/352

elCelcius y el segundo con labelFahrenheit.

ora colocamos un botón y le asignamos el id/String btnConvertir.

mos a añadir dos textFieldso junto a cada dato:lcius y Fahrenheit. Losogeremos que permitan

to valor negativo comositivo (Number Signed).

ora les daremos un Id ada textView colocado, esamente recomendable paraordar sus nombres a lara de programarlos.

tón derecho sobre eltView de Celcius y pulsamos en Edit Id…, lendremos el nombre txtC.

el textView de Fahrenheit haremos lo propio,

Page 62: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 62/352

it Id…, le pondremos el nombre txtF.

mos a asignarle una función al evento Clic del botón. Por lo que debemos ir a la propiedad Onck del panel de Propiedades.

iste otra posibilidad de acceder a la propiedad On Click, y es pulsando con el botón derechobre el botón…

Page 63: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 63/352

ponemos el nombre de función convertir.

es necesario ponerle los dos paréntesis de la función.podemos ir al código de nuestra clase MainActivity para programar el botón.locaremos el siguiente código:kage  com.example.temperaturas;

ort android.os.Bundle;ort android.app.Activity;ort android.view.Menu;ort android.view.View;

o es necesario porque se programa con funciónport android.widget.Button;

ort  android.widget.TextView;

lic class  MainActivity extends  Activity {

verridelic void onCreate(Bundle savedInstanceState) {er.onCreate(savedInstanceState);

ContentView(R.layout.activity_main);

verride

lic boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu);urn true ;

Page 64: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 64/352

lic void convertir(View view) {gradosCelcius;t gradosFarenheit;qui procederemos a recuperar el valor de Celcius // Definimos el objeto en txtCelsiustView txtCelcius= (TextView) findViewById(R.id.txtC ); // Extraemos su valor a la variable gradosCelciusonvirtiendolo a entero realizando un ParsedosCelcius=Integer. parseInt (txtCelcius.getText().toString()); // Aqui lo convertimos a FloatdosFarenheit=(float) (gradosCelcius*1.8)+32;qui pasamos el resultado al objeto texttView txtFarenheit= (TextView) findViewById(R.id.txtF ); txtFarenheit.setText(Float.toString (gradosFarenheit));

rte 4.1 Celsius-Fahrenheit-Kelvin (GroupRadio)mos a modificar el programa anterior sustancialmente. Lo primero a modificar será el activityta gráfica.

overemos primero el botón al pie del entorno. Posteriormente moveremos las etiquetas Celsiuhrenheit al pie, añadiendo debajo un nuevo textView de tamaño Medio.

nto a estos tres textView añadiremos otros 3 Medium Text (textView). Eliminamos uno de lostFields que teníamos creados (yo he eliminado el de txtF, Fahrenheit).

Page 65: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 65/352

a izquierda del TextFields metemos otro Medium Text (textView).r último metemos en el medio un Conjunto de Radio Buttons.

la imagen podemos ver como quedaría. Vamos a añadir nuevos Id/Strings a nuestro proyectotanto vamos a res/values/strings.xml e introducimos los siguientes con su valor.

elTemp con valor TemperaturaelenC con valor en Celcius

elenF con valor en FahrenheitelenK con valor en KelvinelKelvin con valor Kelvinelvalor con valor 0

continuación asignamos con clic derecho-Edit Text a cada objeto su Id/String para que quede cla imagen que se muestra antinuación.

las etiquetas Medium Text junto a Celcius-Fahrenheit-Kelvin asignamos un mismo labelvalortres, no existe ningún problema para asignar el mismo Id/string a varios objetos distintos.

n el botón derecho-Edit Id cambiaremos los id de algunos elementos, para que queden como s

Text Fields junto a etiqueta Temperatura su Edit Id será txtT Radio button Celcius con EditdioCRadio button Fahrenheit con Edit Id radioFRadio button Kelvin con Edit Id radioK Etiqueta con valor 0 de Celcius con Edit Id gradosC Etiqueta con valor 0 de Fahrenheit congradosF Etiqueta con valor 0 de Kelvin con Edit Id gradosK 

ta: Habrás notado cierta dificultad para colocar los elementos en las posiciones correctas, seperponen a veces, otras se mueven a sitios no deseados, etc. Esto es debido a que los elemento

tribuyen mediante layouts, o capas, que son como divisores de la ventana. Lo veremos en el

Page 66: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 66/352

pítulo 4 parte 4 (Parte 4.4).

ora sólo los quedará cambiar la programación del botón, que comprobaremos el estado del ratton para ver cuál está marcado y realizar los cálculos en función de eso.código quedaría como sigue:

kage  com.example.celfah;

ort android.os.Bundle;

ort android.app.Activity;ort android.view.Menu;ort android.view.View;ort  android.widget.TextView;uevo import para programar widget RadioButtons import android.widget.RadioGroup;

lic class  MainActivity extends  Activity {

verridelic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

ContentView(R.layout.activity_main); }

verridelic boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu);

urn true ;

lic void convertir(View view) {t gradosCelcius=0;t gradosFahrenheit=0;t gradosKelvin=0;qui procederemos a recuperar el valor de Temperatura // Definimos el objeto en txtCelsiustView txtTemperatura= (TextView) findViewById(R.id.txtT );

efinimos la variable radioGroup que apunta al conjunto de radioGroup1dioGroup radioGroup = (RadioGroup) findViewById(R.id.radioGroup1);xtraemos el elemento radio pulsadocheckedRadioButton = radioGroup.getCheckedRadioButtonId();

on una estructura de control Switch ejecutamos el código deseado switch (checkedRadioButton)

e  R.id.radioC  :eleccionado el radio button Celciusor lo que la temperatura introducida está en Celsius // Se tiene que convertir a las otras dos temperaturas

dosCelcius=Integer. parseInt (txtTemperatura.getText().toString()); gradosFahrenheit=(float) (gradosCelcius*1.8)+32; gradosKat) (gradosCelcius)+273.15f;

ak  ;e  R.id.radioF  :eleccionado el radio button Fahrenheitor lo que la temperatura introducida está en Fahrenheit // Se tiene que convertir a las otras dos temperaturas

dosFahrenheit=Integer. parseInt (txtTemperatura.getText().toString()); gradosCelcius=(float) ((gradosFahrenheit-32)*5)/9;dosKelvin=(float) (gradosCelcius)+273.15f;

ak  ;

Page 67: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 67/352

e  R.id.radioK  :eleccionado el radio button Kelvinor lo que la temperatura introducida está en Kelvin // Se tiene que convertir a las otras dos temperaturas

dosKelvin=Integer. parseInt (txtTemperatura.getText().toString()); gradosFahrenheit=(float) ((gradosKelvin-273.15f)*1.8)+32dosCelcius=(float) (gradosKelvin)-273.15f;

ak  ;

odificamos los valores de cada etiqueta con el resultado TextView labelGCelcius= (TextView) findViewById(R.id. gradosC )tView labelGFahrenheit= (TextView) findViewById(R.id. gradosF ); TextView labelGKelvin= (TextView)ViewById(R.id. gradosK ); labelGCelcius.setText(Float.toString (gradosCelcius));lGFahrenheit.setText(Float.toString (gradosFahrenheit)); labelGKelvin.setText(Float.toString (gradosKelvin));

rte 4.2 Versiones y Subversiones

mo el cambio de nuestra aplicación ha sido importante, deberíamos modificar la versión deestro programa. Así cuando se actualiza sabemos si tenemos o no el programa actualizado.

ra modificar la versión o subversión de una aplicación que estamos creando tendremos que hable clic sobre AndroidManifiest.xml que se encuentra en la raíz del proyecto.

versión code vamos a poner 2, y en Versión name 2.0

demos compilar y probar en el emulador nuestra creación 2.0 pulsando el botón Ejecutar ó en

nú Run – Run (Ctrl+F11).

Page 68: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 68/352

emulador ededar enancar,esto que

quierestantesursos.

as laperaberíaostrar o

recido a

o:

Page 69: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 69/352

estra aplicación de conversión de temperaturas funciona a la perfección, pero existe un Bug. Scampo de Temperatura no introducimos ningún valor y pulsamos el botón Convertir la aplicacrá una excepción y se parará con un error.

nemos que controlar que en el campo de Temperatura exista algo escrito antes de proceder a lculos.r lo que vamos al código de programación y vamos a introducir los siguientes cambios en eldigo:

lic void convertir(View view)

t gradosCelcius=0;t gradosFahrenheit=0;

t gradosKelvin=0;

Page 70: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 70/352

qui procederemos a recuperar el valor de Temperatura

efinimos el objeto en txtCelsiustView txtTemperatura= (TextView) findViewById(R.id.txtT );

ortamos la ejecución del código del botónorque no se ha introducido un valor tTemperatura.getText().toString().trim().equals(""))

urn;efinimos la variable radioGroup que apunta al conjunto de radioGroup1

lo cambia el fragmento de código recuadrado de rojo e intercalado en dicho lugar.

mbién es posible que nuestro campo Temperatura no permita decimales, por lo que tendremosmbiar la propiedad InputType del elemento txtT.

leccionamos numberSigned y numberDecimal.

mprueba que existen multitud de datos predefinidos: números de teléfono, fechas, Pulsamos etón de puntos suspensivos y nos aparecerá una nuevantana donde nosrmite marcar los

ores permitidos para introducir.

Page 71: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 71/352

horas, contraseñas, Códigos postales,mail, etc. Crear máscaras de entrada es muy fácil con esta utilidad.permitir decimales, el valor será float, por lo que hay que cambiar tres líneas de programació

e son estas:dosCelcius=Float.parseFloat(txtTemperatura.getText().toString());

esta otradosCelcius=Float.parseFloat(txtTemperatura.getText().toString());

y otras dos líneas que modificar, una para Fahrenheit y otra para Kelvin.

ora vamos a modificar de nuevo la Versión de nuestro programa poniéndole tras estos cambio

rsión 2.1. Compilamos y ejecutamos y comprobamos lo bien que nos ha quedado nuestro

nvertidor de temperaturas.

45rte 4.3 Toast o Notificacionesmos a incorporar a nuestra aplicación de temperaturas una notificación cada vez que se realicnversión.

ra realizar notificaciones/alertas debemos primero crear una entrada con import de las librerícesarias para programar este widget.

Page 72: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 72/352

port android.widget.Toast;n esto tan solo nos quedaría crear una notificación:

ast.makeText(getApplicationContext(), "Conversión de temperaturas Realizada",ast.LENGTH_LONG);ast.show();

primer parámetro es el context dónde se lanza la notificación, el segundo parámetro es el men

mostrar, y el tercero el tiempo que se mostrará (Toast.LENGTH_LONG óast.LENGTH_SHORT).

segunda línea de programación es para mostrar el mensaje de notificación.podría declarar el Toast y mostrarlo en una sola sentencia, unificando ambas. Quedaría así:ast.makeText(getApplicationContext(), "Conversión de temperaturas Realizada",ast.LENGTH_LONG).show();isten muchos parámetros configurables para Toast, así que te aventuro a investigar más.

sotros vamos a incorporarlo justo al final de la función convertir().

mbiamos endroidManifiest.xml la versión a 2.2

resultado debería verse así:

Page 73: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 73/352

Parteyout ó Capas, ordenando los elementos

mo ya te habrás dado cuenta, al ir colocando elementos, cambiándoles los id/String, id yerentes propiedades, suele producir la descolocación de los elementos y por lo tanto el destrodiseño que estamos dando. Esto ocurre en el modo RelativeLayout, que es una capa que nos

rmite la posición libre de los elementos, incluso que se superpongan unos a otros. Pero para q

destroze el diseño hay que seguir un proceso muy sencillo.

lativeLayout: Un elemento se posicionará respecto a otro según el Id de este. Lo único quedremos que hacer será colocar un elemento y asignarle un Id antes de colocar el siguiente. Dema los elementos que vamos colocando cogen como referencia las posiciones de otros Id yaocados y no se estropeará el diseño en futuros cambios de posición de los objetos. El problemide cuando cambiamos el Id de los elementos una vez colocados en el diseño.

isten otros Layout para el diseño, yo recomendaría LinearLayout. Mezclados los dos tipos,

rtical y Horizontal, podemos crear casi cualquier tipo de diseño.

Page 74: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 74/352

LinearLayout (vertical):

Todos los elementos que se coloquen iran uno debajo del otro, en el orden en el qvayamos insertando.

LinearLayout (horizontal):

Todos los elementos que se coloquen iran colocándose a la derecha del anteriorgún el orden en el que los vayamos insertando.Table Layout

mos a coger el ejercicio de temperaturas y lo vamos a rehacer por completo, pero esta vez coyout.necesitaremos modificar nada del código de programación siempre que le demos a los objetmismos nombres.

mos a comenzar el cambio.

primer lugar vamos a sacar una copia de seguridad delivity_main.xml que tenemos, para ello pulsamos copiar egar en la misma ubicación. Como en realidad es unhero, podemos sacar copias de seguridad muyilmente de los ficheros que queramos antes delizar cualquier cambio que consideremos arriesgado.

Page 75: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 75/352

a vez creada una copia podemos modificar 

ivity_main.xml sin miedo alguno. Lo abrimos,eccionamos todos los objetos y pulsamos Suprimir para borrarlos.

a vez limpio vamos a Layouts y vemos las vistas que existen.

la parte derecha de desarrollo de eclipse noscontramos con el panel Outline que muestra la organización de las capas de nuestro proyecto.

mos a crear una capa principal de tipo TableLayout y le iremos añadiendo filas dentro.

Outline tenemos un Layout del tipo RelativeLayout.lsamos con el botón derecho sobre la capa relativa y pulsamos en Change Layout…

ra cambiarlo por Table Layout…

Page 76: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 76/352

pulsamos aceptar. Ahora pulsando sobre él con el botón derecho podemos añadir tantas filas cesitemos con Add Row…

adimos 7 Filas. Debe quedar así:

Page 77: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 77/352

to es OPCIONAL: Vamos a pulsar sobre cada una de las capas y le cambiamos la propiedadckground poniéndole a cada una un color para identificarlas. Esto sólo nos servirá al principira tener visible cada zona y lo que iremos insertando en ella.

ndremos los siguientes colores:

tableRow1 - #ff0000tableRow2 - #b0bcbctableRow3 - #00fff0tableRow4 - #bb00ff tableRow5 - #44ff00tableRow6 - #00b0b0tableRow7 - #ee3030

lugar de añadir elementos a la representación gráfica de la aplicación lo vamos a añadir 

astrándolo al panel Outline sobre el elemento que queramos que sea su contenedor.

Page 78: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 78/352

rastramos Large Text sobre tableRow1 de Outline, tal como se indica en la imagen.

sultado:

Page 79: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 79/352

demos comprobar en al imagen como se ha introducido un nivel interior a tableRow1 y ademáarecido del color de fondo que le pusimos.

tableRow2 vamos a añadir dos columnas a la tabla, una columna para añadir el textView y otumna para añadir el EditText.

rastramos dentro del contenedor tableRow2 dos elementos Layout del tipo LinearLayoutorizontal).

ponemos al primero el id columna1 y al segundo columna2. Para ello pulsamos con el botónrecho sobre cada uno y pulsamos en Assign Id…

cemos lo mismo (colocar Linear Layoutorizontal)/columnas) en tableRow4, tableRow5, tableRow6. Y le damos los nombres column

umna5 tableRow6. Y le damos los nombres columna3-columna5 columna9 (tableRow6).

edaría la distribución como se puede observar en la imagen.

Page 80: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 80/352

mos a arrastrar los siguiente elementos dentro de losntenedores especificados en la siguiente tabla.

ntenedor umna1umna2leRow3

lumna3lumna4lumna5lumna6lumna7lumna8leRow7jeto

edium Text (textView)

it Text (NumberSigned)dioGroupedium Text (textView)edium Text (textView)edium Text (textView)edium Text (textView)edium Text (textView)edium Text (textView)tton

Page 81: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 81/352

sde el propio panel Outline podemos hacer clic con el botón derecho he ir asignando los id/SOn Click correspondientes a cada uno. Redacto el listado por si no lo tienes claro…

tableRow1-large Text con id/String labelTitulotableRow2-columna1-Medium Text con id/String labelTemp tableRow2-columna2-Edit Ten id txtTtableRow3-radioGroup

adio1 con id/String labelenC

adio1 con id radioCadio2 con id/String labelenFadio2 con id radioFadio3 con id/String labelenK adio3 con id radioK 

tableRow4-columna3-Medium Text con id/String labelCelcius tableRow4-columna4-Medixt con id/String labelValor tableRow4-columna4-Medium Text con id gradosCtableRow5-columna5-Medium Text con id/String labelFahrenheit tableRow5-columna6-edium Text con id/String labelValor tableRow5-columna6-Medium Text con id gradosF

Page 82: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 82/352

tableRow6-columna7-Medium Text con id/String labelKelvin tableRow6-columna8-Mediuxt con id/String labelValor tableRow6-columna8-Medium Text con id gradosK tableRow7-button con id/String btnConvertir 

ableRow7-button con propiedad On Click convertir Es posible que le aparezcan unos cuantosnsajes de advertencia, es debido a que muchos elementos no pueden introducirse dentro dementos tableRow, como por ejemplo es el caso de radioGroup.

lución 1: Por lo que para eliminar 

as advertencias debemos sacar fuera de tableRow3 el radioGroup y posteriormente marcarlo minarlo pulsando Suprimir.

lución 2: Añadirle un linearLayout (Horizontal)

cío debajo y ponerle un id (en mi ejemplocio1).

mo existen muchos problemas de este tipo conLayouts siempre existe la posibilidad de

ar el diseño con Layout Relative, que te

Page 83: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 83/352

rmiten colocarlos libremente en el lugar deseado y se posicionaran respecto a la posición 0,0 quina de la pantalla como referencia.

o sí, es interesante que cada elemento o grupo de elementos asociados vayan dentro de un Layerente, por si tenemos que reposicionarlos para cambiar el diseño.

ás adelante iremos creando aplicaciones con Layout Relative.r último vamos a buscar los elementos tableRow que queramos centrar y buscamos la propied

avity (en negrita) y la ponemos a center.

Page 84: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 84/352

APÍTULO

Page 85: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 85/352

Múltiples ventanas

istas-Activity”

apítulo 5. Múltiples ventanas/vistas-Activity

rte 5.1 Pasar de un Activity a otro

a aplicación suele constar de varias vistas o ventanas, nosotros vamos a crear una aplicación s vistas y posteriormente la iremos ampliando.

estra aplicación constará de un Activity principal donde se mostrará un listado de 5 alumnos tas cada uno de ellos.segundo Activity contendrá los mismos 5 alumnos con sus notas medias del primer activity.primero es crear una nueva aplicación Android.

Pulsamos en Androidplication Project.

Page 86: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 86/352

pondremos el nombre Calificaciones y todo lo demás lo dejaremos igual, por lo tanto pulsamuiente en todos los demás pasos y Finalizar.

rramos el elemento Hello World! (textView) que viene colocado por defecto.

mos a crear los Id/String siguientes:

ta1 con valor Nota 1Tr ta2 con valor Nota 2Tr 

ta3 con valor Nota 3Tr nResult con valor Ver Resultado A continuación diseñamos nuestro Activity como se muestra antinuación; fíjese en cómo se ha utilizado el diseño utilizando LinearLayout Verticales yrizontales.

Page 87: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 87/352

n en cuenta los nombres de los editText (nota1,nota2,nota3) y el nombre del botón btnResult cento onClick llamando a la función btnResult.

al colocar los elementos en el interfaz, utilizando los Layout utilizados en el ejemplo, saliera uiente warning (error):e a layout_width of 0dip instead of match_parent for better performance

ra eliminar dicho error tendremos que ir al código xml y quitar la línea que iguale layout_weig

uí pongo el código XML como debería quedar el ejemplo anterior:

inearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tool

roid:id="@+id/LinearLayout1" 

roid:layout_width="match_parent" 

roid:layout_height="match_parent" 

roid:orientation="vertical"  >

inearLayoutroid:id="@+id/LinearLayout01" 

roid:layout_width="wrap_content" 

roid:layout_height="wrap_content"  >

extViewroid:id="@+id/textView1" 

roid:layout_width="wrap_content" 

roid:layout_height="wrap_content" 

roid:text="@string/nota1" 

roid:textAppearance="?android:attr/textAppearanceMedium"  />

ditTextroid:id="@+id/nota1" 

roid:layout_width="wrap_content"  android:layout_height="wrap_content"  android:ems="10" 

roid:inputType="number"  />

inearLayout>

Page 88: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 88/352

inearLayoutroid:id="@+id/LinearLayout02" 

roid:layout_width="wrap_content" 

roid:layout_height="wrap_content"  >xtView

roid:id ="@+id/TextView02" 

roid:layout_width="wrap_content" 

roid:layout_height="wrap_content" 

roid:text="@string/nota2" 

roid:textAppearance="?android:attr/textAppearanceMedium"  />

ditTextroid:id="@+id/nota2" 

roid:layout_width="wrap_content" 

roid:layout_height="wrap_content" 

roid:ems="10" 

roid:inputType="number"  >

questFocus /> </EditText>inearLayout>

inearLayoutroid:id="@+id/LinearLayout03"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  >

extViewroid:id="@+id/TextView01" 

roid:layout_width="wrap_content" 

roid:layout_height="wrap_content" 

roid:text="@string/nota3" 

roid:textAppearance="?android:attr/textAppearanceMedium"  />

ditTextroid:id="@+id/nota3" 

roid:layout_width="wrap_content" roid:layout_height="wrap_content" 

roid:ems="10" 

roid:inputType="number"  />

inearLayout>

uttonroid:id="@+id/btnResult" 

roid:layout_width="wrap_content"   android:layout_height="wrap_content"  android:onClick="btnResult" 

roid:text="@string/btnResult"  />

inearLayout>

ora crearemos nuestro segundo Activity, para ello tendremos que crear dos ficheros, un XML va (Class).

lsamos en File – New – Android XML File (Fichero – Nuevo – Android XML File).

ponemos el nombre de resultados, tal como se muestra en al captura.

eamos el siguiente interfaz con tres elementos: 2 textView y un button.

Page 89: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 89/352

mos de alta dos id/String más:taF con valor Nota FinalnVolver con valor Volver a Notas

interfaz de usuario deberá quedar tal como se muestra en la imagen y la propiedad On Click dtón debe tener el nombre de función btnVolver.

Page 90: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 90/352demos ver que el textView que se ha quedado en medio se le ha asignado el Id notafinal, pero

Page 91: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 91/352

le he asignado Id/String y por lo tanto sale marcado como advertencia (warning). Para quitar arning vamos a hacer un clic con el botón derecho sobre notafinal y Id String…

lsamos el botón Clear.

valor que se mostrará en dicha casilla saldrá más adelante, y vendrá calculado

sde la programación.

ora tenemos que crear la clase Java para el Activity. Para asegurarnos que se crea dentro deloyecto queseamos hacemos un click con el botón derecho dentro de Calificaciones y pulsaremos sobre Fw – Class.

Page 92: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 92/352

Page 93: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 93/352

pondremos el nombre al Activity, en nuestro ejemplo Resultados.nde pone SuperClass le ponemos

droid.app.Activityora hay que modificar el código, puesto que Eclipse no nos genera todo lo necesario.kage  com.example.calificaciones;ort android.app.Activity; import android.os.Bundle;lic class  Resultados extends  Activity {

verridelic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

ContentView(R.layout.resultados);

que está remarcado de amarillo son los cambios respecto a lo que Eclispe suele implementarlo nos quedaría un paso, que es dar de alta el Activity en el fichero AndroidManifiest.xmlrimos el fichero, vamos a la lengüeta Application, pulsamos sobre el botón Add… y en la vene nos aparece marcamos Activity y Aceptar.

Page 94: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 94/352

1º 3

Page 95: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 95/352

leccionamos el nuevo Activity creado y le asignamos el nombre (podemos seleccionarlo conaminar/Browse o escribirlo tal como los hemos creado sin la extensión del fichero).

tenemos nuestro Activity preparado para funcionar.rimos la clase Java MainActivity, y programamos lo siguiente:kage  com.example.calificaciones;

Page 96: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 96/352

ort android.os.Bundle;ort android.app.Activity;ort android.view.Menu;ort android.view.View;ort android.content.Intent;

lic class  MainActivity extends  Activity {

verridelic void onCreate(Bundle savedInstanceState) {

er.onCreate(savedInstanceState);ContentView(R.layout.activity_main);

verridelic boolean onCreateOptionsMenu(Menu menu) {

MenuInflater().inflate(R.menu.activity_main, menu);urn true ;

lic void btnResult(View view)

nt iResult = new Intent(this, Resultados.class); startActivity(iResult);

que se ha añadido está resaltado. Se importan dos nuevas librerías, View para poder programelementos de la vista, e Intent que nos permitirá crear un elemento que se relaciona con una nseactivity.

ntro de la función btnResult a la que llamaba nuestro botón se incluyen dos líneas, la primera

fine iResult que apunta a nuestra nueva Clase-Activity Resultados.class y la segunda línea es lnción encargada de lanzar nuevas Clases-Activity.

obamos nuestro programa y comprobamos mediante el emulador que funciona correctamente.so 5.2 Cerrar Activity y volver al principal (Cerrar aplicación)cerrar el Activity Secundario (Resultados), este volverá al Activity Principal.mos a programar en la clase Resultados.java el botón btnVolver. Para ello añadimos la líneaport para poder programar el botón.port android.view.View;

spués introducimos la función para el botón btnVolver.blic void btnVolver(View view)

ish();

código completo quedaría como se muestra en la imagen.

demos comprobar ejecutando nuestra aplicación, que al volver al Activity Principal, como es

Page 97: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 97/352

finalizó en ningún momento, todos los textView siguen teniendo

datos introducidos antes de saltar al segundo Activity (resultados).

la función finish() se llamara desde el Activity Principal de la aplicación, sería lo mismo quelir-Cerrar-Terminar la aplicación.so 5.3 Pasar valores entre Activity

método putExtra nos permite enviar datos a un Activity. Necesitaremos importar el WidgetitText para poder manipular sus valores.

ort android.widget.EditText; …lic void btnResult(View view) {

Text et1=(EditText)findViewById(R.id.et1); Intent iResult = new Intent(this , Resultados.class); iResult.putExtra(“nota1”,getText().toString()); startActivity(iResult);

ra recuperar el valor en el segundo Activity (Resultados), abrimos la clase y en la funciónCreate rescatamos los valores enviados con putExtra.

ra poder asignar el valor al textView necesitamos importar el Widget textView.

ort android.widget.TextView; …ndle bundle=getIntent().getExtras();

tView notafinal=(TextView)findViewById(R.id.notafinal ); notafinal.setText(bundle.getString("nota1"));

n este ejemplo se ha recuperado un solo valor,el siguiente código para las clases MainActivitsultados pasarán los tres valores, se calculará la media y se mostrará dicha media en el textV

tafinal.

Page 98: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 98/352

Page 99: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 99/352

Page 100: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 100/352

APÍTULO

Page 101: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 101/352

Almacenamiento de variables permanenteharedPreferences)”

apítulo 6. Almacenamiento de variables permanente (SharedPreferences)

pueden crear unas variables que permanecerán con sus valores incluso después de haber cerraplicación, incluso apagado el dispositivo.

to se posible, gracias a que se crea un fichero XML con los nombres de las variables y susores.

uchos programas utilizan SharedPreferences para guardar datos de configuración de la aplicacmo pueden ser: color de fondo de pantalla, tamaños de letra, velocidad de animaciones, datosuario, etc.

ra utilizar la clase SharedPreferences tendremos que importar la librería con dos import.ort android.content.SharedPreferences; import android.content.SharedPreferences.Editor;

Posteriormente para guardar un dato con SharedPreferences tendremos que hacer lo siguiente…redPreferences preferencias=getSharedPreferences("datos",Context.MODE_PRIVATE);or editor=preferencias.edit();or.putString("apellidos", “valor”);or.commit();

primera línea define un objeto del tipo SharedPreferences con el nombre preferencias, y datoá el nombre XML del fichero que se creará (podemos crear varios, por grupos).

modo MODE_PRIVATE nos informa que sólo tendrá acceso al fichero XML la aplicación quó.

ponemos en modo edición con preferencias.edit() Ahora podremos almacenar todos los datoseramos, y de los tipos que queramos como: putString, putBoolean, putInt, putFloat, etc… Commer parámetro el nombre de la variable a almacenar, como segundo parámetro el valor para driable.

ra descargar el buffer y guardarlo todo utilizamos commit()y para recuperarlo…=(EditText)findViewById(R.id.et1);redPreferences preferencias=getSharedPreferences("datos",Context.MODE_PRIVATE);setText(preferencias.getString("apellidos",""));

finimos un EditText donde se introducirá el valor almacenado en una variable SharedPreferenmacenada anteriormente.traemos con getString el dato almacenado en el ejemplo anterior, según el dato sería getBooleInt, getFloat, etc.

stado de Modos de acceso al fichero:ODE_PRIVATE solo la aplicación puede acceder al archivo de preferencias.

ODE_WORLD_READABLE otras aplicaciones pueden consultar el archivo de preferenciasODE_WORLD_WRITEABLE otras aplicaciones pueden consultar y modificar el archivo.

Page 102: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 102/352

ODE_MULTI_PROCESS varios procesos pueden acceder (Requiere Android 2.3 ó superior)rte 6.1 Recordando último acceso

mos a crear una aplicación que guardará el nombre y la fecha/hora. Cuando cerremos nuestraicación y la volvamos a abrir, nos dirá cuál fue el último acceso a la aplicación y nos pedirá evo nombre para almacenar.

e – New – Android Application Project

damos el nombre UAccesos.

En la ventana d

tivity ponemos de título Ultimos Accesos.

Page 103: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 103/352

Page 104: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 104/352

Creamos los

uientes Id/String en strings.xml:

nombreuacc con valor Nombre último Usuario fechauacc con valor Fecha último Acceso mbreUsuario con valor UsuarionombreUsuarioHint con valor Introduzca su nombre btnGuardarySalir con valor Guardar y creamos el siguiente diseño:

Page 105: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 105/352

ate bien en la creación del diseño utilizando Layout horizontales y verticales para crear unatribución por 

as y columnas.

speta los Id de cada objeto para que despuésrresponda con la programación correctamente.

objeto botón tendrá en la propiedad on click valor btnGuardarySalir (función que nosvirá para guardar el usuario escrito y laha/hora actual).

s objetos txtfecha y txtusuario tienen la

opiedad textcolor en rojo, es decir, #FF0000

ra limpiarlos y que no tengan ningún textognado, pulsamos sobre ellos con el botónrecho y Edit Text. En la ventana que nosarece pulsamos en Clear y Aceptar.

Page 106: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 106/352

remos, a continuación, la programación. Primero la programación en la función On Create deestra clase para que ponga en txtfecha y txtusuario el último usuario que entró en el sistema y sentificó.

mos a entrar de una forma nueva dentro del código del Activity. Pulsaremos en la barra de menuestro proyecto dónde pone el nombre del Activity (MainActivity) con una C verde que indie es un Class (una clase).

Page 107: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 107/352

las opciones posibles queremos abrir eldigo de nuestra clase MainActivity por loe pulsamos Open MainActivity…

Importamos dos clases de Java, una nrmite manipular fecha/hora y la otra nos permite dar formato a dicha fecha/hora.port java.text.SimpleDateFormat;

port java.util.Date;

s tres import que pongo a continuación sirven tanto para programar en la Vista el botón, comoogramar los widget TextView y EditText.

port android.view.View;port android.widget.TextView;port android.widget.EditText;ora nos quedan los tres import para trabajar con las variables permanentes SharedPreference

port android.content.Context;

Page 108: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 108/352

port android.content.SharedPreferences; import android.content.SharedPreferences.Editor;

onCreate de nuestra clase MainActivity definimos los dos elementos textView (txtfecha,usuario), recuperamos las dos variables SharedPreferences y las introducimos con setText dencada textView.

tView txtFecha=(TextView) findViewById(R.id.txtfecha); TextView txtUusuario=(TextView) findViewById(R.id.txtuusuari

redPreferences preferencias=getSharedPreferences("datos",Context.MODE_PRIVATE);

Uusuario.setText(preferencias.getString("ultimousuario",""));echa.setText(preferencias.getString("ultimafecha",""));

caso de pulsar el botón btnGuardarySalir se debe recuperar la información contenida dentro itText y guardarla junto con la fecha del sistema como variables permanentes SharedPreferencfunción finish() terminará por completo la aplicación, por lo que al volver a abrir el program

riables deberían estar todas reinicializadas a un valor nulo, vacio o cero; pero no será así porlizamos variables permanentes.

lic void btnGuardarySalir(View view) {

e fecha=new Date();pleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy HH:mm"); EditText txtUsuario=(EditText)ViewById(R.id.txtUsuario);

redPreferencesferencias=getSharedPreferences("datos",Context. MODE_PRIVATE );or editor=preferencias.edit();or.putString("ultimousuario", txtUsuario.getText().toString());or.putString("ultimafecha", sf.format(fecha));or.commit();sh();

ta: Puede probar a apagar el dispositivo Android, si quiere comprobar a ciencia cierta que noaredPreferences no se borran de memoria. Esto se debido a que en realidad los almacena en uhero XML, como ya se explicó anteriormente.uí le pongo el código completo de la aplicación.

ort java.text.SimpleDateFormat;ort java.util.Date;ort android.os.Bundle;

ort android.app.Activity;ort android.view.Menu;ort android.view.View;ort  android.widget.TextView;ort android.widget.EditText;ort  android.content.Context;ort  android.content.SharedPreferences; import android.content.SharedPreferences.Editor;

lic class  MainActivity extends  Activity {verridelic void onCreate(Bundle savedInstanceState) {

er .onCreate(savedInstanceState);

Page 109: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 109/352

ContentView(R.layout.activity_main);tView txtFecha=(TextView) findViewById(R.id.txtfecha); TextView txtUusuario=(TextView) findViewById(R.id.txtuusuar

redPreferencesferencias=getSharedPreferences("datos",Context. MODE_PRIVATE );

Uusuario.setText(preferencias.getString("ultimousuario",""));echa.setText(preferencias.getString( "ultimafecha","")); }

verridelic boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu);

urn true ;

lic void btnGuardarySalir(View view) {e fecha=new Date();pleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy HH:mm"); EditText txtUsuario=(EditText)ViewById(R.id.txtUsuario); Primera ejecución del programa, escribimos el Nombre y pulsamos Guardar y Salir 

redPreferencesferencias=getSharedPreferences("datos",Context. MODE_PRIVATE );or editor=preferencias.edit();or.putString("ultimousuario", txtUsuario.getText().toString());

or.putString("ultimafecha", sf.format(fecha));or.commit();sh();

ramos en aplicaciones yvemos a ejecutar nuestrograma Últimos Accesosemos comprobar la Fecha/Hora y el Nombre de la última vez que Guardamos

Page 110: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 110/352

Page 111: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 111/352

APÍTULO

Page 112: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 112/352

Ficheros Secuenciales”

apítulo 7. Ficheros Secuenciales

demos almacenar datos utilizando ficheros secuenciales, tal como se manipulan con Java.lizaremos las siguientes librerías.

port java.io.BufferedReader; import java.io.IOException;port java.io.InputStreamReader; import java.io.OutputStreamWriter;

primero para manipular buffers, la segunda para tratar notificaciones (warning y errores, por mplo), la tercera para el tratamiento de lectura de ficheros secuenciales (InputStreamReader)arto para grabar en ficheros secuenciales (OutputStreamWriter).

mos a crear un textView, un editText y dos botones (Leer y Guardar). Lo que se escriba en eladro de texto podrá Guardarse y posteriormente recuperarlo con el botón Leer.

earemos el mismo proyecto tanto para crear el fichero secuencial en la memoria interna, comoSD; modificando del proyecto sólo lo que sea necesario.

ta: Tener en cuenta que cuando se inicia desde cero un dispositivo android, las aplicaciones qcargan al inicio no tendrán acceso a la SD en su inicio/creación; porque esta aún no se habrácializado.

rte 7.1 Ficheros Secuenciales en Memoria Internaeva Aplicación Android, le daremos el nombre FicherosIO y en el Title de MainActivity

ndremos Ficheros Secuenciales I/O.

Page 113: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 113/352

Lo siguiente ser

ar las entradas en strings.xml

txtTexto con valor FrasetxtTextoHint con valor Introduce una frase a guardar btnLeer con valor Leer, propiedad On Click con btnLeer btnGuardar con valor Guardar,opiedad On Click con btnGuardar 

eamos tal como la imagen nuestra interfaz deaplicación.

mbiamos el Layout que viene por defectoelative Layout) pulsando un click con eltón derecho sobre él y Change Layout.ndremos uno del tipo Vertical Layout. Cone tipo de capa cada elemento que vayamosocando se irá colocando uno debajo delo.

Page 114: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 114/352

adimos los elementos tal como se ve en el OutLine, tenga en cuenta de poner también los mism

para que después correspondan con los de la programación.

Page 115: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 115/352

mos a crear primero la función btnGuardar(). Al pulsar el botón necesitamos crear un objeto do OutputStreamWriter con la siguiente línea.

putStreamWriter fichero = new

putStreamWriter(openFileOutput("frases.txt",Activity.MODE_PRIVATE)); Definimos la privacidad del ficheroado con el nombre frases.txt

continuación podemos guardar todo lo que queramos llamando al método write.hero.write(“Cadena de texto/String que se quiere guardar”);descarga el buffer, para asegurarnos que se guarda todo correctamente antes de cerrar el fich

hero.flush();hero.close();do esto podemos meterlo dentro de try/catch para gestionar posibles errores en la manipulaciheros.

lic void btnGuardar(View view) {{

StreamWriter archivo = new OutputStreamWriter(openFileOutput("notas.txt",Activity.MODE_PRIVATE)); archivo.write(txtfrase.getText().toString());hivo.flush();hivo.close();

h (IOException e)

ódigo a ejecutar en caso de producirse algún error }Fin public void btnGuardar 

Page 116: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 116/352

ra leer un fichero secuencial tenemos que definir primero un tipo archivo comotputStreamReader.

utStreamReader archivo=new InputStreamReader(openFileInput("frases.txt")); Crear un buffer de lectura confferedReader.fferedReader mibuffer=new BufferedReader(archivo);eremos línea por línea hasta encontrar el final del fichero. Cuando cerraremos el buffer y elhero en ese caso.

ing linea=mibuffer.readLine(); String todo="";hile (linea!=null)

do=todo+linea+"\n"; linea=mibuffer.readLine(); }buffer.close();hero.close();resultado quedaría como sigue:

blic void btnLeer(View view) {tView txtfrasefichero=(TextView)findViewById(R.id.txtfrasefichero); try {

utStreamReader archivo=new InputStreamReader(openFileInput("frases.txt")); BufferedReader br=newfferedReader(archivo);ing linea=br.readLine();ing todo="";

hile (linea!=null)

do=todo+linea+"\n"; linea=br.readLine(); }close();hivo.close();

frasefichero.setText(todo);

ch (IOException e) {

Código a ejecutar en caso de producirse algún error } // Fin Try/Catch } // Fin función public nLeer uestra de la ejecución de la aplicación.uí tiene todo el código completo de la aplicación:

Page 117: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 117/352

ort android.os.Bundle; import android.app.Activity; import android.view.Menu; import  android.view.View; importroid.widget.EditText; import android.widget.TextView; public class MainActivity extends  Activity {

ort  java.io.BufferedReader; import  java.io.IOException;ort java.io.InputStreamReader; import java.io.OutputStreamWriter;

verridelic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

ContentView(R.layout.activity_main); }

verride

lic boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu);urn true ;

lic void btnGuardar(View view) {Text txtfrase=(EditText)findViewById(R.id.txtFrase); try

putStreamWriter archivo = newputStreamWriter(openFileOutput( "frases.txt",Activity. MODE_PRIVATE )); archivo.write(txtfrase.getText().toString());

hivo.flush();hivo.close();

Page 118: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 118/352

ch (IOException e)

ódigo a ejecutar en caso de producirse algún error  }Fin public void btnGuardar 

lic void btnLeer(View view) {tView txtfrasefichero=(TextView)findViewById(R.id.txtfrasefichero); try

utStreamReader archivo= new

utStreamReader(openFileInput("frases.txt"));feredReader br=new BufferedReader(archivo);ng linea=br.readLine();ng todo="";le  (linea!=null)

o=todo+linea+"\n"; linea=br.readLine();

lose();hivo.close();rasefichero.setText(todo); }

ch (IOException e)

ódigo a ejecutar en caso de producirse algún error  }

8rte 7.2 Ficheros Secuenciales en Memoria SD

ra tener acceso a la SD tenemos que dar permisos endroidManifiest.xml, lo mismo ocurrirá en los proyectos que queramos utilizar el Internet Wifi

tín telefónico, las llamadas de móvil, el GPS, los sensores, etc…

mos a modificar el proyecto anterior para que pueda crear el fichero en la memoria SD. (Paranservar el ejercicio anterior yo voy a realizar un copia y pega (Copy-Paste) en Package Explora sacar un duplicado del proyecto. Al duplicado le llamaré IOenSD

rimos el proyecto IOenSD y doble click en AndroidManifiest.xml

Page 119: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 119/352

staña Permisos (Permissions).lsamos el botón Añadir Permiso (Add…) en la ventana que aparece seleccionamos Usesrmission y OK.

Name seleccionamos:.permission.WRITE_EXTERNAL_STORAGE

n esto ya tenemos permiso para escribir en elpositivo de almacenamiento externo.

Page 120: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 120/352

ta: No se olvide siempre de estar guardando continuamente los cambios. Para que Eclipse loonozca en todo el entorno de programación, y no cause errores y advertencias.

ora tenemos que modificar el código de programación, por lo que iremos a MainActivity.java

Page 121: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 121/352

y que añadir tres import de java para tratar con ficheros, especificándole la ruta:

port java.io.File;port java.io.FileInputStream; import java.io.FileOutputStream;

mbién hay que añadir otro import más, este de las librerías de android, para poder definir elmacenamiento externo.

port android.os.Environment;n esto ya podemos poder acceder a la unidad externa cone tartejaSD=Environment.getExternalStorageDirectory();

con los nuevos import de Java podemos hacer referencia al directorio/ruta y nombre de fichereremos abrir para leer o grabar datos.

e fichero=new File(tarjetaSD.getAbsolutePath(), nombrearchivo);n esto Nuevo, vamos a modificar el código de programación del botón Grabar y Leer.

digo completo y comentado para que puedas examinarlo.android.os.Bundle; import  android.os.Environment; import  android.app.Activity; import  android.view.Menu; import  android.view.View; import  android.widget.EditText; import  android.widget.TextView;

j ava.io.BufferedReader; import j ava.io.IOException;java.io.InputStreamReader; import java.io.OutputStreamW riter; import  java.io.File;java.io.FileInputStream; import  java.io.FileOutputStream;

c lass MainActivity extends Activity {

ridevoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);entView(R.layout. activity_main); }void btnGuardar(View view) {

rideboolean onCreateOptionsMenu(Menu menu) {

nuInflater().inflate(R.menu.activity_main, menu);81return true ;

xt txtfrase=(EditText)findViewById(R.id. txtFrase); try

Page 122: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 122/352

nimos la tarjetaSD utilizando la clase Entorno (Environment) File tarj etaSD=Environment. getExternalStorageDirectory();nimos el fichero m ediante File con dos paráme tros:mero la ruta y el segundo el nombre del ficherohero=new File(tarjetaSD.getAbsolutePath(),"notas.txt");

StreamW riter archivo = new OutputStreamW riter(new  FileOutputStream(fichero)); archivo.write(txtfrase.getText().toString());o.flush();o.close();

IOException e)

go a eje cutar en ca so de producirse algún error ew txtfrasefichero=(TextView)findViewById(R.id.txtfrasefichero); txtfrasefichero.setText("Error no hay memoria Externa\n"+e.toString());

public void btnGuardar void btnLeer(View view) {ew txtfrasefichero=(TextView)findViewById(R.id.txtfrasefichero);

imos la tarjetaSD utilizando la clase Entorno (Environment)  File tarj etaSD=Environment. getExternalStorageDirectory();nimos el fichero m ediante File con dos paráme tros:mero la ruta y el segundo el nombre del ficherohero=new File(tarjetaSD.getAbsolutePath(),"notas.txt");

reamReader archivo= new InputStreamReader(new FileInputStream (fichero)); BufferedReader br=new BufferedReader(ar chivo); String linea=br.readLine();odo="";linea!=null)

odo+linea+ "\n"; linea=br.readLine(); }e();o.close();efichero.setText(todo); }IOException e)

go a eje cutar en ca so de producirse algún error efichero.setText("Error no hay memoria Externa"); }

posible que al ejecutar con el emulador salga error de acceso a la memoria externa, puesto ququina virtual no la hemos configurado para que disponga de una emulación de la misma. En

estro dispositivo Android debería funcionar a la perfección.

Page 123: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 123/352

Page 124: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 124/352

APÍTULO

Page 125: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 125/352

Base de datos (SQLite)”

apítulo 8. Base de datos (SQLite)

rte 8.1 Primera Aplicación SQLite

método de almacenamiento de grandes cantidades de datos más óptimo es siempre la utilizaciuna base de datos. SQLite es un motor de base de datos SQL que no necesita un proceso

dependiente. Se creó para dispositivos pequeños, o con poca potencia.

relativamente, muy fácil de utilizar e implantar en nuestras aplicaciones. El acceso a los datoá secuencial como en los ficheros creados anteriormente.

crear nuestra base de datos se creará una carpeta en nuestro proyecto con el nombre databaseedes comprobar mientras corre el programa en el emulador, y sin cerrarlo, vas al explorador hivos “package explorer” de Eclipse). En dicha carpeta, se creará el fichero de nuestra base os.

rte 8.1 Aplicación Completa Ejemplo (* Creación de una base de datos)

earemos un proyecto de agenda de contactos. Para ello crearemos una pequeña base de datos a sola tabla, llamada contactos y con los campos Teléfono, Email y Nombre

primero que vamos a crear una clasera crear nuestra base de datos.dríamos utilizar una aplicación llamada

lite Data Brower para crear unaicación que contenga una base de datoscreada, pero en este primer ejemplo

aremos una clase para crear una base deos vacía y crear Altas, Bajas,

odificaciones, Consultas; en nuestraenda.

Page 126: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 126/352

eva

Page 127: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 127/352

licacióndroid, a la que llamaremossContactos.

el título del Activity principal pondremos Mis Contactos.

lsamos botón derecho sobre src y Nueva Clase (New Class). 84 Le ponemos de nombreminSQLiteOpenHelper. Se le puede poner cualquier otro nombre que queramos, mucho más

mple; pero casi todo el mundo utiliza este nombre que lo convierte en casi en un estándar en to

entornos de trabajo.

Superclass ponemos:droid.database.sqlite.SQLiteOpenHelper 

el código que nos va a generar sale una advertencia, que nos dice que se debe crear el constrla clase.

Page 128: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 128/352

método onCreate será la función encargada de crear nuestra base de datos y el método onUpgrá una función que comprobará y actualizará la base de datos del programa si fuera necesario;mplo, en actualizaciones del programa que cambie la estructura de la base de datos.

Page 129: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 129/352

el constructor creamos una función con el mismo nombre de la clase, y con las variables queibirá.lic AdminSQLiteOpenHelper(Context context, String nombre, CursorFactory factory, int version) {er(context, nombre, factory, version);

mo utilizamos context tendremos que definir un nuevo import en nuestro proyecto.port android.content.Context;rsorFactory está en…port android.database.sqlite.SQLiteDatabase.CursorFactory;

n esto ya podemos utilizar nuestro constructor y utilizar db.execSQL(“ORDEN SQL”) paralizar cualquier tipo de consulta en SQL.

r ejemplo, vamos utilizarlo en onCreate para crear la tabla de nuestra base de datos.código de programación de toda la clase quedaría así:android.content.Context;android.database.sqlite.SQLiteDatabase;android.database.sqlite.SQLiteOpenHelper;android.database.sqlite.SQLiteDatabase.CursorFactory;

c lass AdminSQLiteOpenHelper  extends SQLiteOpenHelper {AdminSQLiteOpenHelper(Context context, String nombre, CursorFactory factory, int version) {context, nombre, factory, version); }

ridevoid onCreate(SQLiteDatabase db) {

O Auto-generated m ethod stubcSQL("create table contactos(telefono text primary key , ema il text, nombre text)"); }

ridevoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

O Auto-generated m ethod stubcSQL("drop table if exists contactos");cSQL("create table contactos(telefono text primary key , ema il text, nombre text)"); // Esto sería un ej emplo de c omo se podría actualizar la base de datos si está crea da

demos crear nuestro proyecto ylizar nuestra base de datos.earemos 4 Activity, y elncipal que ya tenemos (en

al 5 Activity), que tendrá

Page 130: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 130/352

atro botones. Altas_Activity,jas_Activity,odifica_Activity,tado_Activity.

 Botóntas con id/String

tas, e Id btnaltas, onClick btnaltasBotón Bajas con id/String Bajas, e Id btnbajas, onClick btnbajas Botón Modifica con id/Strodificar, e Id btnmodifica,

Click btnmodificaBotón Listado con id/String Listado, e Id btnlistado, onClick 

nlistado

ort android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View;

lic class  MainActivity extends  Activity {

verridelic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

ContentView(R.layout.activity_main); }

verride

lic boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu);urn true ;

Page 131: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 131/352

lic void btnaltas(View view) {odigo para mostrar Activity de Altas }

lic void btnbajas(View view) {lic void btnmodifica(View view) {

odigo para mostrar Activity de Bajas87}odigo para mostrar Activity de Modificaciones }lic void btnlistado(View view) {odigo para mostrar Activity de Listado

este código le tenemos que introducir la programación necesaria para mostrar los Activityrrespondientes. Pero primero vamos a crear los Activity y después añadimos la programacióncesaria.

eamos el Activity para Altas.nombre le pondremos activity_altas.

nalizar.

Page 132: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 132/352

de elemento raíz,nearLayout-Vertical.

guiente, comprobamos que seará en res/layout y

Page 133: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 133/352

Damos de alta los siguientes id/String:labelNombre con valor Nombre: labelTelefono con valor Telefono: labelEmail con valo

mail: btnGuardar con valor Guardar 

Cresiguiente interfaz para activity_altas

Page 134: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 134/352

locamos tres MediumText (textView), y tres TextFields; el textfields de nombre del tipo Persme, el de Telefono como Phone, y el de Email como Email. Les asignamos los id txtNombre,Telefono, txtEmail, correspondientemente.botón tendrá id btnGuardar, y en onClick btnGuardar 

podría haber creadombién un label String paraocar el título en la

becera, poniendo Alta dentacto; para poder ntificar en que activitys encontramos.

mos a crear la clase Altas

ra el activity Altas. Parae Eclipse lo cree en elo correcto hacemos unc con el botón derechobre el src de nuestrooyecto y New – Class (NuevaClase).

Page 135: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 135/352

nemos de nombre Altas y en Superclass android.app.ActivityModificador no olvide tenerlo en public

comprueba que al pulsar el botón Browse… no aparece la superclase que deseamos, pruebe arrar todo lo que está escrito en dicho cuadro de texto y vuelva a pulsar Browse, verá que apardroid.app.Activity

remos de alta el nuevo Activity en AndroidManifiest.xml

Page 136: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 136/352

rimos AndroidManifiest.xm, lengüeta Application, pulsamos sobre el botón Add… y en la vee nos aparece marcamos Activity y Aceptar.

Page 137: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 137/352

leccionamos Activity y pulsamos OK. Quizás sea necesariolizar la barra desplazamiento vertical para ir a la parteerior dónde aparece los Activity y el botón Add.

Page 138: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 138/352

la opción Name ponemos el nombre de la clase que creamos, que fue Altas.

el código de programación que nos quedará en la clase Altas será el siguiente (está totalmentementado):

android.app.Activity;android.os.Bundle;

android.view.View; // Necesario para programar el botónandroid.widget.EditText; // Necesario para e xtraer valores de los cuadros de texto import  android.content.ContentValues; // Para poder definir campos/registros import  android.database.sqlite.SQLiteDatabase; // Necesario p

c lass Altas extends Activity {os a def inir todos los objetos EditText en la clase // Asi tenemos ac ceso a e llos desde cualquier parte de la clase private EditText txtNombre, txtTelefono, txtEmail;

ridevoid onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState);entView(R.layout. activity_altas); // Relacionar Clase con su Ac tivity // Relacionamos todos los objetos anteriormente declara dosus obj etos correspondientes dentro del view (Interfaz) txtNombre=(EditText)findViewById(R.id.txtNombre);fono=(EditText)findViewById(R.id.txtTelefono);il=(EditText)findViewById(R.id.txtEmail );

void btnGuardar(View view) {no un objeto admin relacionado con una base de datos llamada Agenda Adm inSQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "Agenda", null, 1); SQLiteDatabase bd=adm in.getWritableDatabase();nombre=txtNombre.getText().toString();elefono=txtTelefono.getText().toString();email=txtEmail.getText().toString();ea un obj eto registro

Page 139: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 139/352

tValues registro=new ContentValues();envian los valores uno por uno a registro

o.put("nombre",nombre );o.put("telefono",telefono );o.put("email",email );serta en la tabla contactos registrort("contactos", null, registro);erra la base de datose();iamos los cuadros de texto

mbre.setText("");fono.setText("");il.setText("");

amos y volvemos al Activity P rincipal;de la función btnGuardar de la clase

earemos los siguientes activity de una forma más rápida, porque será similar a lo que hemoslizador con Altas. Realizamos el Activity Bajas.

w Android XML File con nombre activity_bajaseamos un nuevo id/String btnBorrar con valor Borrar 

diseño del activityedará como se muestra en la imagen.

editText tendrá el nombre txtTelefono; el botón el nombre btnBorrar y conopiedad On Click btnBorrar.

eamos una nueva Clase

mada Bajas extendida de la clase Activity.damos de alta en AndroidManifiest.xml – Application – Add

código de programación, comentado, se muestra a continuación.

Page 140: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 140/352

c lass Bajas extends Activity {os a def inir todos los objetos EditText en la clase // Asi tenemos ac ceso a e llos desde cualquier parte de la clase private EditText txtTelefono;

ridevoid onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState);entView(R.layout. activity_bajas); // Relacionar Clase con su Activity // Relacionamos obj etos anteriormente declaradou correspondiente dentro del view (Interfaz)lefono --> EditText txtTelefonofono=(EditText)findViewById(R.id.txtTelefono);

void btnBorrar(View view) {

SQLiteOpenHelper a dmin= new AdminSQLiteOpenHelper(this, "Agenda", null, 1); SQLiteDatabase bd=adm in.getWritableDatabase();telefono=txtTelefono.getText().toString();t=bd.delete("contactos", "telefono="+telefono+"",null); // La variable cant será el número de registros coincidentes borrados // Por lo que si su valor es 0 (cero)

abrá borrado ningún registro

amos el activity y volemos al principal;

función btnBorrar Clase

eamos el Activity Modificar.w Android XML File con nombre activity_modificamos de alta un nuevo Id/String con nombre btnConsulta y con valor Consulta.mos el siguiente diseño al Activity.

btnConsulta tendrá en la propiedad On Click btnConsulta btnGuardar tendrá en la propiedadck btnGuardar 

odo Funcionamiento: Escribimos el teléfono y pulsamos el botón Consula. Entonces saldrán loos del registro. Modificamos los datos que queramos cambiar y pulsamos en Guardar.

eamos una nueva Clase llamada Modificaendida de la clase Activity.

damos de alta en AndroidManifiest.xml – 

Page 141: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 141/352

plication – Add

El código de programación, comentado, se muestra ntinuación.

android.app.Activity;android.os.Bundle;android.view.View; // Necesario para programar el botónandroid.widget.EditText; // Necesario para e xtraer valores de los cuadros de texto import  android.database.sqlite.SQLiteDatabase; // Necesario para BD SQLite import  android.content.ContentValues; // Para poder definir 

s/registros import  android.database.Cursor;

c lass Modifica extends Activity {os a def inir todos los objetos EditText en la clase // Asi tenemos ac ceso a e llos desde cualquier parte de la clase private EditText txtNombre, txtTelefono, txtEmail;

ridevoid onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState);entView(R.layout. activity_modifica); // Relacionar Clase con su Ac tivity // Relacionamos todos los objetos anteriormente declara dosus obj etos correspondientes dentro del view (Interfaz)

mbre=(EditText)findViewById(R.id.txtNombre);fono=(EditText)findViewById(R.id.txtTelefono);il=(EditText)findViewById(R.id.txtEmail );

void btnConsulta(View view) {SQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "Agenda", null, 1); SQLiteDatabase bd=adm in.getWritableDatabase();Telefono=txtTelefono.getText().toString();fila=bd.rawQuery ("select telefono,nombre,email from contactos where telefono='"+Telefono+"'",null);moveToFirst())

fono.setText(fila.getString(0)); txtNombre.setText(fila.getString(1)); txtEmail.setText(fila.getString(2)); }

xiste un registro con ese teléfonoFunción btnConsulta

void btnGuardar(View view) {SQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "Agenda", null, 1); SQLiteDatabase bd=adm in.getWritableDatabase();

elefono=txtTelefono.getText().toString();nombre=txtNombre.getText().toString();

Page 142: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 142/352

email=txtEmail.getText().toString();

tValues registro= new ContentValues();o.put("telefono",telefono);o.put("nombre",nombre);o.put("email",email);t = bd.update("contactos", registro, "telefono='"+telefono+"'", null); bd.close();;

==1)

odificaron el número de r egistros especificados por cant elsee modificó ningún registro

Función btnGuardar Clase

s queda un Activity que es el de listado. Este listado de registros se puede realizar de dos fordiante fichas y mediante un grid (tabla).

nuestro primer ejemplo vamos a crearlo en formato fichas porque ya lo tenemos casi creado cactivity anterior, y más adelante modificaremos el programa para sacar un listado de tipo Grid

eamos el Activity Listado.w Android XML File con nombre activity_listadomos de alta los siguientes Id/String:

btnInicio con valor Inicio btnFin con valor FinbtnSiguiente con valor >> btnAnterior con valor << btnSalir con valor Salir 

diseño del Activity Listado quedará como muestra la imagen, fijate bien en los elementos detLine.

s botones tienen su id/Stringrrespondiente a su nombre, y la función igual. (Ej.: btnInicio, id/String btnInicio, propiedad Ock con la función btnInicio).

ta: Un truco sería abrir el Activityodifica, marca los elementos comunes con el nuevo Activity,lsar copiar. En el nuevo Activity pulsamos Pegar y automáticamente tendremos todo con sus

Page 143: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 143/352

Id/String, … todas las propiedades puestas.

ese en los LinearLayout Verticales y Horizontales para colocar de forma correcta los elementeamos una nueva Clase llamada Listado extendida de la clase Activity.

damos de alta en AndroidManifiest.xml – Application – Addprogramación quedaría como sigue, está todo el código comentado.android.app.Activity;android.os.Bundle;

android.view.View; // Necesario para programar el botónandroid.widget.EditText; // Necesario para e xtraer valores de los cuadros de texto import  android.database.sqlite.SQLiteDatabase; // Necesario para BD SQLite import  android.database.Cursor; // Necesario para posicionars

o

c lass Listado extends Activity {os a def inir todos los objetos EditText en la clase // Asi tenemos ac ceso a e llos desde cualquier parte de la clase private EditText txtNombre, txtTelefono, txtEmail;nimos los objetos de la base de datos que vamos a utilizar  AdminSQLiteOpenHelper  admin;Database bd;fila;

ridevoid onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState);entView(R.layout. activity_listado); // Relacionar Clase con su Activity // Relacionamos todos los objetos anteriormente declaradosus obj etos correspondientes dentro del view (Interfaz)

mbre=(EditText)findViewById(R.id.txtNombre);fono=(EditText)findViewById(R.id.txtTelefono);il=(EditText)findViewById(R.id.txtEmail );

nimos nuestra base de datos

=new AdminSQLiteOpenHelper(this, "Agenda", null, 1);mos la base de datosmin.getWritableDatabase();

Page 144: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 144/352

amos una petición Select y la metem os en fila.rawQuery("select telefono,nombre,email fr om c ontactos",null); // Nos movemos al primer registromoveToFirst())

fono .setText(fila.getString(0)); txtNombre.setText( fila.getString(1)); txtEmail.setText(fila.getString(2));

mbre.setText("No hay Contactos"); }

void btnInicio(View view) { // Nos movemos al prim er registro if  (fila.moveToFirst())

fono.setText(fila.getString(0)); txtNombre.setText( fila.getString(1)); txtEmail.setText(fila.getString(2)); }

void btnFin(View view)s movemos al último registro if  (fila.moveToLast())

fono.setText(fila.getString(0)); txtNombre.setText( fila.getString(1)); txtEmail.setText(fila.getString(2));

mbre.setText("No hay Contactos");

mbre.setText("No ha y Contactos"); }

void btnSiguiente(View view) { // Nos movemos al Siguiente Registro if (fila.moveToNext())

fono.setText(fila.getString(0)); txtNombre.setText( fila.getString(1)); txtEmail.setText(fila.getString(2)); }

mbre.setText("No hay m ás registros"); }

void btnAnterior(View view) { // Nos movemos a l registro anterior  if (fila.moveToPrevious())

fono.setText(fila.getString(0)); txtNombre.setText( fila.getString(1)); txtEmail.setText(fila.getString(2)); }

mbre.setText("No hay m ás registros"); }

void btnSalir(View view) {amos la base de datose();izamos el Activity y volvemos al principal finish();

Clase Listado

r último, nos queda vincular todos los activity con el activity principal. Por lo que vamos a ab

código de programación de MainActivity. Recordemos cómo se abría un nuevo activity.Activity = new Intent(this, Nombre_de_la_Clase.class); startActivity(iActivity);

mos a incluir en las funciones de los botones la clase a cargar por cada uno de ellos. EjemploClase Altas:void btnaltas(View view) {

go para m ostrar Activity de Altas Intent iActivity = new Intent(this, Altas.class); startActivity(iActivity);

android.os.Bundle;android.app.Activity;android.view.Menu;android.view.View;android.content.Intent; // No olvidar este import para poder abrir Ac tivity

ntenta hace rlo tú solo. Aunque el c ódigo com pleto está en la siguiente página. 98c lass MainActivity extends Activity {

ridevoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);entView(R.layout. activity_main); }

rideboolean onCreateOptionsMenu(Menu me nu) { getMenuInflater().inflate(R.menu.activity_main, menu);true;

void btnaltas(View view) {Activity = new Intent(this, Altas.class); startActivity(iActivity);

void btnbajas(View view) {Activity = new Intent(this, Bajas.class); startActivity(iActivity);

void btnmodifica(View view) {Activity = new Intent(this, Modifica.class); startActivity(iActivity);

Page 145: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 145/352

void btnlistado(View view) {Activity = new Intent(this, Listado.class); startActivity(iActivity);

estro programa ya está listo para la ejecución. Lo primero sería pulsar en Altas para crear gistros, y después ir probando el resto de opciones.

Parte 8.2 Visualización DDMSdrá comprobar mientras se ejecuta como se crea una carpeta databases que contiene la base dos Agenda.

mero tenemos que cambiar de perspectiva enlipse pulsando en el menú en Window-Other rspective-DDMS

spués en Window-Show View-File Explorer.

berá mostrarnos un entorno similar al que seuestra en la imagen.

Page 146: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 146/352

puede cambiar de Perspectiva en los botones superiores.

uí veremos todos los procesos en ejecución de nuestra máquina virtualizada Android.

la parte de File Explorer, podemos

vegar por las carpetas de nuestroulador. Podemos buscar la carpeta de

Page 147: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 147/352

estra aplicación en la trayectoriata/data/”nombre aplicación” allí

contrará sin dificultad la base deos Agenda. Vea la imagen.

ra volver al entorno de programación,mbiamos a perspectiva Java.

Parte 8.3 Resumen de impoclaraciones y funciones para SQLite

empre creamos primero una clase AdminSQLiteOpenHelper. Podremos exportarla a otrosoyectos modificando el nombre de las tablas y los campos que necesitemos crear.

continuación los import necesarios para la programación en las clases que utilicemos en nuesticación serán tres:

android.database.sqlite.SQLiteDatabase; // Necesario para BD SQLite import  android.content.ContentValues; // Para poder definir campos/registros import  android.database.Cursor; // Necesario para posicionarse en un re gi

los comentarios puede ver para que se utilizará, básicamente, cada uno.siguiente será crear un vínculo entre un objeto definido y nuestra base de datos. Para esto

lizaremos dos líneas de programación:SQLiteOpenHelper admin=new AdminSQLiteOpenHelper(this, "Agenda", null, 1); SQLiteDatabase bd=adm in.getWritableDatabase();

primera crea un vínculo con la base de datos, y la segunda línea de programación abre la bas

os enlazándola con bd.partir de aquí bd hereda varios métodos de la clase SQLiteDatabase. Estos métodos nos

Page 148: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 148/352

mplifican mucho la gestión de la base de datos.emplos:Selección de Registros mediante SELECTfila= bd.rawQuery("select telefono,nombre,ema il from contactos",null);

Movimiento por los registros

oveToNext()veToPrevious() fila.moveToFirst()veToLast()veToPosition(int)

Añadir RegistrostValues registro= new ContentValues(); // Se le envian los valores uno por uno a registro registro.put("nombre",nombre );

o.put("telefono",telefono );o.put("email",email );serta en la tabla contactos registro bd.insert("contactos", null, re gistro);

Eliminar Registros=bd.delete("contactos", "telefono="+telefono+"",null);

Modificar Registros

tValues registro= new ContentValues();o.put("telefono",telefono);o.put("nombre",nombre);

o.put("email",email);t = bd.update("contactos", registro, "telefono='"+telefono+"'", null);

Visualización de un registro

tString(0) fila.getString(1) fila.getString(2)

Page 149: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 149/352

APÍTULO

Page 150: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 150/352

nternet (WebView)rogramación Android con HTML5/CSS3”

apítulo 9. “Internet (WebView). Programación Android con HTML5/CSS3

ra este capítulo vamos a crear un navegador de páginas web. El proceso es muy simple, perondremos la base para crear en los siguientes apartados aplicaciones que sean capaces de

municarse con el sistema Android en ambos sentidos: Android-WEB , WEB-Android

eamos una aplicación con nombre MiNavegador, y en el título (Title) del Activity le pondré Mvegador 0.1mos tres String de alta:

btnVer con valor Ver labelURL con valor URL:hintURL con valor Escribe

EB que quieras ver 

Small Text, un TextView y untton; con los id asignadose se ven en la imagen y susrrespondientes propiedades.

botón tiene en la propiedadClick escrito btnVer 

Page 151: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 151/352

tercer Linear Layout Vertical sin contenido le asignamos el id LinearLayout2. Después leertamos un objeto del tipoebView.

tá en la categoría Composite.

LinearLayout2 le ponemos la propiedad Height a match_parent o fill_parent para que ocupe topacio restante del Layout padre (capa padre, LinearLayout1 en el ejemplo).

Page 152: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 152/352

Page 153: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 153/352

mprobamos que por defecto se le dá el id webView1 que utilizaremos para nuestra programa

cesitamos un importort android.webkit.WebView;

onCreate del Activity activaremos el Javascript de nuestro navegador con la siguiente línea dogramación:bView miNWeb=(WebView)findViewById(R.id.webView1);

NWeb.getSettings().getJavaScriptEnabled();

ra tenerlo definido para todo el ámbito del Activity lo pondremos definido fuera de onCreate o prívate (recordemos que así es una variable de ámbito global para la clase MainActivity, paccesible desde fuera).

tView txtURL= (TextView) findViewById(R.id.txtURL);NWeb.loadUrl(txtURL.getText().toString());

código de programación quedaría como sigue:

ort android.os.Bundle;ort android.app.Activity;ort android.view.Menu;ort android.view.View;ort android.webkit.WebView;ort  android.widget.TextView;lic class  MainActivity extends  Activity {

Page 154: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 154/352

vate WebView miNWeb;

verridelic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

ContentView(R.layout.activity_main);NWeb=(WebView)findViewById(R.id. webView1);NWeb.getSettings().getJavaScriptEnabled();

verride

lic boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu);urn true ;

lic void btnVer(View view) {tView txtURL= (TextView) findViewById(R.id.txtURL); miNWeb.loadUrl(txtURL.getText().toString()); }

estra aplicación no funcionará sile damos permisos de acceso a

TERNET.r lo que abrimos nuestrodroidManifiest.xml

ego en Permissions pulsamos en AddUses Permission – droid.permission.Internet

Page 155: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 155/352

Page 156: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 156/352

iste un pequeño problema en nuestra aplicación, y es que si pulsamos sobre cualquier enlace s lo abrirá pero en el navegador de nuestra Android y no en nuestra aplicación.

ra solucionar este problema tendrá que quedarse onCreate tal como se muestra.

verridelic void onCreate(Bundle savedInstanceState) {er.onCreate(savedInstanceState);

ContentView(R.layout.activity_main);NWeb=(WebView)findViewById(R.id. webView1);NWeb.getSettings().getJavaScriptEnabled();NWeb.setWebViewClient(new WebViewClient()

verride

Page 157: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 157/352

lic boolean shouldOverrideUrlLoading(WebView view, String url)

w.loadUrl(url); return true ;

ista otra forma de realizarlo, que es creando una clase prívate y asociándola a setWebClient.

edaría el segundo método (código completo).ort android.os.Bundle;ort android.app.Activity;ort android.view.Menu;ort android.view.View;ort android.webkit.WebView;ort  android.widget.TextView;uevo Import para evitar link externos import  android.webkit.WebViewClient;

lic class  MainActivity extends  Activity {

vate WebView miNWeb;

reamos una clase privada para evitar que se abran los vinculos // en el navegador de Androidsta clase la asociamos en onCreatelic class  enlacesWEB extends  WebViewClient

verridelic boolean shouldOverrideUrlLoading(WebView view, String url) {

w.loadUrl(url); return true ;

verridelic void onCreate(Bundle savedInstanceState) {

er  .onCreate(savedInstanceState); setContentView(R.layout.activity_main); miNWeb=(WebView)findViewById(R.id. webV

NWeb.getSettings().getJavaScriptEnabled(); miNWeb.setWebViewClient(new enlacesWEB());

verride

lic boolean onCreateOptionsMenu(Menu menu) {MenuInflater().inflate(R.menu.activity_main, menu); return true ;

lic void btnVer(View view) {tView txtURL= (TextView) findViewById(R.id.txtURL); miNWeb.loadUrl(txtURL.getText().toString()); }

08 Para hacer que funciona HTML5/CSS3 tendremos que activar el Web Client de Chrome, qne compatibilidad. Un Ejemplo:

= new String("http://www.tecnocodigo.com/"); miNWeb = (WebView) findViewById(R.id.webView1);

NWeb.setWebChromeClient(chromeClient); miNWeb.setWebViewClient(wvClient);NWeb.getSettings().setJavaScriptEnabled(true); miNWeb.getSettings().setPluginsEnabled(true); miNWeb.loadUrl(url);

Page 158: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 158/352

import necesario para utilizar el Web Chrome Client será…ort android.webkit.WebChromeClient;

rte 9.1 Pasar datos de Android a Javascript

mos a crear una aplicación mixta Android-HTML5. Tendremos unos ficheros de página webales html,css,js; todos deben ir en la carpeta asset de nuestro proyecto.

r lo que primero vamos a crear la parte de HTML5/CSS3 y Javascript, y después crearemos lrte de Java-Android.fichero HTML que vamos a crear se llama web.htm y contiene lo siguiente.

ml><head><title>Android --> webView</title>eta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script language="javascript">ction Android_a_JS(texto)

ument.getElementById("zona1").innerHTML=texto;}ript>

yle type="text/css">

na1

kground-color: #9CC;-size:18px;-weight:bold;

yle></head>dy>Hemos creado una función en Javascript que podrá ser llamada desde android sin complicación.</p>Para llamar a nuestro JS desde Android es muy sencillo, pues a la instancia del webView llamamos a javascript: funcion(var);<

v id="zona1">ribe algo en android y será sustituido por este texto.v></body></html>

demos ver como hemos creado la función Android_a_JS(texto). Recibe una variable llamada e enviará a la capa con nombre zona1. Todo esto es Javascript.

mos con nuestra aplicación Android.e – New – Android Application Project

damos el nombre Comunicacion1 y en el Title del Activity Comunicaciones 1rastramos nuestro fichero web.htm a la carpeta assets de nuestro proyecto; nos debe aparecer uiente notificación.

Page 159: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 159/352

demos vincularlo o incrustarlo dentro de nuestraicación. Nosotros optaremos por incrustarlo dentrola propia aplicación, ya que el fichero no será

cesible en la ruta especificada una vez compilado.r esto pulsamos en Copy files y OK.

remos como el elemento se ha incluido dentro deestro explorador.

lo tenemos que crear un webView para mostrar lagina web y un cuadro texto con un botón. Cuando dicho botón se pulse el contenido del cuadroto se enviará a la función javascript creada en nuestra web.

mos de alta el id/string btnPasar con valor Pasar a JS. También puedes crear un id/stringntTxtFrase con valor Escribe el texto a pasar.

Page 160: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 160/352

luimos en nuestro diseño un EditText, un botón y un webView, con los id especificados en laagen que se muestra a continuación.

botón le damos el valor btnPasar a la propiedad On Click.

ora sólo nos quedará la programación. En el onCreate cargar en el webView el fichero web.h

ivar javascript y programar el botón btnPasar.

do el código documentado quedaría como sigue:android.os.Bundle;android.app.Activity;android.view.View;android.webkit.WebView;android.widget.TextView;

c lass MainActivity extends Activity {e WebView miNWeb;e TextView txtFrase;

ridevoid onCreate(Bundle savedInstanceState) {onCreate(savedInstanceState);

entView(R.layout. activity_main);e=(TextView)findViewById(R.id.txtFrase);eb=(WebView)findViewById(R.id.webView1);

Page 161: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 161/352

vamos javascript utilizando setJavaScriptEnabled en lugar de getJavaScriptEnabledeb.getSettings().setJavaScriptEnabled(true);ayectoria que hay que especificar para acceder a los recursosionados en el directorio assetsndroid_asseteb.loadUrl("file:///android_asset/web.htm");

void btnPasar(View view) {calamos la variable de textoo de la variable que llama a Android_a_JSión JavaScript contenida dentro de web.htmeb.loadUrl("javascript:Android_a_JS('" + txtFrase.getText().toString() + "')");

izás dé un Warning en la línea dónde activamos para el webView la ejecución de Javascript.eb.getSettings().setJavaScriptEnabled(true);

to es debido a que puede causar un peligro de seguridad, al poderse ejecutar/inyectar javasripernos. Pero como somos nosotros mismos los que creamos nuestros javascript, no debe existi

ngún problema.

Page 162: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 162/352

sde Android se puede inyectar cualquier código Javascript con este método. Por lo que podemlizar llamadas Ajax, o cualquier otra cosa que se nos pueda ocurrir.

rte 9.2 Pasar datos de Javascript a Android

sar datos de Javascript a Android es un poco más complejo, aunque nada del otro mundo. El úoblema es que no podríamos pasar matrices, por lo que tendremos que crearnos funciones parasando valor a valor y construirlo en Android.

sotros vamos a crear un sencillo ejemplo donde se pasan dos variables a nuestra aplicacióndroid y este mostrará ambos datos en un textView.

rtiremos de la aplicación creadaeriormente, por lo que sacamos unplicado de Comunicacion1 y lo llamamosmunicacion2.

Vamos al fichero AndroidManifiest.xml y

mbiamos el nombre del Package a comunicacion2

Page 163: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 163/352

strings.xml y modificamos el id/String tittle_activity_main con el valor Comunicaciones 2.eamos un nuevo package en el Package Explorer. Para ello pulsamos botón derecho sobre src w – Package

ponemos el nombre com.example.comunicacion2

rastramos el MainActivity al nuevo Package y eliminamos el anterior m.example.comunicacion1).

izás para proyectos pequeños te puede resultar más sencillo, crear un proyecto nuevo y copiagmentos de código que quieras pasar de una aplicación a otra.

ta: Deberá actualizar todas las referencias de comunicacion1 a comunicacion2 en caso contracódigo de programación nos dará error, puesto que hace referencia al package con número unoemás. Abrimos el fichero MainActivity.java y cambiamos la primera línea por: package

m.example.comunicacion2;

nuevo código del fichero web.htm pasará a ser el siguiente:

Page 164: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 164/352

ml><head><title>Android --> webView</title>eta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script language="javascript">ction Android_a_JS(texto)

ument.getElementById("zona1").innerHTML=texto;

ction JS_a_Android()

dy>Escriba un texto y un número, estos serán pasados a la aplicación Android:</p>

to: <input type="text" name="texto" id="texto"><br><br>mero:<input type="text" name="texto" id="numero">&nbsp;</p>

put type="button" onClick="javascript:JS_a_Android();" value="Pasar Datos a Android">ody></html>

SInterface.pasaTexto(document.getElementById("texto").value);SInterface.pasaNumero(document.getElementById("numero").value); }

ript></head> 114

han añadido dos cuadros de texto y el botón llamará a la función que enviará datos hacia Andalgoritmo de Android quedará como sigue:android.os.Bundle;android.app.Activity;android.content.Context; import android.view.View;android.webkit.WebView; import android.widget.EditText; import android.webkit.WebViewClient; import  android.widget.Toast;

c lass MainActivity extends Activity {ew miNWeb;

xt txtFrase;String textito; // Aqui se almacenará el Texto enviado por Javascript public int numerito; // Aquí se almac enará e l Número enviado por Javascript

ridevoid onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState);entView(R.layout. activity_main);

e=(EditText)findViewById(R.id.txtFrase);

eb=(WebView)findViewById(R.id.webView1);eb.getSettings().setJavaScriptEnabled( true);mos un interface en nuestro navegador con nombre m iJSInterface miNWeb.addJavascriptInterface(new MiInterface Android(this), "miJSInterface"); // La trayectoria que hay que especificar para a cceder a los recursos // rectorio assets

ndroid_asseteb.loadUrl("file:///android_asset/web.htm" );

void btnPasar(View view) {makeText (this, "Pruebe a pulsar el botón de la W EB para traer da tos hacia Android", Toast. LENGTH_SHORT ).show();

nterface se implem enta en onCreate, y al hac erlondrá acce so desde Javascript a los métodos definidos en esta clase public class MiInterfaceAndroid extends WebViewClient

t mContext;

antiate the interface and set the context */rfaceAndroid(Context c)

ext=c;

5una interface que se fusionara con webView // Por lo que podré llamar a estas funciones

e el Javascript cliente del webViewasí como si formaran parte del propio Javascript public void pasaTexto(String texto)

makeText (mContext, "Texto Recibido: "+texto, Toast. LENGTH_SHORT ).show(); textito=texto;

void pasaNumero(int numero) {

makeText (mContext, "Numero Recibido: "+numero, Toast. LENGTH_SHORT ).show(); numerito=numero;

mo podemos comprobar en el código se muestran unas notificaciones con Toast para informar

Page 165: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 165/352

datos se han recibido con éxito, se almacenan en unas variables de la clase padre MainActive se pusieron de tipo public para no tener ningún problema al acceder a ellas desde una clase

Page 166: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 166/352

APÍTULO0

Page 167: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 167/352

Enviar SMS”

apítulo 10 “ENVIAR SMS”

mos a crear una aplicación que nos permita enviar SMS. El botón de enviar lo pondremos de agen/gráfico, así veremos otra posibilidad de poner un botón que no sea el estándar. Para ellomos a buscar un botón Enviar por internet, parecido a este:

A ser posible en formato PNG, JPG o GIF.

mos de alta en Eclipse una nueva Aplicación Android a la que llamaremos MisMensajes con el Activity Mis Mensajes Beta.

rastramos nuestro fichero de imagen en/drawable-hdpi, hacemos lo mismo en el resto de carpetas de otras resoluciones (res/drawab

pi, res/drawable-mdpi, res/drawable-xhdpi). Hay que tener en cuenta que la imagen debería etintos tamaños y/o resoluciones para distintos tipos de pantalla, pero nosotros vamos a utilizasmo para todas ellas.

damos Copiar lo mismo que hacíamos con el fichero web.htm del capítulo anterior.

nuestro interface añadimos dos EditText y desde la categoría Images&Media añadimos un Imtton. Al añadir este último, nos saldrá un explorador de archivos de nuestro proyecto para queeccionemos

Page 168: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 168/352

magen del botón.

Page 169: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 169/352

118 Crea los sigustringshintTxtTelefono con valor Introduce teléfono hintTxtMensaje con valor Introduce el mensajviar ponemos los id correspondientes a los dos cuadros de texto y al botón (txtTelefono, txtMensa

nEnviarSMS).

ignamos los id/strings a la propiedad Hint de los EditText; el primero txtTelefono y el segundtMensaje.

ra controlar que en el EditText del teléfono sólo se pueda introducir ese tipo de dato, pulsamon el botón derecho sobre él y clic sobre Input Type. Elegimos Phone de la lista de posibilidad

botón de Imagen le asignamos la propiedad onClick con el valor enviarSMS.

Page 170: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 170/352

Para utilizar el sistema de mensajería efonía, tendremos que insertar un nuevo import.ort  android.telephony.SmsManager;

mos permisos en el AndroidManifiest.xml al envío de SMS.

o vamos a crear un método para enviar SMS, no vamos a registrarlos, ni tampoco a recibir la notificación de que el mensaje se iado correctamente o no.

android.os.Bundle;android.app.Activity;android.view.Menu;android.telephony.SmsManager; import  android.widget.EditText;

c lass MainActivity extends Activity {

ridevoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);entView(R.layout. activity_main); }

rideboolean onCreateOptionsMenu(Menu me nu) { getMenuInflater().inflate(R.menu.activity_main, menu);true;

Page 171: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 171/352

119ión que se ejecuta al pulsar el botón public void btnEnviar SMS()

gemos los valores de los EditText y llamamos al método EnviarSMS  EditText numerotlf=(EditText)findViewById(R.id.txtTelefono); EditText mensaj e=(EditText)findViewById(R.id.txtMensaje);SMS(numerotlf.getText().toString(),mensaje.getText().toString());

m os un método para enviar mensaj es a móviles public void EnviarSMS(String NumTelefono, String Mensaje) {

anager sms= SmsManager. getDefault ();ndTextMessage(NumTelefono,null, Mensaje, null, null); }

lo probamos en el emulador, cuando pulsemos el botón Enviar no saldrá ninguna notificación vío, ningún error, Nada. Puesto que el emulador no tiene salida GSM/GPRS, de telefonía.

dríamos sacar el APK e instalarlo en un móvil para probarlo.

Page 172: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 172/352

Page 173: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 173/352

APÍTULO1

Page 174: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 174/352

Menus”

apítulo 11 “Menus”

Android cabe recordar que existe un botón llamado Menú, que nos hace aparecer un menú cotintas posiblidades que nos ofrece. De esta forma podemos acceder en los programas aciones avanzadas, configuraciones, etc.

r lo que para acceder al menú habrá que pulsar eltón Menu de nuestro dispositivo Android, o bien eltón Menú del emulador.

mo se puede realizar cualquier tipo de aplicación de aprendizaje sin necesidad de un menú, hnsiderado oportuno dejarlo hasta bien avanzado el libro. Ahora es el momento de dotar de unancionalidad más a nuestros programas, los Menús.

rte 11.1 Menu Opciones

mos a crear una aplicación que contenga una imagen en nuestro proyecto, y un menú con dosciones: Acerca de… , Salir.

eamos un proyecto llamado MiPrimerMenu, con titulo en el Activity Primer Menu Alpha.

a vez hecho esto, inserto una imagen que tengo en mi equipo dentro de res/drawable-hdpi, y eto de carpetas drawable; copiando el archivo.

Page 175: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 175/352

cojo de la categoría Images&Media el objeto ImagesView y lo arrastro a mi proyecto. Me pide le marque el recurso, le marco el fichero añadido anteriormente por mí y pulso aceptar.

Page 176: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 176/352

2 Puedes fijarte que la imagen tiene un Warning (advertencia) en su esquina, eso es debido a qAndroid las imágenes es recomendable que tengan una descripción, algo parecido a lo que sudiseño de páginas webs para la correcta indexación de las mismas por los motores de búsque

ra quitar la señal de Warning tan sólo tendremos que crear un Id/String

mado DescripImagen1 con valor Mi Logotipo y asignárselo a la propiedad de la imagenntentDescription.

Page 177: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 177/352

Es el momento de crear nuestro menú.

bre la carpeta res de nuestro proyecto hacemos

clic derecho y pulsamos en New – File – droid XML File

la ventana que nos aparecerá le ponemosmbre al fichero, menu1 y tenemos que marcar e el recurso (Resource Type) que queremosar sea de tipo Menu. Tras esto pulsamos en

nalizar.

Page 178: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 178/352

lsamos el botón de los puntos suspensivos, seleccionamos el Id/string creado anteriormente ylsamos aceptar.

tenemos el Warning de la imagen solucionado. Vemos en el Explorador que nos ha creado unheronu1.xml y una carpeta menu.

ro podrás comprobar, que quizás tengaso archivo dentro de la carpeta menu,mado activity_main.xml

to es debido a que al crear nuestra nueva aplicacióndroid, el asistente nos crea automáticamente un menú deciones al que pone el mismo nombre que la activity

Page 179: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 179/352

ncipal.

sotros vamos a continuar con menu.xml, aunque podríamos utilizar perfectamente el que elstente ha creado.tes de continuar vamos a dar de alta los Id/String necesarios para nuestro menú.menuopAcerca con valor Acerca de…menuopSalir con valor Salir 

la ventana que nos ha abierto menú.xml nos aparece un botón Add… que nos permitirá Añadiementos (Item) ó Grupos (Group) de opciones.

mos a añadir un Item pulsando en Add.

Page 180: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 180/352

dejaremos el id del ítem que pone por defecto, necesario para referirnos a él en la programac

Title pulsamos Browse… y seleccionamos elString menuopAcerca Seleccionamos Item y pulsamos OK.

 Nos aparece la siguiente ventanributos para el Item.

Page 181: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 181/352

4 Pulsamos de nuevo Add… , como ya tenemos unmento (Item) creado intenta crearnos un

bmenú por lo que deberemos pulsar en Crear nuevo elemento desde el nivel superior 

reate a New Element at the top level, inenu). Una vez pulsado podremos seleccionar nuevo un Item.

la propiedad Title seleccionamos id/stringnuopSalir.

Page 182: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 182/352

Guardamos y esto es lo que debemos ver en lantana Android Menu -menu1.xml

Page 183: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 183/352

mos a ver el código de programación que tenemos en este momento en MainActivity.javae  com.example.miprimermenu;

android.os.Bundle;android.app.Activity;android.view.Menu;

c lass MainActivity extends Activity {

ridevoid onCreate(Bundle savedInstanceState) {onCreate(savedInstanceState);entView(R.layout. activity_main);

rideboolean onCreateOptionsMenu(Menu menu) {nuInflater().inflate(R.menu.activity_main, menu);true;

te es el código inicial que Eclipse/AndroidSDK nos genera cuando seguimos los pasos para ca nueva aplicación Android.demos ver el método encargado de iniciar el menú de opciones:rideboolean onCreateOptionsMenu(Menu me nu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true;

nde viene escrito R.menu.activity_mainse refiere al menú creado por el propio asistente. Como no hemos

ogido el fichero activity_main.xml propuesto por el asistente, sino que hemos creado el nuestopio llamado menu1.xml; tendremos que sustituir uno por otro dejándolo así:

Page 184: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 184/352

boolean onCreateOptionsMenu(Menu me nu) { getMenuInflater().inflate(R.menu.menu1, menu); return true;

hace falta poner en los recursos nunca la extensión, recordemos las imágenes, y así con todomentos de nuestro proyecto. Si inserto un sonido llamado musica.mp3; el recurso se recurso s

usica, sin la extensión.

nque quizás es más claro y correcto, sobre todo en aplicaciones con mucho código o con variivity, que el menú tenga el mismo nombre que el Activity. Así podremos saber con claridad q

nú corresponde a cuál interface activity.

método que se lanza cuando se pulsa alguna opción del menú es onOptionsItemSelected(Menum), dónde item es el parámetro que se pasa y con getItemId() podemos obtener el elementolsado.

nemos que importar MenuItem, y también importaremos el widget Toast para sacar un mensajtificación en el botón Acerca de. En el botón Salir tan sólo finalizaremos la aplicación androilizando finish().

android.os.Bundle;android.app.Activity;android.view.Menu;android.view.MenuItem;android.widget.Toast;

c lass MainActivity extends Activity {

ridevoid onCreate(Bundle savedInstanceState) {onCreate(savedInstanceState);entView(R.layout. activity_main);

rideboolean onCreateOptionsMenu(Menu menu) {

nuInflater().inflate(R.menu.menu1, menu);126return true ;

rideboolean onOptionsItemSelected(MenuItem item) {

(item.getItemId()) {id.item1:

makeText (this,"Antonio Morales Carmona (10/10/2012)",Toast. LENGTH_SHORT ).show(); break ;id.item2:;

true;

pulsar el botón de Menu aparecerá nuestro menú, con sus funciones correspondientesogramadas.

Page 185: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 185/352

Android 4perior rte 11.2 Menu Opciones con iconos

mbién podemos incluir dentro de nuestros ítems unosnos gráficos. Las imágenes que serán nuestros iconosarrastramos a las carpetas res/drawable?dpi. Por lo

e voy a incluir dos imágenes; salir.png y acercade.png.

cordemos, arrastramos y pulsamos en la opción depiar.

Page 186: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 186/352

n sólo nos queda abrir menu1.xml y en la propiedad Icon poner @drawable/acercade ydrawable/salir en sus correspondientes Item.

ta: No aparece en el emulador debido a la versión (Versión Android 4.1 o superior), ya que hmbiado los menus a partir de esta versión. Android 3.0 o superiores utilizaremos el ActionBa

Page 187: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 187/352

ogramado más adelante. Si instalamos con AVD Manager el SDK Android 2.3.3 el resultado smo se muestra abajo.

droid 2.3128

rte 11.3 Menu Opciones con submenús

ácticamente es igual que un menú simple. La única diferencia es que un Item será un contenedosubmenú y por lo tanto este no tendrá que programarse.

mos a modificar el programa MiPrimerMenu y le vamos a añadir una opción más al menú, llas Webs.rimos el proyecto anterior.mos de alta los siguientes id/String.

Page 188: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 188/352

menuopMisWebs con valor Mis WebsmenuopTecnocodigo con valor Tecnocodigo menuopRincon con valor Rincon del Dibujo nuopCalifato con valor Tierra de Califas

el fichero menu1.xml pulsamos en Add y Create a new element a top level, in Menu.ndremos el item3 al que le ponemos de Title el id/String menuopMisWebs.lsamos de nuevo en Add y ahora Sub-Menu del item que hemos creado anteriormente.

mo podemos comprobar el Sub-Menu no tiene ningún tipo de atributo, sólo nos sirve para agrítems contenidos en el submenú.129 Añadimos un nuevo Item para cada una de los id/stringsocados anteriormente. El resultado debe ser como el que se muestra en la captura.

Page 189: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 189/352

item4 está relacionado con Tecnocodigo

item5 está relacionado con Rincon del Dibujoitem6 está relacionado con Tierra de Califas

ora sólo queda mediante programación introducir en el switch tres item’s más.

ácticamente es todo igual, y se puede crear submenús todo desde entorno gráfico, sin tener quear el xml. Que podemos ver como ha quedado.

version="1.0"  encoding="utf-8" ?>xmlns:android="http://schemas.android.com/apk/res/android"  >

android:id="@+id/item1"  andr oid:title="@string/menuopAcerca" 

:icon="@drawable/acerca" ></item>android:id="@+id/item2"  andr oid:title="@string/menuopSalir" 

:icon="@drawable/salida" ></item>android:id="@+id/item3"  andr oid:title="@string/menuopMisWebs" >>android:id="@+id/item4"  andr oid:title="@string/menuopTecnocodigo" /> <item android:id="@+id/item5"  android:title="@string/menuopRincon" /> <item android:id="@+id/item6"  andr oid:title="@string/menuopCalifato" /> </m>u>

Page 190: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 190/352

0 En programación veremos como crear un Intent para abrir con la aplicación predeterminadagina web. Objetivo cuando pulsemos uno de las tres nuevas opciones creadas en nuestro subms abra el navegador con la página web correspondiente. Para realizar esto tenemos que impors librerías del SDK.

android.content.Intent;android.net.Uri;

primero nos permite importar un Intent, y el segundo referirnos a una URL Web.=new Intent("android.intent.action.VIEW" , Uri. parse("http://www.tecnocodigo.com" ));

ta línea es un ejemplo de cómo podemos abrir una URL creando un Intent. El código completoedaría como se muestra a continuación.

android.os.Bundle;android.app.Activity;android.content.Intent;android.net.Uri;android.view.Menu;android.view.MenuItem;android.widget.Toast;

c lass MainActivity extends Activity {

ridevoid onCreate(Bundle savedInstanceState) {onCreate(savedInstanceState);entView(R.layout. activity_main);

rideboolean onCreateOptionsMenu(Menu menu) {nuInflater().inflate(R.menu.menu1, menu);

Page 191: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 191/352

true;

rideboolean onOptionsItemSelected(MenuItem item)

;(item.getItemId())

id.item1:makeText (this,"Antonio Morales Carmona (10/10/2012)",Toast. LENGTH_SHORT ).show(); break ;

id.item2:;id.item4:

w  Intent("android.intent.action.VIEW", Uri. parse("http://www.tecnocodigo.com")); startActivity(i);

id.item5:w  Intent("android.intent.action.VIEW", Uri. parse("http://www.rincondeldibujo.com")); startActivity(i);

id.item6 :w  Intent("android.intent.action.VIEW", Uri. parse("http://www.califato.com"));

tivity(i);

true;

de la clase MainActivity

rte 11.4 ActionBar (Menu Opciones en Android 3.0 o sup.)Android 3.0 ó superiores los menus de opciones no tienen iconos, y han sido sustituidos por ltionBar.las imágenes de abajo podemos ver la diferencia entre un menú en Android 2.3.3 y un menú e

droid 4.1.

Versión 2.3.3

Versión 4.1diferencia es notable, lo más parecido a los antiguos menus de opciones de Android 2.3.3 es

tionBar.

mos a crear nuestra aplicación con ActionBar. Podríamos utilizar el asistente pero nos crearístante código, la mayor parte no obligatorio, que nos complicaría el aprendizaje de programaceste elemento. Por este motivo vamos a realizarlo desde cero.

eamos un proyecto nuevo (Android Application Project). En la primera pantalla de New Andrplication tenemos que determinar que la versión mínima requerida de SDK sea superior a An (API11 ó superior), ya que ActionBar no tiene compatibilidad con versiones inferiores.

Page 192: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 192/352

demos elegir un Tema, aunque más adelante los veremos más en detalle. En la captura podemr las opciones que he elegido.

ta: Es sustancialmentetinta a las capturas de anteriores capítulos porque es habitual que se actualizen los SDK. Cadualización suele traer cambios/mejoras, alorno de programación. Esta es una de ellas.

mos puesto el nombre MiActionBar, el Activity con título Mi ActionBar.

cesitamos los siguientes import.

android.app.ActionBar; import  android.view.Menu; import android.view.MenuItem;

tionBar para poder declarar nuestra Barra de Acciones, y los dos siguientes para poder definmentos de nuestro menú.el métodoreateOptionsMenu(Menu menu) daremos de alta los item de nuestro menú de la siguiente forma.

nuItem item1=menu.add(0,0,0, "Acerca de"); {m1.setIcon(R.drawable.acercade);m1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );

Page 193: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 193/352

nuItem item2=menu.add(0,1,1,"Salir");

m2.setIcon(R.drawable. salir );m2.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );

puesto dos bloques (item) para que se pueda observar cómo se van colocando los distintosmentos, variando los dos números: segundo y tercer parámetro. Luego el título a mostrar y debloque definimos el icono y una constante que nos permite mostrar el item sólo si existe espa

el menú (SHOW_AS_ACTION_IF_ROOM). Existe otros valores constantes para este últimorámetro como puede ser SHOW_AS_ACTION_WITH_TEXT que nos mostrará el texto. Se pumar varias constantes en este parámetro, por ejemplo:

etShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM+ SHOW_AS_ACTION_WITH_TEXT );

ertamos en res/drawable, en todas las carpetas, una copia de dos iconos que queramos utilizabarra ActionBar. Yo he utilizado dos iconos de 32x32 pixeles porque el emulador lo tengonfigurado con un dispositivo móvil con una resolución media/baja. En los apéndices se hablarbre las resoluciones de los distintos dispositivos y los tamaños de los elementos gráficos de c

rpeta res/drawable.

mbres de los iconos en el ejemplo: acercade.png y salir.png Este sería el código de programampleto de nuestro ActionBar.

android.os.Bundle; import  android.app.ActionBar; import  android.app.Activity; import  android.view.Menu; import android.view.MenuItem;

c lass MainActivity extends Activity {rideted void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

Bar actionbar=getActionBar(); actionbar.setDisplay HomeAsUpEnabled(true); }

rideboolean onCreateOptionsMenu(Menu menu) {e the menu; this adds items to the action bar if it is present.

nuInflater().inflate(R.menu.activity_main, menu);tem item1=m enu.add(0,0,0, "Acerca de"); {etIcon(R.drawable.acercade);etShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );

tem item2=m enu.add(0,1,1,"Salir");

etIcon(R.drawable. salir );etShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM +MenuItem.SHOW_AS_ACTION_WITH_TEXT ); //item2.setShowAsAction();

true; }

Page 194: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 194/352

Vista Vertical de ActionBar

Page 195: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 195/352

sta Horizontal de ActionBar. Para rotar la pantalla en el emulador podemos pulsar CTRL+F11 del teclado numérico.locaremos un dos botones en nuestra aplicación, uno para mostrar la barra ActionBar y otro bra ocultarla.

y a insertar dos iconos más, porque los botones a colocar serán ImageButton. Los nombres denos que inserto son: ver.png y quitar.png

tegoría Images&Media arrastro al interface un ImageButton, le con @drawable/ver como imabtnVer. La propiedad On Click será btnVer.

tegoría Images&Media arrastro al interface el

gundo ImageButton, le con @drawable/quitar 

Page 196: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 196/352

mo imagen e id btnQuitar. La propiedad Onck será btnQuitar.

resultado sería este.

Sólo nos quedaría la programación de ambostones.

cesitamos el import de view: import  android.view.View;

nemos fuera de onCreate (accesible para todos los métodos de la clase) la declaración delionbar: ActionBar  actionbar ;

después las dos funciones que se lanzan al pulsar los botones:lic void btnVer(View view)

onbar .show();

lic void btnQuitar(View view)

onbar .hide();

des ver un efecto de transición que nos oculta la barra superior de título y ActionBar.

s queda la programación de los item del ActionBar, que es exactamente igual a como seogramaba el Menu de Opciones, en eltodo onOptionsItemSelected(MenuItem item).android.os.Bundle; import  android.app.ActionBar; import  android.app.Activity; import  android.view.Menu; import android.view.MenuItem; import  android.view.View; import  android.widget.Toast;

Page 197: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 197/352

c lass MainActivity extends Activity {Bar  actionbar ;rideted void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

ar =getActionBar();ar .setDisplayHomeAsUpEnabled(true); }

rideboolean onCreateOptionsMenu(Menu menu) {e the menu; this adds items to the action bar if it is present.nuInflater().inflate(R.menu.activity_main, menu);

tem item1=m enu.add(0,0,0, "Acerca de"); {etIcon(R.drawable.acercade);etShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM );

tem item2=m enu.add(0,1,1,"Salir");

etIcon(R.drawable. salir );

etShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM +MenuItem.SHOW_AS_ACTION_WITH_TEXT ); //item2.setShowAsAction();

true; }

rideboolean onOptionsItemSelected(MenuItem item) {

(item.getItemId()) {

makeText (this,"Antonio Morales Carmona (10/10/2012)",Toast. LENGTH_SHORT ).show();

;

true;

void btnVer(View view)

ar .show();

void btnQuitar(View view)

ar .hide();

de la clase MainActivity

rte 11.5 Menu Contextual

menú contextual es aquel que aparece en los sistemas con ratón cuando se pulsa el botón dere

n los sistemas táctiles cuando se deja un pulsado de forma prolongada sobre un objeto. Por esmenus contextuales están asociados a los elementos colocados en el interface de nuestra activ

mos a colocar un EditText en nuestro proyecto que al dejar pulsado sobre él, nos salga un menntextual que nos permita cambiar el color de fondo del EditText entre blanco, amarillo y rojo.

eamos una nueva aplicación android con el nombre Contextuales.eamos id/String hintFrase con el valor Escribe un textoertamos un EditText (TextFields) con id txtFrase, le asignamos Hint con el id/String creado

eriormente (hintFrase).

ertaremos los siguientes import en MainActivity.java Para programar un menú contextualiriéndonos a un elemento creado en nuestra interface, bastaría en onCreate referirlo así.

ort android.graphics.Color; // Para seleccionar un color import android.view.ContextMenu; // Para crear un Menu Contextuaort android.view.ContextMenu.ContextMenuInfo; // "ort android.view.MenuInflater; // Para crear un menuort android.view.MenuItem; // Para crear elementos (Item) de menu import android.widget.EditText; // Para programar el E

Text et1=(EditText)findViewById(R.id.txtFrase); registerForContextMenu(et1);

Page 198: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 198/352

n la diferencia de que nosotros declararemos EditText et1 fuera de onCreate para tener accessde cualquier parte dentro de la clase MainActivity.

siguiente, dar de alta un menú, que será el menú contextual de txtFrase.

n el botón derecho sobre res/menú pulsamos en New – Android XML File. Le damos el nombnutxtfrase, seleccionamos el tipo de recurso (Resource Type) como menú y pulsamos Finaliza

lsamos en añadir 3 items, recuerda que el segundo y el tercero tendras que seleccionar que nopenda del anterior sino del nivel superior (Create a new element at the top level, in Menu).

item1 propiedad title amarillo item2 propiedad title rojo item3 propiedad title blanco

Page 199: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 199/352

El métode relaciona el menú contextual con el fichero de menú xml creado se haría con el siguiente mé

void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {etHeaderTitle("Elija el color de fondo:"); getMenuInflater().inflate(R.menu.menutxtfrase, menu);

lo quedaría la parte de programación de cada una de las opciones del menú creado.

boolean onContextItemSelected(MenuItem item) {(item.getItemId()) {

id.item3:coBackgroundColor(Color.rgb(255, 255, 255)); break ;

true;selección menu contextual

id.item1:rillo

BackgroundColor(Color.rgb(255, 255, 0));

id.item2:

BackgroundColor(Color.rgb(255, 0, 0));

138

ódigo completo de la aplicación sería:

android.os.Bundle;android.app.Activity;android.view.View;android.graphics.Color; // Para selecc ionar un color  import android.view.ContextMenu; // Para cr ear un Menu Contextual import  android.view.ContextMenu.ContextMenuInfo; // "android.view.MenuItem; // Para crear elementos (Item) de menu import  android.widget.EditText; // Para programa r el EditText

c lass MainActivity extends Activity {xt et1;

rideted void onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState); setContentView(R.layout.activity_main);ditText)findViewById(R.id.txtFrase); registerForContextMenu(et1);

void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {etHeaderTitle("Elija el color de fondo:"); getMenuInflater().inflate(R.menu.menutxtfrase, menu);

Page 200: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 200/352

rideboolean onContextItemSelected(MenuItem item) {

(item.getItemId()) {

id.item1:rillo

BackgroundColor(Color.rgb(255, 255, 0));

id.item2:

BackgroundColor(Color.rgb(255, 0, 0));

id.item3:coBackgroundColor(Color.rgb(255, 255, 255));

true;selección menu contextualclase MainActivity

139

ra posibilidad es que exista más de un menú contextual por Activity. En ese caso tenemos quembiar la programación a la hora de crear el menú contextual, además de crear dos menus xml qdremos que cambiar los id para que no coincidan (sino en distintos menú xml coincidirían itemm2, item3, etc…).

adimos a nuestra aplicación anterior un nuevo EditText con id txtFrase2.ditText)findViewById(R.id.txtFrase2); registerForContextMenu(et2);

gistramos su menú contextual en el onCreate.el código de la creación de menú contextual con una estructura de control switch, controlamo

Page 201: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 201/352

e id viene llamado.

void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {v.getId()) {id.txtFrase:etHeaderTitle("Elija el color de fondo:"); getMenuInflater().inflate(R.menu.menutxtfrase, me nu); break;id.txtFrase2:etHeaderTitle("Elija el color de letra:"); getMenuInflater().inflate(R.menu.menutxtfrase2, me nu); break;

este ejemplo tendremos quer de alta un menú con nombre

nutxtfrase2.xml, que vamos acar un duplicado denutxtfrase.xml, pero tenemose cambiar los id de los itemra que al programarlos nostan coincidencias.

primer lugar sacamos unplicado de menutxtfrase.xml en

explorador y lo llamamosnutxtfrase2.xml.

rimos menutxtfrase2.xml ymbiamos los id de los item,

Page 202: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 202/352

r item21, item 22, item 23.el método onContextItemSelected(MenuItem item) añadimos al switch los nuevos ítems con s

ogramación y ya tendríamos dos elementos con menú contextual.

te sería el código de programación completo.android.os.Bundle;android.app.Activity;android.view.View;android.graphics.Color; // Para selecc ionar un color  import android.view.ContextMenu; // Para cr ear un Menu Contextual import  android.view.ContextMenu.ContextMenuInfo; // "android.view.MenuItem; // Para crear elementos (Item) de menu import  android.widget.EditText; // Para programa r el EditText

c lass MainActivity extends Activity {xt et1, et2;

rideted void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

entView(R.layout. activity_main); // Registramos un menu contextual para txtFrase  et1=(EditText)findViewById(R.id.txtFrase);

ForContextMenu( et1);stramos un menu contextual para txtFrase2ditText)findViewById(R.id.txtFrase2);ForContextMenu(et2);

ridevoid onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {

Page 203: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 203/352

mos el m enú contextual dependiendo del id que sea switch(v.getId())

id.txtFrase:etHeaderTitle("Elija el color de fondo:"); getMenuInflater().inflate(R.menu.menutxtfrase, menu); break ;

id.txtFrase2:etHeaderTitle("Elija el color de letra:"); getMenuInflater().inflate(R.menu.menutxtfrase2, menu); break ;

rideboolean onContextItemSelected(MenuItem item) {id.item22:

(item.getItemId())

id.item1:

rilloBackgroundColor(Color.rgb(255, 255, 0));

id.item2:

BackgroundColor(Color.rgb(255, 0, 0));

id.item3:coBackgroundColor(Color.rgb(255, 255, 255));

id.item21:rillo

TextColor(Color.rgb(255, 255, 0));

141

TextColor(Color.rgb(255, 0, 0)); break ;

id.item23:coTextColor(Color.rgb(255, 255, 255)); break ;

Switchtrue;OnContextItemSelectedClase

Page 204: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 204/352

APÍTULO2

Page 205: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 205/352

Multi-idiomas, Internacionalización”

apítulo 12 “Multi-Idiomas, Internacionalización”

importante de crear Id/String para cada elemento de texto de nuestra aplicación, es la fácildificación o traducción a distintos idiomas que nos brinda Eclipse/Android SDK.

s id/string vimos que se almacenan en un fichero xml en la carpeta res/values. El fichero enestión debe llamarse string.xml.

ra crear otro idioma bastaría con crear una carpeta res/values-fr y dentro copiamos el ficheroing.xml al que cambiamos los valores de todos los id/sring al idioma Francés.

ando en Android cambiamos el idioma del sistema, todas las aplicaciones buscarán por defecha carpeta, en caso de no existir iría a la carpeta res/values.

emplos: Español

Frances

Ingles

Page 206: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 206/352

icación:/values

/values-fr Al no tener carpeta /res/values-es

estra/values/string.xmlicación: Al tener carpeta /res/values-fr /res/values

/values-fr muestra /res/valuesfr/string.xml

icación: Al no tener carpeta /res/values-en /res/values muestra /res/values/string.xml/values-fr /values-it

4

muy sencillo crear una aplicación multi-idioma en Android, tan sólo tendremos que crear unaducción de los id/strings de string.xml, creando una carpeta distinta para cada idioma.

n Eclipse/AndroidSDK este proceso está con un asistente, por lo que no tendremos que recorextensiones de todos los idiomas a los que queramos traducir nuestra aplicación.

mos a crear un proyecto llamado TextosIdiomas.string.xml damos de alta los siguientes id/string.

txtNombre con valor NombretxtApellidos con valor ApellidostxtDireccion con valor DirecciontxtGracias con valor Gracias por su visita

nuestro interface añadimos cuatro textView (de tamaño Medio). Y les asignamos susrrespondientes con sus id/String.

riba, en la barra de botones del Activity, tenemos un botón que representa la tierra. Al pulsarl

drán los idiomas disponibles y un botón añadir una nueva traducción. Any representa cualquieoma no configurado, y después saldrán los que si tengan un idioma especificado/traducido.

Page 207: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 207/352

lsamos sobre Add New Translatation…

la ventana que nos aparece tenemos que especificar el Lenguaje utilizado, también podemos aniendo la Región, pero no sería necesario. Traducción al lenguaje seleccionado. Cualquier re

Page 208: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 208/352

rpeta que se creará en recursos.

la columna de New Translation escribimos los textos traducidos al idioma seleccionado ylsamos OK.

mprobamos en el explorador que nos ha creado lapeta.

tenemos nada más que hacer, nuestra aplicación ya

multiidioma. Sólo tenemos que ir al menú deustes de Android, Idioma y entrada de texto.

Page 209: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 209/352

Cambiamos eloma por otro, ejecutamos nuestra aplicación y saldrá automáticamente traducida.

í de sencillo es la internacionalización, o traducción de nuestra aplicación Android a distintoomas. Es uno de los puntos fuertes, y más sencillos de implementar.

remos como realizar algo parecido con la orientación de la pantalla de nuestro dispositivodroid. Según esté en Vertical/Horizontal nos mostrará un interfaz ú otro.

Page 210: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 210/352

APÍTULO3

Page 211: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 211/352

nterface Vertical-Horizontal”

apítulo 13 “Interface Vertical-Horizontal”

mismo que actúa Android con los multi-idiomas lo hace con la orientación de la pantalla, si erario diurno o nocturno, resolución de pantalla, etc.

este capítulo vamos a abordar sólo el diseño de una aplicación con una orientación de pantalrtical y un optativo en Horizontal. Dejaremos para un siguiente capítulo el resto de posibilida

ualificadores).

aplicación que crearemos en este capítulo no llevará nada de programación, sólo la parte quenera de forma automática Eclipse para nuestro Activity principal.

mos de alta una nueva aplicación Android en eclipse a la que llamaremos Girados.y a importar tres imágenes en los recursos drawable.

diseño de pantalla con el que hemos trabajadosta ahora siempre ha sido en modo vertical. Ene modo cambiaré la capa principal a LinearLayoutrtical.

lso con el botón derecho sobre la capa (Layout)ncipal creada por defecto, Change Layout. ElijonearLayout Vertical.

Page 212: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 212/352

adimos los tres elementos gráfico (Images&Media – ImageView), que quedarán como se mueontinuación.

ardamos los cambios.

carpeta de recursos está ordenada en drawable, layout, menu y values. En drawable hemos pomprobar que existen varias carpetas según la resolución de la pantalla del dispositivo Androiawable-hdpi,

Page 213: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 213/352

awable-ldpi, etc…). Lo que viene después del guión son

alificadores. Modifican o especifican la cualidad de nuestro dispositivo Android. En el siguie

pítulo se especifican los distintos cualificadores disponibles.nosotros nos interesan sólo dos cualificadores en este capítulo, que són: land y port.port, vertical land, horizontal

staría con sacar una copia de la carpeta de recursos layout y renombrarla como layout-land. Trecursos de dicha carpeta los modificaremos para que tengan un diseño en

rizontal.

nuestro proyecto sólo tendremos dospetas de recursos para los interface de

estras aplicaciones /res/layout ys/layout-land. En caso de que la pantallaé en horizontal se mostrará /res/layoutd, si la pantalla está vertical como noste el recurso /res/layout-port, sestrará el recurso por defecto que siempreá el que no tenga cualificador. Lo mismoe sucedía con los multi-idiomas y que seó una serie de ejemplos gráficos.

rimos el activity_main.xml de /res/layoutd

cemos clic en Outline sobre LinearLayout1ue antes pusimos en LinearLayout Vertical),n las propiedades seleccionamos Orientation

mo horizontal (antes tenía vertical).

Page 214: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 214/352

emos comprobar como la vista se ha puesto de forma automática enzontal al tener la carpeta el nombre layout-land.

Page 215: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 215/352

ecutamos en el emulador nuestra aplicación y giramos la pantalla en el dispositivo virtual conlas 7 ó 9 del teclado numérico o con CTRL+F11. Cambiarán la orientación del Layout igualmas imágenes pasaran de estar de vertical a horizontal.

demos cambiar radicalmente el diseño pero OJO. IMPORTANTE: Los elementos contenidos o tipo de vistas deben contener los mismos elementos que el principal y con los mismos id, yalo contrario la programación daría errores

hacemos referencia a ellos.

puede cambiar la orientación (y otrosodos de vista) mediante los botones delipse/AndroidSDK.

nque estos sólo se suelen cambiar ando el recurso es de tipo default (por fecto), porque cuando se especifica unalificador en el nombre de la carpeta

mos podido comprobar que este modificaaspecto de forma automática.

Page 216: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 216/352

APÍTULO4

Page 217: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 217/352

Listado de cualificadores de Recursos”

apítulo 14 “Listado de cualificadores de Recursos”

s recursos se almacen en una carpeta llamada /res dentro del empaquetado de nuestra aplicaci

una de las características que más agradezco en la programación de aplicaciones para Androfacilidad con la que se gestiona el interfaz de un proyecto según las propiedades del dispositto se pensó así puesto que Android iba a dar soporte a multitud de plataformas distintas. Por mplo, a día de hoy (2012), Android no sólo está presente en telefonía móvil y tablets; sino qu

mbién está presente en televisiones y otros tipos de dispositivos (por ejemplo sin pantalla).

uí detallamos una tabla con todas las carpetas de recursos y para qué se utilizan cada una de e

rpeta Tipo Fichero Uso /res/animator XML /res/anim XML

s/color XML

s/drawable  PNG, JPG,

F, XML /res/layout XMLs/raw -

s/values XMLs/xml XML

opiedades de las animaciones

opiedades de animaciones de objetos Viewfiniciones de colores de nuestra app Archivos de imagen, o XML compilado como recursos dagentructura de una vista, interfaz Cualquier tipo de archivo, que se podrá acceder a él pero sólo eodo lectura.lores definidos, constantes de cualquier tipo. *Ver tabla Tipos de Valuesalquier fichero XML que puede ser leído en nuestra app

bla con los Tipos de recursos Values (res/values)

chivorays.xml colors.xml dimens.xml strings.xml styles.xml xml

finiciónpo Arrayslores de coloresmensioneslores de cadenas de caracteres Estilos predefinidos

alquier tipo de dato almacenado en XML

Page 218: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 218/352

s recursos por defecto (default) son los contenidos en las carpetas de recursos especificadas, ste unos cualificadores que modifican o dan una alternativa al recurso según las característicapositivo.forma en que se nombran las carpetas de recursos alternativos es:

s/tipoderecurso-cualificador tabla de Cualificadores es la siguiente:

tegoría Código País Móvil yperador

ualificador Descripción MCC y MNComa/Regiónmaño de Pantallaturasponible

rES es-rMX en-rUS en-RUK …all normal large xlarge

xxdpchura

sponiblexxxdp

maño

ntalla Disponible Aspectontalla

xxxdpngtlong

ientación de la pantallapo Interfaz

rtd

sk evision appliance

rarionsidad

ntalla (dpi)

Page 219: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 219/352

httnight ldpidpipidpidpidpicc seguido del código de red móvil y mnc seguido del operador. Por ejemplo: mcc214-mnc07

paña y Movistar. *Consultar Apéndice de códigos MCC/MNC Para determinar el idioma se pcódigo para el idioma seguido de un guión una r y el código de la región. Están definidos enomas ISO 639-1, y regiones en ISO 3166-1-alpha-2

small=320x426px aprox.normal=320x470px aprox.large=480x640px aprox.xlarge=720x960px aprox.

pecifica la altura mínima disponible se usa con h precedida de un número y luego dp. Por ej:20dppecifica la altura mínima disponible se usa con w precedida de un número y luego dp. Por ej:20dp

pecifica el tamaño mínimo de pantalla disponible. Se usa con sw precedida de dp. Por ej:720dp

long=pantallas panorámicas (WGVGA,

VGA, FWVGA).notlong=pantallas no panorámicasVGA, HVGA, VGA)port (Portrait) = Verticalland (Landscape) = Horizontal car, dispositivo conectado a unche (dock)desk, dispositivo tipo escritorio televisión, dipositivo de TV.mpatible API 13 o sup.appliance, dispositivo sin pantalla. night horario nocturo

Notnight en horario diurnoLdpi=120dpi aprox.mdpi=160dpi aprox.Hdpi=240dpi aprox.Xhdpi=320dpi aprox.Nodpi=No se escalan imágenes ennción de la densidad de pantalla Tvdpi=213dpi aprox. (desde Api13)

po Pantalla

clado

Page 220: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 220/352

touchger ysexposed keyshidden keyssoft

clado Físico nokeysclasvegaciónerty

keyvexposed navhiddenvegación no táctilnav dpadrsión

ataforma

x notouch no tiene pantalla táctil finger dispone de pantalla táctil keysexposed Elpositivo tiene

lado físicokeyshidden Tiene teclado físicoultokeyssoft tiene teclado virtualftware)nokeys, no tiene teclado físico qwerty, teclado físico tipo qwerty 12key, teclado físico dlas navexposed, tiene teclas devegación

navhidden, no tiene teclasvegaciónnonav, el dispositivo no tiene modonavegacióndpad, tiene un pad direccional trackball, tiene un dispositivo dee tipowheel, tiene ruedas de navegación Versión API soportado por elpositivo. Se usa con v seguido de los digítos de versión del API. Ej: v11

pueden mezclar varios cualificadores, siempre y cuando se siga el orden de la lista anterior. ejemplos encontará una muestra.

emplos de carpetas de recursos modificadas con cualificadores:

s/layout-lands/drawable-es/s/drawable-land/s/drawable-port-hdpi/s/layout-large-land/

s/layout-large-notlong-land/

Page 221: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 221/352

s/drawable-large-notlong-land-night/ /res/layout-v4s/drawable-land-v11

ta: Intente anotar el significado de cada una de las carpetas de recursos, en los casos que se d

Page 222: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 222/352

APÍTULO5

Page 223: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 223/352

Notificaciones del sistema”

apítulo 15 “Notificaciones del sistema”

s notificaciones han ido evolucionando con las nuevas versiones de Android. Así a día de hoyponemos de tres formas de lanzar notificaciones.

Notificación Simple compatible Android 3.0 o inf. Notification.Builder compatible condroid 4.0 o sup. Notification.Builder versión 4.1 o sup.

la actualidad existe una librería que ofrece compatibilidad entre los distintos tipos detificaciones. La librería está programa por Jake Wharton.

rte 15.1 Notificaciones Simples

mos de alta la aplicación NotificacionSimple. Le añadimos un botón con id/String Púlsamendremos que dar de alta el id/string), y con id btnNotificacionSimple; en la propiedad On Clic

ndremos btnNotificacionSimple.

ando pulsemos el botón btnNotificaciónSimple se lanzará la notificación en la barra del sistempulsar sobre dicha notificación volverá a la aplicación que nosotros le hemos especificado enuiente código de programación:

android.os.Bundle;android.view.View;android.app.Activity;android.app.Notification; import  android.app.NotificationManager; import  android.app.PendingIntent; import android.content.Context;android.content.Intent;

c lass MainActivity extends Activity {

Context mContext;

rideted void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

entView(R.layout. activity_main); mContext=this.getBaseContext();

ressWarnings ("deprecation") public void btnMensajeSistema(View view) {

ation notif = new  Notification(R.drawable.ic_launcher , "Alerta creada manualmente", System.currentTimeMillis());tLatestEventInfo( mContext, "Alerta", "Alerta manual con boton Pulsame", PendingIntent. getActivity(mContext, 0, new Intent(), 0));

ationMana ger notifica tionManager= (Notifica tionManager) getSystem Service( NOTIFICATION_SERVICE );tionManager.notify(1011, notif);; }

s textos tacachados son funciones obsoletas para versions antiguas de Android, y así las marcSDK.servamos en el código varias cosas nuevas, como por ejemplo la línea.ressWarnings("deprecation")

que realize esta línea delante de una función es depreciar, no tener en cuenta, los Warningsdvertencias) del código contenido dentro de la función (los textos tachados, obsoletos). Si loocamos delante de una línea de programación, en lugar de un bloque, sólo ignorará el Warninha línea. Se deprecia la Advertencia ó Warning en la función creada para el botón porque esto de notificación está en desuso y sólo se debería utilizar para Android 2.3.3 o inferiores. En

uientes partes de este capítulo encontrará la forma nueva para programar notificaciones.

Page 224: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 224/352

mbién podemos ver que tenemos nuevos import.

android.app.Notification; import  android.app.NotificationManager; import  android.app.PendingIntent;

ra poder crear las notificaciones necesitamos los dos primeros, y para abrir la aplicación queseemos cuando hagamos clic sobre la notificación necesitamos PendingIntent.

r último ya sólo tendríamos las líneas de programación para definir una notificación y las quezan.

esta línea definimos una notificación, con su icono, el título de la alerta, y el tiempo actual enlisegundos de cuando fue lanzada.  Notification notif =  new  Notification(R.drawable.ic_launcher , "Alerta creada manualmente", System.currentTimeMillis());

continuación detallamos los datos que muestra nuestra notificación, quién la lanza (mContext),mbre, y el texto a mostrar en la alerta, la actividad que deberá lanzarse al pulsar sobre latificación se extrae con PendingIntent.getActivity.

tLatestEventInfo( mContext, "Alerta", "Alerta manual con boton Pulsame", PendingIntent. getActivity(mContext, 0, new Intent(), 0));

finimos un Administrador de Notificaciones (notificationManager) como una notificación deltema.ationMana ger notifica tionManager=cationManager)getSystemService( NOTIFICATION_SERVICE );

r ultimo lanzamos la notificaciónn el Administrador detificaciones, dándole como primer or un número identificativo queeramos darle a la notificación, enejemplo 1011; como segundo valor 

pasamos la notificación dada de

a anteriormente.tionManager.notify(1011, notif);

rte 15.2 Notification.Builder

arte de dar más funcionalidades, se ha intentado simplificar la creación de notificaciones deltema con un nuevo tipo de objeto: Notification.Builder.

ra crear una notificación con Builder, bastará definir un solo elemento, configurarlo y lanzarlotificationManager.

Page 225: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 225/352

demos crear un nuevo proyecto igual que el anterior, dónde la API mínima compatible tendrá Android 3.0 ó Api11, mínimo (requerimiento mínimo de compatibilidad paratificaction.Builder).

n el mismo botón Pulsame, y todo igual, la programación quedaría con la funciónnMensajeSistema así:

void btnMensajeSistema(View view) {

ruimos una notificacion llamada notif ation.Builder notif = new  Notification.Builder(mContext);cificamos para notif con sus métodos la configuración para mostrarse

allIcon(R.drawable.ic_launcher ) // Icono de la notificaciónker("Título Mensaje de Alerta") // Título opcionalen(System.currentTimeMillis()) // Fecha/Hora Lanzamiento notif tentTitle("Contenido Titulo") // Titulo del Contenido de notif tentText("Descripcion larga de la notificacion")

ContentInfo("Info") // Texto Informativo 158//.setLargeIcon(bitmap) // Icono Grande que a parecerá al expandir 

tentIntent(PendingIntent. getActivity(mContext, 0, new Intent(), 0));imos NotificationManager para lanzar la notificación del sistema  NotificationManager notificationManager 

ficationManager) mContext.getSystemService(Context. NOTIFICATION_SERVICE ); Notification notification = notif.getNotification();amos la notificacion creada y con el icono especificadoationManager.notify(R.drawable.ic_launcher , notification);

tif.getNotification() es el creador de la notificación una vez realizada toda la configuración. Vhado puesto que está obsoleto para Jelly Bean (Api16) ó superiores. En nuevas versiones deblizarse notif.build() en su lugar.

rte 15.3 Notificaciones en Jelly Bean (Versión API16 ó superior)

n la versión Android 4.1 (Jelly Bean) o superior, existen cuatro variantes para las notificaciosistema: BigText, BigPicture, InBox, botones.

mbién se pueden añadir vibraciones, iluminación de leds de advertencia, y varias propiedade

s (también podía realizarse con las notificaciones en versiones anteriores).

vamos a crear una aplicación nueva, tan sólo modificaremos la anterior aplicación creada.primero será cambiar el método de construcción de la notificación.

tNotification(); por notif.build();

no necesitaremos la línea @SuppressWarnings("deprecation"), puesto que no necesitamos depreciar Advertencias de métodos obsol

n solo con esto, ya tendremos una notificación tradicional pero para la API16.

BigText Existe una variante de notificación que se llama BigText, con la que podremos crear u

tificación con un texto extenso.void btnMensajeSistema(View view) {

ruimos una notificacion llamada notif ation.Builder notif = new Notification.Builder(mContext); // Especificamos para notif con sus métodos la configuración para m ostrarse notif tentTitle("Contenido Titulo") // Titulo del Contenido de notif  .setContentText("Descripcion larga de la notificacion")tentInfo("Info") // Texto InformativoallIcon(R.drawable.ic_launcher ) // Icono de la notificación .setLargeIcon( bitmapG rande ) // Icono Grande que aparecer á al expandir  .setTicker("Título Mensaje de Alerta") // Título opcionalen(System.currentTimeMillis()) // Fecha/Hora Lanzamiento notif   .setContentIntent(PendingIntent. getActivity(mContext, 0, new Intent(), 0));

enzamos la configuración de una notificación de texto largo BIGTEXT Notification notifbigtext=new Notification.BigTextStyle(notif)xt("Texto muuyyy yy yy largo, todo lo largo que uno quiera poner. Mucho, mucho,

" )ContentTitle("Titulo de tamaño grande") .setSummaryText("Texto resumido");

imos NotificationManager para lanzar la notificación del sistema NotificationManager notificationManager =

cationManager)mContext.getSystemService(Context. NOTIFICATION_SERVICE );amos la notificacion creada y con el icono especificado notificationManager.notify(R.drawable.ic_launcher , notifbigtext); }

Page 226: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 226/352

este ejemplo, aunque está todo con comentarios, podemos ver una propiedad de la notificacióe es para un icono grande,LargeIcon(). El tipo de dato que se le tiene que suministrar tiene que ser Bitmap. Por lo que pnvertir un recurso introducido en la carpeta drawable como un Bitmap se utiliza la siguiente líel onCreate.

 bitmapG rande = BitmapFactory .decodeResource (mContext.getResources(),able. proandroid );

tes hemos dado de alta bitmapGrande como Bitmap como publica de la clase, y los importrrespondientes.

android.graphics.Bitmap; import android.graphics.BitmapFactory;

ejemplo completo de cómo quedaría lo detallo en el siguiente tipo de notificación, BigPictureBigPicture

ta notificación en lugar de mostrar unto extenso, muestra una imagen grande.exactamente igual que el anterior, pero

cogiendo el estilo BigPicture.

ra simplificar se utiliza el mismo bitmapra todas las propiedades que lo requieren,ro podría utilizarse uno distinto para cadao.

android.os.Bundle;

Page 227: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 227/352

android.view.View;android.app.Activity;android.app.Notification;android.app.NotificationManager;android.app.PendingIntent;android.content.Context;android.content.Intent;android.graphics.Bitmap;android.graphics.BitmapFactory;

c lass MainActivity extends Activity

os de alta un obj eto de tipo bitmap public Bitmap bitmapGrande;Context mContext;

rideted void onCreate(Bundle savedInstanceState) {

.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext=this.getBaseContext();

ertimos el objeto proandroid.png incluido en /res/drawable en obj eto bitmapGrande= BitmapFactory.decodeResource (mContext.getResources(), R.drawable. proandroid );

void btnMensajeSistema(View view) {

ruimos una notificacion llamada notif ation.Builder notif = new Notification.Builder(mContext); // Especificamos para notif con sus métodos la configuración para m ostrarse notif tentTitle("Contenido Titulo") // Titulo del Contenido de notif  .setContentText("Descripcion larga de la notificacion")tentInfo("Info") // Texto InformativoallIcon(R.drawable.ic_launcher ) // Icono de la notificación .setLargeIcon( bitmapG rande ) // Icono Grande que aparecer á al expandir  .setTicker("Título Mensaje de Alerta") // Título opcionalen(System.currentTimeMillis()) // Fecha/Hora Lanzamiento notif   .setContentIntent(PendingIntent. getActivity(mContext, 0, new Intent(), 0)); .bigLargeIcon( bitmapGr ande)

ContentTitle("Titulo de tamaño grande") .setSummaryText("Texto resumido");

enzamos la configuración de una notificación de texto largo BIGPICTURE161Notification notifbigpicture=new Notification.BigPictureStyle(notif)ture(bitmapGrande)imos NotificationManager para lanzar la notificación del sistema  NotificationManager notificationManager=

cationManager)mContext.getSystemService(Context. NOTIFICATION_SERVICE ); // Lanzamos la notificacion creada y con el icono especificado notificationManager.notify(R.drawable.ic_launcher , notifbigpicture);

Inbox

te tipo de notificación es para mostrar una lista de texto. Con el método addLine(String) iremo

adiendo elementos a nuestra notificación de tipo Inbox. Lo demás es prácticamente igual.

Page 228: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 228/352

código del botón quedaría como sigue:

lic void btnMensajeSistema(View view) {nstruimos una notificacion llamada notif ification.Builder notif = new Notification.Builder(mContext); // Especificamos para notif con sus métodos la configuración paratrarsef ContentTitle("Contenido Titulo") // Titulo del Contenido de notif  .setContentText("Descripcion larga de la notificacion")ContentInfo("Info") // Texto InformativoSmallIcon(R.drawable.ic_launcher ) // Icono de la notificación .setLargeIcon( bitmapGrande) // Icono Grande que aparecerá a

andir  .setTicker("Título Mensaje de Alerta") // Título opcional .setWhen(System.currentTimeMillis()) // Fecha/Hora Lanzamif  .setContentIntent(PendingIntent. getActivity(mContext, 0, new Intent(),

omenzamos la configuración de una notificación de texto largo BIGPICTUREification notifinbox=new Notification.InboxStyle(notif)BigContentTitle("Titulo de tamaño grande")SummaryText("Texto resumido")dLine("Sal")dLine("Azucar")dLine("Mantequilla")ld();

finimos NotificationManager para lanzar la notificación del sistema NotificationManager notificationManager =tificationManager)mContext.getSystemService(Context. NOTIFICATION_SERVICE );anzamos la notificacion creada y con el icono especificado notificationManager.notify(R.drawable. ic_launcher , notifinbox); }

sta ahora hemos definido el estilo dentro de la construcción de la notificación al mismo tiempmodificación que vamos a realizar en el código aparece la forma en que podríamos definir mero el estilo y luego crear una notificación con ese estilo y lanzarla.

el siguiente ejemplo se extrae de un array de String en un bucle for los elementos, se van

adiendo a la notificación y posteriormente se crea nuestra notificación con ese estilo.

android.os.Bundle;android.view.View;android.app.Activity;android.app.Notification;android.app.Notification.InboxStyle; import  android.app.NotificationManager; import  android.app.PendingIntent;android.content.Context;android.content.Intent;android.graphics.Bitmap;android.graphics.BitmapFactory;

c lass MainActivity extends Activity {os de alta un obj eto de tipo bitmapBitmap bitmapGr ande ;Context mContext;y de String, que se m ostraran en nuestra notificación public String lineList[]={"Azucar","Sal","Leche","Pan","Agua"};

rideted void onCreate(Bundle savedInstanceState) {

.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext=this.getBaseContext();

ertimos el objeto proandroid.png incluido en /res/drawable en obj eto bitmapGrande= BitmapFactory.decodeResource (mContext.getResources(), R.drawable. proandroid );

void btnMensajeSistema(View view) {

ruimos una notificacion llamada notif ation.Builder notif = new Notification.Builder(mContext); // Especificamos para notif con sus métodos la configuración para m ostrarse notif tentTitle("Contenido Titulo") // Titulo del Contenido de notif  .setContentText("Descripcion larga de la notificacion")tentInfo("Info") // Texto InformativoallIcon(R.drawable.ic_launcher ) // Icono de la notificación .setLargeIcon( bitmapG rande ) // Icono Grande que aparecer á al expandir  .setTicker("Título Mensaje de Alerta") // Título opcionalen(System.currentTimeMillis()) // Fecha/Hora Lanzamiento notif   .setContentIntent(PendingIntent. getActivity(mContext, 0, new Intent(), 0));

enzamos la configuración de una notificación de texto largo BIGPICTURE InboxStyle notifinbox=new  Notification.InboxStyle(notif)ContentTitle("Titulo de tamaño grande")

mmaryText("Texto resumido");

ing line : lineList) {

Page 229: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 229/352

box.addLine(line);

ation notiflista=notifinbox.build();

imos NotificationManager para lanzar la notificación del sistema  NotificationManager notificationManager=cationManager)mContext.getSystemService(Context. NOTIFICATION_SERVICE );amos la notificacion creada y con el icono especificado notificationManager.notify(R.drawable.ic_launcher , notiflista); }

recomienda que la lista de elementos a mostrar en la notificación no sea superior a 5, ya que ximo a mostrar en la mayoría de pantallas.

ría interesante que comprobaras los cambios entre los dos códigos, para que intentes realizar

iguos ejemplos creando el estilo de notificación y después crear nuestra notificación con dichilo.

Botones

incluir Botones en nuestra notificación no es un estilo, sino un método del propiotification.Builder. Por lo que es tan sencillo como llamar a addAction, informarle del icono a

ostrar en el botón, el texto y el Intent que se abrirá al pulsarlo. Ejemplo:

tion(android.R.drawable.ic_menu_delete, "Borrar", I ntentBorrar)

icono ic_menu_delete viene incluido dentro del propio Android, es un icono del propio sistemnque podríamos incluir uno nuestro. “Borrar” es la cadena de texto a mostrar e IntentBorrar se

ent definido del Activity a abrir.mos a crear una aplicación con tres activity, el primero contiene un botón que lanzará latificación con botones. Otro activity contiene un texto que pone Borrado y otro activity Creadoetivo es que cuando se pulse un botón u otro de la notificación, nos muestra uno u otro activity

mos a crear nuestra aplicación NotificacionBotones, añadimos a drawable la imagen para nuetificación, en mi ejemplo proandroid.pngmos de alta los siguientes id/string:

btnMensajeSistema con valor Pulsame y en On Click btnMensajeSistema

Page 230: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 230/352

labelCreado con valor CREADOlabelBorrado con valor BORRADO

eamos dos Layout XML, aborrar y acrear. En estos asignamos un Large Text y con Edit Text leociamos sus correspondientesquetas/label (id/String).

í quedarían.

Es algo muy simple, pero nos permitirámprender el funcionamiento y programación de los botones en las notificaciones.

ora damos sus correspondientes Clases de alta, por lo que pulsamos botón derecho sobre elckage en nuestra carpeta src y New – Class.

mero damos de alta aborrar con el siguiente código de programación.android.app.Activity; import android.os.Bundle;

c lass aborrar  extends Activity {

ted void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.aborrar );

Page 231: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 231/352

Posteriormente damos de alta aodificando el nombre del layout que le corresponde.

android.app.Activity; import android.os.Bundle;c lass acrear extends Activity {

ted void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acrear );

mos de alta a nuestras dos nuevas clases creadas (iborrar.class, icrear.class) endroidManifiest.xml

cordemos que teníamos que abrir AndroidManifiest.xml, ir a la pestaña Application y abajoadir dos Activity.

Page 232: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 232/352

ra referenciar a una de estos activity bastaría hacerlo así:rrar  = new Intent(this , aborrar.class);adimos un botón en el layout principal, le asignamos en su propiedad On Click 

nMensajeSistema.código de programación quedaría como se muestra a continuación.android.os.Bundle;android.view.View;android.app.Activity;android.app.Notification; import  android.app.NotificationManager; import  android.app.PendingIntent; import android.content.Context;android.content.Intent;android.graphics.Bitmap;android.graphics.BitmapFactory;

c lass MainActivity extends Activity {os de alta un obj eto de tipo bitmap public Bitmap bitmapGrande;

Context mContext;crear ,Iborrar ; //Damos de alta los Intent

rideted void onCreate(Bundle savedInstanceState) {

.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext=this.getBaseContext();

r=Pe ndingIntent.getActivity(m Context, 0, new Intent(), 0); //Iborrar=PendingIntent.getActivity(mContext, 0, new Intent(), 0);

= new Intent(this, aborrar.class);= new Intent(this, acrear.class);ingIntent activity = PendingIntent.getActivity(this, 0, intent, 0);

ertimos el objeto proandroid.png incluido en /res/drawable en obj eto bitmapGrande= BitmapFactory.decodeResource (mContext.getResources(), R.drawable. proandroid );

void btnMensajeSistema(View view) {

ruimos una notificacion llamada notif 

ation.Builder notif = new Notification.Builder(mContext); // Especificamos para notif con sus métodos la configuración para m ostrarse notif tentTitle("Contenido Titulo") // Titulo del Contenido de notif  .setContentText("Descripcion larga de la notificacion")tentInfo("Info") // Texto Informativo

Page 233: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 233/352

allIcon(R.drawable.ic_launcher ) // Icono de la notificación .setLargeIcon( bitmapG rande ) // Icono Grande que aparecer á al expandir  .setTicker("Título Mensaje de Alerta") // Título opcional .setWhen(System.currentTimeM

Hora Lanzamiento notif   .setContentIntent(PendingIntent. getActivity(mContext, 0, new Intent(), 0)) .addAction(android.R.drawable.ic_menu_delete,

"  ,PendingIntent. getActivity(this, 0, Iborrar , 0))tion(android.R.drawable.ic_menu_share, "Crear",gIntent. getActivity(this, 0, Icrear , 0))oCancel( true);

imos NotificationManager para lanzar la notificación del sistema  NotificationManager notificationManager 

cationManager)mContext.getSystemService(Context. NOTIFICATION_SERVICE );

amos la notificacion creada y con el icono especificadocationManager.notify(R.drawable.ic_launcher, notif);tionManager.notify(11,notif.build());

67}

mpruebe como en el addAction se llama con PendingIntent al activity que debería abrirse en cpulsar dicho botón.

el onCreate de cada clase podríamos meter la programación de lo querríamos que se hiciera o de pulsar un botón u otro; y no es necesario que la clase tenga un layout para mostrar.

Opciones Extra

NIDO: Para incluir sonido a una notificación, primero definimos el tipo de notificación y luenfiguramos en la misma.patible API11 o m ay or (Android 4.1 o +)

f.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); ópatible API10 o menor (Android 2.3.3 o -)

und = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

el ejemplo se ha escogido la notificación por defecto del dispositivo.BRACIÓN: Hay que dar permisos en AndroidManifiest.xml para tener acceso a la vibración dpositivo (android.permission.VIBRATE).patible API11 o m ay or (Android 4.1 o +)tVibrate( new long[]{1000,500,1000});

patible API10 o menor (Android 2.3.3 o -)brate = new long[]{1000,500,1000};

rá una vibración de 1 segundo, una pausa de 0.5 segundo y otra vibración de 1 segundo.

D: Tiene dos datos, uno la frecuencia (igual que la vibración), y el color del led. No todos lopositivos tienen este sistema, ni funciona igual.

patible API11 o m ay or (Android 4.1 o +)tLights(Color.RED, 1, 0);

Se tendrá que realizar el import para utilizar constantes de color. import android.graphics.Color;

patible API10 o menor (Android 2.3.3 o -)dARGB = Color.RED;dOnMS = 1; // Frecuencia de encendido (parpadeo led) notif.ledOffMS = 0; // Frencuencia de apagado (parpadeo led) notif.flags = notif.flags | Notification.FLAG_SHOW_LIGHTS 1;

UTO-CANCELAR: En el ejemplo de los botones, ya se incluyó esta línea. Sirve para que una da y pulsemos sobre la notificación, esta se cancele automáticamente.

patible API11 o m ay or (Android 4.1 o +)tAutoCancel( true);

patible API10 o menor (Android 2.3.3 o -)ags = notif.flags | Notification.FLAG_AUTO_CANCEL;

n esto ya hemos visto por completo el tema de las notificaciones del sistema. Existen algunos

Page 234: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 234/352

quicios más que deberá investigar, pero que no le resultarán demasiado difíciles derender/comprender si ha seguido las explicaciones de este capítulo sin problemas.

Page 235: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 235/352

APÍTULO6

Page 236: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 236/352

Servicios”

apítulo 16 “SERVICIOS”

s servicios funcionan en segundo plano, estos pueden ser programas de alarma, los que estánndientes de recepción de mensajes ó llamadas telefónicas, también tenemos los que anotan nusos GPS para ir almacenándolos en ficheros, etc. Podemos realizar un programa que esténcionando en segundo plano y que muestre notificaciones o un activity.

mero analizaremos como utilizar los servicios propios del sistema operativo Android. Por mplo, podemos utilizar la clase del servicio de alarma, para crear nuestra aplicación sin tene

ogramarlo.

spués veremos los Broadcast Receivers, y cómo estos pueden “espiar” los eventos que suceddispositivo. Podemos capturar cualquier evento, desde la activación del Bluetooth, recepciónvio de llamadas, etc. Cuando uno de estos eventos es produce, nuestro código se ejecutará.

r último, crearemos nuestro propio servicio, que correra en segundo plano y que será capaz doducir eventos o estar pendiente de todo lo que sucede en el sistema, etc.

menzamos con las Services.rte 16.1 Servicios del sistema

mos a crear la aplicación MiAlarma, el diseño será sencillo. Un número de segundos especifun cuadro de texto, y un botón para activar la alarma. Cuando pasen los segundos se lanzará use que ejecuta una notificación Toast.

mos de alta la aplicación con el nombre MiAlarma.

cesitaremos dos id/string que serán los siguientes, uno para el cuadro de texto (propiedad Hinotro para el botón (propiedad Text).

txtSegundos con valor Introduce Segundos btnAlarma con valor Activar Alarma Añadimos adro de texto, le ponemos id txtSegundos; le asignamos txtSegundos en su propiedad Hint (clicbotón derecho y Edit Hint…), en Input Type escogemos número entero (Number).

adimos el botón al que ponemos id btnAlarma, le asignamos el id/string btnAlarma en laopiedad Text (clic con el botón derecho y Edit Text…). Por último, en laopiedad On click le ponemosnAlarma.

puede crear clases que nogan asociado ningún interfaz

áfico (capa/layout). Nosotros

mos a crear en esta aplicacióna clase que lanza un mensaje

Page 237: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 237/352

notificación Toast, pero quetendrá ningún tipo de xml

ociado como interfaz gráfico.

ico cometido de esta clase será ejecutarse cuando pasen unos segundos especificados en el cutexto, por el usuario.lsamos un clic con el botón derecho sobre el explorador de proyectos en la carpeta /src de nuoyecto y New – Class (Nueva – Clase).

nombre mensajealarma, y en Superclass (superclase) le pondremosdroid.content.BroadcastReceiver ta clase será llamada desde un servicio, por lo que extenderá de la superclase BroadcastRece

to lo hará un receptor de llamadas de servicios del sistema.

Page 238: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 238/352

una clase extendida de BroadcastReceiver la función onCreate se verá reemplazada por Receive. En ella recibimos tanto el intent como el context.

código que necesitamos en esta clase.

android.content.BroadcastReceiver; import android.content.Context;android.content.Intent;android.widget.Toast;

c lass mensajealarma extends BroadcastReceiver {ridevoid onReceive(Context context, Intent intent) {O Auto-generated m ethod stub

makeText (context, "Tu alarma programada está ejecutándose",ENGTH_LONG).show(); }

no damos endroidManifiest.xml de alta la clase, no dará error, pero no funcionará laicación. Por lo que damos a la clase creada de alta en AndroidManifiest.xml, en la pestañaplicación.

Page 239: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 239/352

este caso no añadimos un Activity, sino un Receiver.

sólo nos quedaría programar nuestro botón de alarma del MainActivity. Crearemos una instala clase alarma del sistema, para llamar, pasado el tiempo especificado, a la clase mensajeal

android.os.Bundle;android.app.Activity; import android.app.AlarmManager; import  android.app.PendingIntent; import android.content.Context; import  android.content.Intent; import android.view.View;

android.widget.TextView; import  android.widget.Toast;

c lass MainActivity extends Activity {ew txtSegundos;

rideted void onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState);entView(R.layout. activity_main);ndos= (TextView) findViewById(R.id.txtSegundos);

void btnAlarma(View view) {undos;mos una instancia de AlarmManager Manager mialarma = (AlarmManager)SystemService(Context. ALARM_SERVICE );

m os el intent apuntando a la clase mensajea larmantent = new Intent(this, mensajealarma.class); // Creamos el PendingIntent pasando el codigo requerido de alarm a P endingIntent pIntent = PendingIntent. getBroadcast (this, 0, intent, PendingIntent. FLAG_CANCEL_CURREN

mos el valor introducido en el cuadro de textomultiplicamos por 1000 para convertirlo en segundos segundos=Integer. parseInt (txtSegundos.getText().toString())*1000; // Damos de alta la alarma con todos los datosma.set(AlarmManager. RTC_WAKEUP , System.currentTimeMillis() + segundos, pIntent);

Page 240: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 240/352

aje que informa que la alarm a ha sido programa damakeText (this.getBaseContext(),  "Alarma programada",

ENGTH_LONG).show();ecutará otra notificación Toast cuando se cum pla el tiempo especificado

nque el código está comentado, vamos a analizar las partes más importantes del servicio alarmsistema android.primero es la línea import: import android.app.AlarmManager; Después con esta línea crearemos unatancia del servicio de alarmas del sistema.Manager mialarma = (AlarmManager) this.getSystemService(Context. ALARM_SERVICE );

mprobará que Eclipse, al escribir Context. le aparecerá una lista inmensa de constantes de lovicios que soporta Android; sensores, batería, llamadas, etc.

finimos el Intent que se ejecutará cuando la alarma llegue al tiempo estipulado.ntent = new Intent(this, mensajealarma.class);

clase podría ser un Activity, pero en nuestro caso es un extendido de BroadcastReceiver puee no tendrá interfaz de usuario. Si lo tuviera entonces sí sería Activity.

gIntent pIntent = PendingIntent. getBroadcast (this, 0, intent, PendingIntent. FLAG_CANCEL_CURRENT );

finimos el anterior Intent con el método getBroadcast. El primer parámetro es el contextoontext) de quién lo llama. El segundo parámetro es una constante que identifica quien llama aloadcast, normalmente no se usa. El tercer parámetro es el intent, y el cuarto es un valor constafinido por el sistema, que pueden ser:

FLAG_ONE_SHOT, sólo se podrá enviar una vez.FLAG_NO_CREATE, no existe la alarma y la creamos nueva. FLAG_CANCEL_CURRENste la alarma y queremos cambiarla por 

a.FLAG_UPDATE_CURRENT, existe la alarma y queremos actualizarla.lo nos quedaría dar de alta la alarma con un tiempo determinado.ma.set(AlarmManager. RTC_WAKEUP , System.currentTimeMillis() + segundos, pIntent);

primer parámetro determina el momento y la periodicidad de la alarma.

ELAPSED_REALTIME, tiempo alarma constemClock.elapsedRealtime() (tiempo desde el inicio, contando el modo espera –Sleep-).

ELAPSED_REALTIME_WAKEUP, tiempo alarma constemClock.elapsedRealtime() (tiempo desde el inicio,luyendo modo espera –sleep-), activa dispositivo cuando está apagado.

INTERVAL_DAY, interval de diasINTERVAL_FIFTEEN_MINUTES, Intervalo de tiempo inexact con

xactRepeating(int, long, long, PendingIntent)INTERVAL_HALF_DAY, intervalo medio día

INTERVAL_HALF_HOUR, intervalo media hora175 INTERVAL_HOUR, intervalo de una hora

Page 241: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 241/352

RTC, tiempo de alarma con System.currentTimeMillis() (hora reloj

UTC).RTC_WAKEUP, Alarma con System.currentTimeMillis() (hora conoj UTC), se activa el dispositivo cuando está apagado.

n el parámetro del tiempo ponemos la hora de la alarma. En el ejemplo, a la hora actual lemamos una cantidad determinada de milisegundos.

m.currentTimeMillis() + segundos

r último, le pasamos el PendingIntent que habíamos definido anteriormente.servicio de alarmas tiene algunos métodos a tener en cuenta.(PendingIntent operacion)tipo, long tiempoenMilisegundos, PendingIntent operacion)

xactRepeating(int tipo, long tiempoenMilisegundos, long intervaloMilisegundos, PendingIntent operacion)eating(int tipo, long tiempoenMilisegundos, long intervaloMilisegundos, PendingIntent operacion)e(long milisegundos)

meZone(String ZonaHoraria)

isten muchos servicios que puede utilizar en sus aplicaciones Android. He escogidoarmManager para ver Servicios del Sistema, por ser uno de los más interesantes y usados.

rte 16.2 Broadcast Receiversdemos crear aplicaciones que sean Broadcast Receivers. Es decir, programas que seráncutados cuando un evento suceda.

nuestro ejemplo crearemos una aplicación que cuando se reciba una llamada entrante nos mumensaje Toast con el teléfono de quién nos llama. También utilizaremos la clase Log, para

municarnos con la ventana de depuración que nos suministra Java y enviar mensajes.

eamos una nueva aplicación con el nombre BroadcastR, en el segundo paso delstente para crear una aplicación nueva de Android, desmarcamos la casilla de crear un Activ

mo no hemos creado Activity, no tendremos Package. Entonces hacemos clic con el botón derbre la carpeta src y New-Package.

uí podremos ponerle el nombre que queramos, es parecido a los nombres de los dominios.sotros pondremos:

m.example.broadcastr 

c sobre el Package que hemos creado y pulsamos en New – Class.

Page 242: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 242/352

Page 243: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 243/352

nombre de nuestra clase será mibroadcastr, y en superclass android.content.BroadcastReceiv

te será el código que nos habrá generado:e com.example.broadcastr;

android.content.BroadcastReceiver;android.content.Context;android.content.Intent;

c lass mibroadcastr extends BroadcastReceiver {

ridevoid onReceive(Context arg0, Intent arg1)

O Auto-generated m ethod stub

s podemos fijar en como una clase BroadcastReceiver no tiene la función onCreate() sino lanción onReceive(). Esta función se ejecutará cuando el evento que nosotros determinemos seoduzca.

ué evento es el que vamos a tener en cuenta? Bien, queremos controlar las llamadas entrantes que tendremos que dar permisos a nuestra aplicación para ese evento.

Page 244: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 244/352

rimos AndroidManifiest.xml y en la pestaña Permissions le añadimos un Uses Permission, y eme android.permission.READ_PHONE_STATE.

Coe permiso ya podemos leer el estado deléfono.

mbién tenemos que filtrar que eventos dispararanestro BroadcastReceiver. Para realizar este paso,cesitamos primero dar de alta nuestra claseoadcastReceiver y después crearle el filtro al

ento que queremos que lo dispare.

AndroidManifiest.xml vamos a la pestañaplication, y en Application Nodes añadimos un

ceiver. Pulsamos en Add… y Receiver. De nombreame) le pulsamos en Browse (esperamos a que salga) y pulsamos sobre la clase que ya hemos

ado. Debería aparecer mibroadastr. Pulsando sobre el Application Node creado mibroadcast

Page 245: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 245/352

eceiver), volvemos a pulsar sobre Add… y creamos un Intent Filter.

hace falta ponerle ninguna propiedad, hacemos clic sobre él (Intent Filter), y volvemos a pulbre Add. Ahora añadimos Action.

Page 246: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 246/352

la propiedad Filter ponemos el evento que disparará a nuestra clase:droid.intent.action.PHONE_STATE.

mo habrá podido comprobar buscando el nombre del Filtro, existen multitud de eventos; paraería, cuando se apaga o se enciende la pantalla, para el estado del Wifi, Bluetooth, etc. Todoevento y podrás programar los BroadcastReceiver que se te ocurran.

ando el estado del teléfono cambie, se ejecutará onReceive() de nuestra clase mbroadcastr. Ao tenemos que controlar con un if el estado del teléfono.

n extras.getString(TelephonyManager.EXTRA_STATE) podremos extraer los datos del estadéfono. TelephonyManager es otra clase de android.telephony.

código para nuestra clase quedaría como se muestra a continuación.android.content.BroadcastReceiver;android.content.Context;android.content.Intent;android.os.Bundle;a ndroid.telephony.TelephonyManager;

ort android.util.Log; 180import  android.widget.Toast;c lass mibroadcastr extends BroadcastReceiver {

ridevoid onReceive(Context context, Intent intent) {

nimos extras, del Intent que entra c omo argum ento Bundle extras = intent.getExtras();tras es nulo no ha llegado nada con e l cambio de estado if  (extras != null)

tras contiene algo que no es nuloemos el e stado del teléfonotate = extras.getString(TelephonyManager. EXTRA_STATE ); // Enviamos el re sultado a la ventana de Log de Java  Log.w("MiMensaje--->", state);e.equals(TelephonyManager. EXTRA_STATE_RINGING)) {

estado es igual a que están llamandodamos el número de quién llama en una var iable de cadena String numerotelefono = extras

ng(TelephonyManager. EXTRA_INCOMING_NUMBER); // Enviamos a la ventana de de puración el número"MiMensaje---> Llama ", numerotelefono);

makeText (context, numerotelefono, Toast. LENGTH_LONG).show();

if state

if extrasonReceiveClase

tando todo el código comentado, sólo nos quedaría experimentar con otros eventos, o bien expmo podríamos ejecutar un BroadcastReceiver desde un Activity.

mibroadcastr = new Intent(this,mibroadcastr.class); sendBroadcast(imibroadcastr);

poniendo que nuestra aplicación fuera un Activity, podríamos poner el código anterior para laa clase BroadcastReceiver definida en el proyecto.

mular Llamadas u otros eventos, y depurar. Para probar el programa en una máquina virtual,

Page 247: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 247/352

dremos que simular una llamada telefónica. También para ver los mensajes de depuración quvían a Log, tenemos que mostrar una nueva pestaña/ventana en el entorno de eclipse.

isten un conjunto destañas/ventanas que se puedenualizar y que nos ayudaran

uchísimo en la depuración deestros programas; sobre todo en

uellos que como los Broadcast y losrvices no tienen por qué tener erfaz gráfico.

mos a activar primero la Ventana de Log, si no la tenemos en la parte inferior de la ventana deipse. Para ello hacemos clic en Window – Show View – Logcat. En caso de que no esté en laeccionamos Other.

demos comprobar en la captura anterior que no existe en la lista LogCat, por lo que seleccionaher… y expandimos Android.

nemos que activar Logcat (para ver los mensajes de depuración que se envían con Log), Devi

Page 248: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 248/352

ara que aparezcan la lista de dispositivos disponibles), Emulador Control (para simular llamarantes o salientes, envio de sms, posiciones gps, etc…).

s nuevas ventanas aparecerán en la parte inferior de eclipse.

tenemos todo lo necesario para probar nuestra aplicación, por lo que arrancamos nuestra má

Page 249: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 249/352

tual y le damos a ejecutar el programa.

lsamos sobre la pestaña Devices y podremos ver una lista de todos los procesos que estánrriendo en nuestro dispositivo Android.

mos a simular una llamada con Emulator Control y veremos como aparecerá nuestro procesooadcast.

lsamos la pestaña Emulator Control, escribimos el número de teléfono a simular y pulsamos C

caso de que no pueda utilizar los

ntroles de Emulator Control, deberá ir a Devices y seleccionar con un clic el dispositivo. 182mos a la pestaña Devices, una vez más, para comprobar los procesos y veremos como tenemo

oceso que es nuestro Broadcast Receiver.

Page 250: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 250/352

En la pestaña Loarecerán todos los mensajes que enviamos con Log.w ó Log.i

cemos clic sobre la pestaña Log y comprobamos los mensajes de depuración. Entre todos losdroid genera a modo de depuración y control del sistema, estarán los generados por nuestraicación.

mbién podemos ir a la perspectiva DDMS, en la que tendremos una vista de Eclipse donde noulta nuestros proyectos, el código, etc.; dejándonos solamente las ventanas para la depuración

Page 251: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 251/352

ra volver a la vista normal bastaría con pulsar el botón Java.rte 16.3 Services – Creando nuestro servicio

servicio, es un código de programación que se ejecuta cada cierto tiempo indefinidamente. Sele utilizar para ejecutar tareas en segundo plano, como pueden ser llamadas a servicios de in

Web Services).

servicio tiene los métodos onCreate(), onStartComand, onDestroy(), onBind().

onCreate introducimos el código que deberá ejecutarse cada cierto tiempo especificado;Destroy es el método que se ejecuta al cerrar el servicio; mientras que el método iBinder sólovolveremos un valor null.

cionalmente podemos definir la constante UPDATE_INTERVAL que especificará la frecuenclisegundos con la que se ejecutará el servicio.

mos a crear un servicio que nos sirve como reproductor de música. Para esto necesitaremos uhero de audio en formato mp3 (esmpatible con Android) y le daremos el nombre audio.mp3.

eamos un proyecto llamadoproduceAudio (File – New Android Application), ponemos elplication Name y Finish.

la carpeta res/ de nuestro explorar de proyectos no existe una carpeta raw/ que es donde se dter los ficheros multimedia, por lo que pulsamos sobre res/ con el botón derecho y New – Folueva

Carpeta), le damos el nombre raw.

Page 252: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 252/352

a vez creada la carpeta arrastramos nuestrohero audio.mp3 dentro de res/raw, aleguntarnos le decimos que queremos incrustarlo

piándolo (Copy Files).

Page 253: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 253/352

demos comprobar en el explorar de proyectos como se ha incluido correctamente nuestro fichdio.mp3.

mos a pulsar sobre el package de nuestrooyecto con el botón derecho yeccionamos New – Class (Nueva – Clase).

mos a crear la Clase Servicio, que seráestro reproductor. Le damos el nombreReproductor y en Superclass escribimos

Page 254: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 254/352

rvice y pulsamos en Browse.

Page 255: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 255/352

spués seleccionamos Service dedroid.app, debería ser el primero. Pulsamo

OK.

Page 256: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 256/352

Con todo esto deberber creado una clase extendiendo de la clase Service y con el método onBin() ya escrito.

ort android.app.Service; import android.content.Intent; import android.os.IBinder;

lic class  MiReproductor  extends  Service {

verridelic IBinder onBind(Intent arg0) {ODO Auto-generated method stub return null;

finimos un objeto MediaPlayer en nuestra clase.diaPlayer reproductor ;

menzamos con el método onCreate. En él enviaremos un mensaje con Toast y definiremos el

ediaPlayer definido en la clase con el fichero de audio copiado en la carpeta res/raw.ridevoid onCreate() {

makeText (this,"Servicio creado",Toast. LENGTH_SHORT ).show(); reproductor  = MediaPlayer.create(this, R.raw.audio); }

emos observar como el fichero de audio copiado en res/raw no hay que hacer referencia a él con su extensión, basta con su nolo que se recomienda no repetir nombres en los distintos recursos en nuestra aplicación Android, aunque tengan distinta extens

mbién es importante recordar evitar las mayúsculas.

método onDestroy() es muy sencillo pues lo único que vamos a hacer es parar el elementoproductor.

ridevoid onDestroy() {

Page 257: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 257/352

makeText (this,"Servicio detenido",Toast. LENGTH_SHORT ).show(); reproductor .stop();

lo nos haría falta crear el método onStartCommand() que sería el algoritmo a ejecutar una vezciado (start) un servicio.

nt onStartCommand(Intent intencion, int flags, int idArranque) {makeText (this,"Servicio arranca do "+idArranque,Toast. LENGTH_SHORT ).show(); reproductor .start();

START_STICKY ;

ciamos el reproductor y devolvemos el estado de iniciado del servicio. Este estado es una bande START_STICKY informa de que el servicio de inicia y se para de forma explícita; yART_NOT_STICKY es una bandera que informa que el servicio finaliza automáticamente alminar de ejecutar el método onStartCommand().

ardamos los cambios.186 El código completo de nuestro servicio MiReproductor habría quedrecido a esto:

android.app.Service; import  android.content.Intent; import android.media.MediaPlay er; import  android.os.IBinder;android.widget.Toast;

c lass MiReproductor  extends Service {

Player reproductor ;

ridevoid onCreate() {

makeText (this,"Servicio creado",Toast. LENGTH_SHORT ).show(); reproductor  = MediaPlayer.create(this, R.raw.audio); }

nt onStartCommand(Intent intencion, int flags, int idArranque) {makeText (this,"Servicio arranca do "+idArranque,Toast. LENGTH_SHORT ).show(); reproductor .start();

START_STICKY ;

ridevoid onDestroy() {

makeText (this,"Servicio detenido",Toast. LENGTH_SHORT ).show(); reproductor .stop();

rideIBinder onBind(Intent arg0) {

O Auto-generated m ethod stub return null;

siguiente paso es darlo de alta endroidManifiest.xml. Lo abrimos y vamos a la pestañaplication. Pulsamos Add… en Application Nodes.

leccionamos Service y pulsamos OK. En el atributome pulsamos en Browse.

Page 258: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 258/352

arece una ventana con la clase que hemos creado, pulsamos sobre ella y OK.guardar los cambios ya tenemos nuestro servicio creado y dado de alta en AndroidManifiest.

s faltaría definirlo en nuestro Activity y ejecutarlo.

mos a crear dos botones, uno para reproducir y otro para parar. Por lo que iremos as/values/strings.xml y daremos de alta los siguientes id/String.

id/String btnPlay con el valor Play id/String btnStop el valor Stop

mos a diseñar el interfaz de nuestra aplicación,e será bien simple, ya que lo que nos interesa esogramar el servicio. Abrimos el Layout de laividad principal (activity_main.xml).

adimos dos botones:

Botón con id btnPlay, id/String btnPlay y

Page 259: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 259/352

opiedad onClick btnPlayBotón con id btnStop, id/String btnStop y

opiedad onClick btnStop

mos a programar la clase de nuestro actividad principal.programación irá toda en los botones, el botón Play iniciará el servicio, y el botón Stop lo pa

void btnIniciar(View view)

rvice(new Intent(this,serviceplayer.class));

void btnParar(View view)

vice(new Intent(this,serviceplayer.class));

código completo para la clase MainActivity quedaría con pocos cambios.android.os.Bundle;android.app.Activity;android.content.Intent;

android.view.View;

c lass MainActivity extends Activity

rideted void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }void btnParar(View view)

vice(new Intent(this,MiReproductor.class));

void btnIniciar(View view)

88startService(new Intent(this,MiReproductor.class));

ra programar tareas que se ejecuten en unerminado momento no utilizaríamos los servicios, sino más bien la clase AlarmManager que n

Page 260: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 260/352

ministra Android. Sin embargo, si lo que queremos es tener una aplicación que continuamente cutándose cada un determinado tiempo de milisegundos utilizaríamos

rvice; pero hay que tener mucho cuidado puesto que podríamos bloquear el dispositivo Andronerando bucles infinitos o sobrecargándolo en exceso, por lo que se recomienda que los servi

sean demasiado pesados.

igual que un Broadcast, se puede crear una aplicación que sea un servicio (Service) sin preseActivity. A este tipo de aplicaciones que corren en segundo plano y no disponen de un interfadenomina Demonios (Daemons).

Page 261: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 261/352

APÍTULO7

Page 262: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 262/352

Threads / Hilos”

apítulo 17 “Threads/Hilos”

s hilos están relacionados con el multiproceso, es decir, realizar varios procesos o tareas alsmo tiempo.ra explicar el uso de un hilo/thread vamos a utilizar un ejemplo.

ponemos una aplicación que tiene que enviar un fichero de nuestro dispositivo a internet, miene se está enviando el fichero nuestra aplicación no podrá continuar hasta que el proceso de suhero a internet no se haya completado. Sin embargo, podemos realizar este proceso en segundno, para eso están los hilos. Abrimos un hilo o thread, un proceso en segundo plano, en el que

bimos el fichero en internet; mientras tanto nuestra aplicación sigue su funcionamiento.

pueden ejecutar tantos hilos como queramos, y si causan bucles infinitos pueden llegar a bloqsistema; pero con tan sólo eliminar dicho hilo el problema se solucionaría.

rmalmente todo proceso o tarea que tarde un tiempo considerable necesitará de un hilo o threrte 17.1 Thread y Handler (Método sendMessage)

hilo no puede modificar ni pasar datos al hilo principal de ejecución de nuestra aplicación, pe se necesita un elemento llamado Handler.

ndler es conocido como el puente entre hilos, por dicho puente podemos comunicar los hilos hilo principal de ejecución de nuestra apliación.

mos a crear una aplicación en el que irá subiendo una barra de progreso. Como los dispositivuales son muy rápidos, no llegaríamos a darnos cuenta del incremento de la barra. Por lo que

mularemos un costo de proceso en segundos; dormiremos el sistema co el método sleep un seguda repetición con un bucle for.

mos de alta una nueva aplicación llamada MisHilos.

eamos un id/string de nombre btnProceso y con valor Iniciar Proceso. 191 En el interfaz deividad principal (activity_mail.xml) cambiaremos el Layout que viene por defecto a Linear 

yout-Vertical Layout.

adimos un botón al que asignamos su id/text el id/string creado (btnProces), y en la propiedadClick btnProceso.

bajo añadimos un progressBar(Horizontal) que se encuentra en la categoría Form Widgets. Lembiamos la propiedad Width por fill_parent, para que ocupe todo el ancho de la pantalla; y laopiedad Height por 25dp que será el grosor de alto; el resto de las propiedades se las vamos aadir desde la programación.

Page 263: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 263/352

la programación de la clase principal definimos como global para toda la clase un ProgressBfinimos un valor booleano que indicará cuando el hilo se está ejecutando.

gressBar  barra;

lean Ejecutandose=false ;

ra poder modificar datos del primer hilo, variables o elementos del interfaz gráfico, desde elgundo hilo deberemos crear un puente o Handler.

vate Handler  puente = new Handler()

verridelic void handleMessage(Message msg) {

a.setProgress((Integer)msg.obj); }

objeto que le llega al puente es de tipo entero y así se lo hacemos saber al modificar el métodProgress del ProgressBar barra definido como global en la clase.

onCreate vamos a vincular el objeto barra definido con el objeto de nuestro interfaz gráfica qma progressBar1, el nombre por defecto que se le dá si nosotros no se lo hemos cambiado.

a =(ProgressBar)findViewById(R.id. progressBar1); barra.setMax(100);a.setProgress(0);

Page 264: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 264/352

mbién hemos asignado las propiedades setMax, que será el valor máximo de nuestra barra deogreso, en nuestro caso 100 incluido. Asignamos con el método setProgress(0) el valor inicialmostrará.

lo nos quedaría programar nuestro botón. Dentro de él crearemos un Thread o hilo de ejecució

lic void btnProceso(View view) {ead th1 = new Thread(new Runnable() {verride

lic void run() {quí la ejecución del código en un segundo hilo }/ Fin de la definición del Thread

Fin de btnProceso()

código de programación parece un poco complejo, pero si lo utiliza a menudo pronto semiliarizará con él.

da paso que se incremente la barra de progreso haremos una pausa de 100 milisegundos, para

mular la ejecución lenta y progresiva de un proceso. El siguiente código iría dentro de laogramación del Thread.

(int a=0;a<=100;a++)

{

ead. sleep(100);ssage msg = new Message(); msg.obj = a;nte.sendMessage(msg);

atch(Throwable t) {allo try

eamos un bloque de control try/catch para controlar posibles errors o cuelges en la ejecución estro proceso, esto no es necesario siempre pero si lo es para utilizar el método sleep() pararmir en ese punto el proceso los 100 milisegundos que se le pasan como valor.

aminamos la línea de programación que llama al puente, pasándole un número entero pero com

eto Message.nte.sendMessage(msg);

a vez definido nuestro hilo y la programación que se ejecutaría en dicho hilo sólo nos quedarídificar el estado booleano del semáforo que nos indica que se está ejecutando y lanzar con eltodo start() el proceso en segundo plano.

cutandose=true ;start();

código completo de nuestra aplicación quedaría como se muestra a continuación. Compruebe

Page 265: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 265/352

todos los nuevos Import que se han tenido que añadir al utilizar Message, Handler y Progress

android.os.Bundle;android.os.Handler;android.os.Message;android.app.Activity; import android.view.View;android.widget.ProgressBar;

c lass MainActivity extends Activity {ssBar barra ;n Ejecutandose=false;

e Handler  puente = new Handler() {ridevoid handleMessage(Message m sg) {etProgress((Integer)msg.obj); }

rideted void onCreate(Bundle savedInstanceState) {

.onCreate(savedInstanceState); setContentView(R.layout.activity_main); public void btnProceso(View view) {

(ProgressBar)findViewById(R.id. progressBar1); barr a.setMax(100);etProgress(0);

th1 = new Thread(new Runnable() {ridevoid run() {a=0;a<=100;a++) {

.sleep(100); Message m sg = new Message(); msg.obj  = a;sendMessage(msg); } catch(Throwable t) { // Fallo try

n de la definición del Thread

amos que se e stá ejec utando el segundo hilo Ejecutandose=true;utamos e n segundo plano el proceso definido como th1 th1.start();

Parte 17.2 Runnable (Método po

ra posibilidad para crear un hilo o proceso secundario del de la ejecución principal de nuestricación sería crear una función dónde se creará el Thread y acompañar de otra función de tipnnable.

sde el Thread se llamará al Runnable utilizando el método Handler.post().resultado es el mismo y la forma de programarlo sería el mismo. El código de programación

Page 266: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 266/352

edaría como se muestra a continuación.android.os.Bundle;android.os.Handler;android.os.Message;android.view.View;android.widget.ProgressBar; import android.app.Activity;

c lass MainActivity extends Activity {ssBar barra ;n Ejecutandose=false;andler  puente = new Handler(); private int a=0;

ted void miHilo() {unnable proceso =  new Runnable() {void run() {etProgress(a); }

th1 = new Thread() {ridevoid run() {

0;a<=100;a++) {

.sleep(100);ge msg = new Message();j  = a;gar de puente.sendMessage(msg);  puente.post(proceso);h (InterruptedException e) {StackTrace(); }

n de la definición del Thread

andose=true; th1.start();

rideted void onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState);entView(R.layout. activity_main);(ProgressBar)findViewById(R.id. progressBar1); barr a.setMax(100);etProgress(0);

void btnProceso(View view)

();

comiendo que se comparen las diferencias entre este método y el anterior y que intente realiza

smo ejercicio anterior pero con este método.demos observar como todo el hilo se crea dentro de una función, tanto el Runnable como elndler se quedan codificados dentro de la función miHilo, lo cuál puede ayudar a limpiar un pocódigo; ya que Handler se quedaba definido en la clase y el hilo dentro de la función onClick tón.

iste un problema con las variables que se utilizan dentro de Runnable y es que deben estar finidas de tipo final (recordemos que son constantes), por lo que no sirve de mucho en la may

los casos. Por este motivo, la variable a de tipo int ha sido declarada como global para toda se. Dentro del Runnable al ser llamado por el Handler (puente) tiene acceso a todos los recurla clase.

r la complejidad que supone manejar varios hilos, y lo poco legible que va quedando el códige vamos desarrollando se creó una clase para ayudarnos con este propósito y que veremos en uiente punto: la clase AsynTask.

rte 17.3 AsyncTask 

clase AsyncTask está pensada para crear procesos en otros hilos de ejecución sin que tengam

Page 267: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 267/352

e estar programando manualmente los threads y los handlers.

ando una clase requiere de tipos genéricos, nos referimos a que recibirá una serie de valores.caso de AsyncTask recibe tres, y podemos definirlos como Void si no queremos usarlos.

Params, parámetros que se necesitan para tratar la tarea Progress, información que indica eogreso de la tarea Result, información que se pasa cuando la tarea ha terminado197 La claseyncTask tiene cuatro funciones que se ejecutan como etapas, cuando termina una comienza la

uiente.OnPreExecute(), se inicializa todo lo necesario para la tarea. Por ejemplo: variable de progrero.doInBackground(Params…), el proceso que queremos realizar en segundo plano, además derementar la variable de progreso del ejemplo anterior y llamar a la actualización del progresblishProgress().onProgressUpdate(Progress…), La función que incrementará el progreso de la tarea se ejecutasde doInBackground() con publishProgress().

onPostExecute(Result…), la última función se ejecuta cuando el proceso haya terminado.mos a crear la aplicación de los puntos anteriores pero con la clase AsyncTask.eamos la aplicación TusHilos y realizamos los mismos pasos que en los puntos anteriores.

Damos de alta un id/String para el botón.onemos la vista en modo LinearLayout Vertical.

Añadimos un botón al que asignamos el id/String creado y en la propiedad Onclick le ponemosnProceso.

Añadimos un progressBar Horizontal.

ambiamos las propiedades del progressBar: Witdh en fill_parent, y la propiedad Height en 2

tenemos la interfaz de nuestra aplicación creada, ahora crearemos una clase llamada hilo

redada (extends) de la clase AsyncTask. Pero vamos a crearla dentro de nuestra clase principra que tenga acceso a todos los objetos creados en dicha clase (progressBar por ejemplo).

Page 268: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 268/352

portamos AsyncTask y definimos la clase herededa de ella como se muestra.ort android.os.AsyncTask;

…lic class  hilo extends  AsyncTask<Void, Integer, Void> {

menzaremos por el orden en el que se ejecutan y luego veremos todo el código completo de cedaría.onPreExecute()

cializamos la variable progreso a su valor inicial, en este caso 0. El caso es que no hemos

finido ninguna variable para el progreso por lo que la definimos como global de la clase.

progreso;verridetected void onPreExecute() {

greso=0; }tenemos la primera función de nuestro hilo, la que inicializa el entorno que necesitemos para el proceso.oInBackground(Params…)roceso que se ejecuta en segundo plano y se hace una llamada a la publicación del progreso.

lizeremos el mismo proceso que los ejemplos anteriores, creamos un bucle y ponemos una pausa con Sleep para que simule lasupondría un proceso costoso en realidad.

verridetected Void doInBackground(Void... arg0) {

(int x=0;x<=100;x++) {e realiza la operación que queramos  progreso++;lishProgress( progreso);temClock. sleep(100);

urn null;

mos una nueva forma de dormir 100 milisegundos utilizando SystemClock.sleep(). Para estoemos que importarlo con esta línea.ort android.os.SystemClock;

demos ser como después de realizar la parte del proceso que queramos se llama ablishProgress() para notificar del progreso de la tarea pendiente, enviándole un número enteroá el que se muestre en el progressBar.

lishProgress(progreso); Esta línea, publishProgress(), ejecutará la tercera función necesaria en nuesyncTask: onProgressUpdate().onProgressUpdate(Progress…)cibimos en una matriz el valor/los valores enviado/s desde la línea publicProgress. Con este ualizamos el objeto barra.

verridetected void onProgressUpdate(Integer... values) {

a.setProgress(values[0]); }

Page 269: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 269/352

cordemos que en los ejemplos anteriores creábamos una variable del tipo ProgressBar al quemábamos barra y en el onCreate apuntábamos a ella. Podrá verlo mejor, en el código.

ort android.os.AsyncTask; import android.os.Bundle;ort  android.os.SystemClock; import android.view.View;ort android.widget.ProgressBar; import android.app.Activity;

lic class  MainActivity extends  Activity {gressBar  barra;

verridetected void onCreate(Bundle savedInstanceState) {

er .onCreate(savedInstanceState);ContentView(R.layout.activity_main);

a=(ProgressBar)findViewById(R.id. progressBar1);

a.setMax(100);a.setProgress(0);

lic void btnProceso(View view) {iHilo();mihilo= new Hilo(); mihilo.execute();

lic class  Hilo extends  AsyncTask<Void, Integer, Void> {progreso;verridetected void onPreExecute() {

greso=0; }

verridetected Void doInBackground(Void... arg0) {

(int x=0;x<=100;x++) {e realiza la operación que queramos  progreso++;lishProgress( progreso);temClock. sleep(100);

urn null;

verride

tected void onProgressUpdate(Integer... values) {

a.setProgress(values[0]); }

Page 270: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 270/352

APÍTULO8

Page 271: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 271/352

ListView / BaseAdapter”

apítulo 18 “ListView/BaseAdapter”

objetivo de ListView es mostrar un listado contenido en arrays.

a de los algoritmos más complicados de programar para Android son las listas, sobre todo cueremos realizar una vista personalizada de cada elemento de la lista.

ra simplificar la programación de visualización de listas, Android tiene algunas predefinidas,un principio nos serán de gran ayuda.

í por ejemplo, podemos crear una aplicación llamada MiListado.objeto ListView debe ir siempre dentro de un FrameLayout. Por lo que en nuestro diseño

ertamos un FrameLayout (Layouts).ntro del FrameLayout insertamos un ListView (Composite). Debería mostrarse algo similar a e se muestra en la imagen.

Page 272: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 272/352

Page 273: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 273/352

Para crear un array de String en Java/Androiría de la siguiente forma:frutas[]=new String[] {"Naranja","Manzana","Kiwi","Melocoton",da”,”Platano”,”Pera”,”Sandia”,”Melón”,”Mora”};

to lo definiremos en la clase, para que cualquier método de nuestra clase tenga acceso a dichoay.

contenido de un ListView será otro xml, dónde se diseñan los elementos de la lista; los datos strar de ellos, etc. El SDK de Android trae varios diseños predefinidos, de momento utilizareo de ellos, porque personalizar las listas es un poco complejo.

el método onCreate de nuestro Activity tendremos que crear un adaptador dónde le pasaremoos a mostrar al ListView.

cometido del adaptador (Adapter) es rellenar el xml que va dentro del ListView, con los datole suministran como parámetros. Por ejemplo, hay varios Layout predefinidos que sólo requiearray de Strings: simple_list_item, simple_list_item_checked.

finimos un adaptador al que le pasamos como parámetros el array de String creado en la clasAdapter<String> adapter = new

Adapter<String>(this,android.R.layout. simple_list_item_1, frutas);

demos ver como al definir el adaptador le asignamos un layout predefinidoandroid.layout.simple_list_item_checked) y le pasamos los datos.

ora lo único que tenemos que hacer es asignar este adaptador a nuestro ListView. Por lo queuntamos a él y con el método setAdapter() le asignamos el adaptador creado anteriormente.

View listView = (ListView) findViewById(R.id.listView1); listView.setAdapter(adapter);

tenemos creado nuestro adaptador totalmente funcional, con scroll (desplazamiento). Pero aúmos programado que se pueda hacer clic sobre uno de los elementos, o que por ejemplo, poda

Page 274: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 274/352

lizar una selección múltiple.

s nuevos import utilizados para la programaciónerior serían:android.widget.Array Adapter; // Para utilizar Arr ay Adapter android.widget.ListView; // Para utilizar ListView

código completo quedaría como se muestra antinuación.

android.os.Bundle;

android.app.Activity;android.widget.Array Adapter; // Para utilizar Arr ay Adapter android.widget.ListView; // Para utilizar ListView

c lass MainActivity extends Activity

frutas[]=new String[] {"Naranja","Manzana","Kiwi","Melocoton", "Granada", "Platano", "Pera", "Sandia", "Melón", "Mora"};

rideted void onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState); setContentView(R.layout.activity_main);Adapter<String> adapter = newAdapter<String>(this,android.R.layout. simple_list_item_1, frutas);

w listView = (ListView) findViewById(R.id.listView1); listView.setAdapter(adapter);

realizar scroll se marcará de naranja uno de los elementos.

alizaremos una modificación a nuestro código, en el que podamos seleccionar múltiples elemela lista visualizada. Para realizar esto lo primero que tenemos es que utilizar un Layout

edefinido distinto al utilizado. Necesitaremos el Layout simple_list_item_checked  en lugar deple_list_item_1

línea del adapter quedará como sigue:Adapter<String> adapter = new

Page 275: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 275/352

Adapter<String>(this,android.R.layout. simple_list_item_check ed , values); Pero con esto no nos permitirá realizar una selección múltiple, para esto tendremos qrminar el modo de selección con el método setChoiceMode().w.setAdapter(adapter);w.setChoiceMode(ListView. CHOICE_MODE_MULTIPLE );

isten muchos otros Layout predefinidos según la lista que queramos mostrar, pero cada uno deos suele tener una forma específica de programarlo, hemos visto los más sencillos.

android.os.Bundle;android.app.Activity;android.widget.ArrayAdapter; // Para utilizar Arra yAdapter  import  android.widget.ListView; // Para utilizar ListView

c lass MainActivity extends Activity {rutas[]= new String[] {"Naranja","Manzana","Kiwi","Melocoton", "Granada", "Platano", "Pera", "Sandia", "Melón", "Mora"};

rideted void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

entView(R.layout. activity_main);Adapter<String> adapter = newAdapter<String>(this,android.R.layout. simple_list_item_check ed , frutas);

w listView = (ListView) findViewById(R.id. listView1); listView.setAdapter(adapter);w.setChoiceMode(ListView. CHOICE_MODE_MULTIPLE );

r ultimo, vamos a incluir la programación necesaria para saber qué elemento se ha pulsadoosition, comenzando por el valor 0) y poder ejecutar un código de programación que deseemo

android.os.Bundle;android.app.Activity;android.view.View;android.widget.AdapterView;android.widget.ArrayAdapter; // Para utilizar Arra yAdapter  import  android.widget.ListView; // Para utilizar ListView import  android.widget.Toast;

c lass MainActivity extends Activity {rutas[]= new String[] {"Naranja","Manzana","Kiwi","Melocoton", "Granada", "Platano", "Pera", "Sandia", "Melón", "Mora"};

ride

ted void onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState); setContentView(R.layout.activity_main);

Page 276: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 276/352

Adapter<String> adapter = newAdapter<String>(this,android.R.layout. simple_list_item_check ed , frutas);

w listView = (ListView) findViewById(R.id. listView1); listView.setAdapter(adapter);w.setChoiceMode(ListView. CHOICE_MODE_MULTIPLE );

w.setOnItemClickListener( new AdapterView.OnItemClickListener() {ridevoid onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)ui introducimos la programa ción que queram os realizar  Toast.makeText (getApplicationContext(), "Has clickado sobre el num. " + position, Toast. LENGTH_SHORT ).show();

método onItemClick() }); // Fin método setOnItemClickListener  } // Fin método onCreateClase

seAdapter - ListView Personalizados

mos a ver como se crean ListView con Layout personalizados. En este punto tendremos que cfichero xml que contendrá el diseño para nuestros elementos de la lista, y un BaseAdapter que

metido será rellenar los datos de cada elemento de la lista.

mos de alta nuestra nueva aplicación Android con el nombre SimulaListin.

earemos dos strings con el mismo número de elementos, uno el nombre y el otro el teléfono pamular un listado telefónico (en la clase MainActivity).206

ontactos[]=new String[] {"Manuel", "Miguel", "Lourdes", "Macarena", "Rocio", "Jose", "Rosa", "Antonio", "Francisco", "Marta"};elefonos[]= new String[] {"658658658","659659659","660660660","661661661", "662662662", "663663663", "664664664", "665665665", "666666666", "667667667"};

cesitamos una clase extendida de la clase BaseAdapter. Esta clase tiene cuatro métodos que nrmitirán rellenar nuestro layout (xml) personalizado.

View getView(int posicion, View convertView, ViewGroup parent), construye un nuevo layoun la posición pasada en el primer parámetro.

Int getCount(), devuelve el número de elementos de la lista.

Object getItem(int posicion), devuelve el elemento de la lista determinado por posicion.long getItemId(int posicion), devuelve el identificador de fila de una determinada posición deta.

nuestra clase le pasaremos las dos matricesing que hemos creado, por lo que elnstructor lo definiremos para que recojahos datos.

mos a dar de alta la nueva clase; clic conbotón derecho sobre el package de nuestraicación y nueva clase (New – Class). En

me ponemos MiAdaptador y en superclassribimos BaseAdapter y luego pulsamos el

tón Browse.

Page 277: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 277/352

Page 278: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 278/352

Seleccionamos elmento que nos muestra y pulsamos OK.

dremos comprobar en el código que nos ha creado que ya nos ha añadido los métodos hadificar de nuestra clase. Sólo faltaría el constructor de la clase, que sería una función con el

smo nombre de la clase.

eamos dos matrices de String y un activity en la clase para poder almacenar los datos que recinstructor. 207 Así pues quedaría el código como se muestra a continuación.c lass MiAdaptador  extends BaseAdapter {

final Activity  actividad; private final String Acontactos[]; private final String Atelefonos[];

MiAdaptador(Activity actividad, String contactos[], String telefonos[]) {;ividad=actividad; this.Acontactos=contactos; this.Atelefonos=telefonos;

rident getCount() {

O Auto-generated m ethod stub return 0;

rideObject getItem(int arg0) {

O Auto-generated m ethod stub return null;

rideong getItemId(int arg0) {

O Auto-generated m ethod stub return 0;

rideView getView(int arg0, View arg1, ViewGroup arg2) {

O Auto-generated m ethod stub return null;

Page 279: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 279/352

n el constructor recogemos los datos y los almacenamos en variables privadas para la claseAdaptador.lo nos quedaría modificar el resto de métodos y tendremos nuestro BaseAdapter creado.

más fácil de todos es el método getItemId que devuelve la posición del cursor dónde se encuecada momento. Bastaría con devolver el valor de position.

verridelic long getItemId(int position) {

ODO Auto-generated method stub return position;

siguiente método que vamos a modificar es el que devuelve el número de elementos que tieneestra matriz.

verridelic int getCount() {

ODO Auto-generated method stub return Acontactos.length;

y que tener cuidado en introducir el mismo número de elementos en las dos matrices que hemado, ya que al ser independientes podríamos cometer el error de poner en una más elementos otra.

el método getItem sólo tendremos que devolver como Objeto (Object) el elemento marcado.

verridelic Object getItem(int arg0) {

ODO Auto-generated method stub return Acontactos[arg0];

lugar de devolver los dos valores, contacto y teléfono, para simplificar sólo devolveremos embre del contacto. Si hubiéramos creado una estructura con ambos podríamos devolver dichaructura como objeto y sería más correcto que este ejemplo.

sólo nos quedaría modificar el método getView, que es el encargado de cargar nuestro LayouML y personalizarlo con los valores los elementos de nuestra lista.

mo hemos llegado a este punto y no hemos creado el Layout XML de cada elemento del listadmos a proceder a crearlo ahora.a de Layout:

 Nombre Contacto

mero teléfono Dejaremos los mismos nombres que

lipse/ADK Android les va a ir gnando. Así la imagen del teléfono tendrá el id imageView1, el nombre del contacto tendrá el

Page 280: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 280/352

tView1 y el Número del teléfono tendrá el idView2. Podemos personalizarlos con nuestros propios id pero en laogramación debes recordar llamarlos con el mismo nombre de id.

lsamos sobre res/layout con el botón derecho y New – Android XML File. De nombre le ponementos y vamos a escoger RelativeLayout como elemento raíz

ot element), por su versatilidad a la hora de colocar los elementos. Pulsamos en finalizar (Fin

adimos un ImageView pinchando y arrastrando sobre nuestro Layout XML y nos aparecerá el

ector de recursos (Resource Chooser).

Page 281: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 281/352

Le pulsamos en recursos del sistema (Systemsources), seleccionamos ic_menu_call. Pulsamos OK.

ora añadimos dos TextView, pero uno va a ser de tipo Large y el otro de tipo Medium. Deberedar como se muestra en la captura, y compruebe los nombres de los id en la pestaña Outline.

Page 282: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 282/352

Guardacambios y ya podemos proceder a continuar con la programación del BaseAdapter.

funcionamiento del método getView() es recoger un View creado (nuestro elementos.xml, LayML). Modificar con el elemento del array el contenido del View y retornar el elemento Viewultante.

primero que tenemos que hacer es inflar el objeto ListView de nuestra Actividad Principal.outInflater inflater = actividad.getLayoutInflater();

segundo lugar definimos un objeto del tipo vista de nuestro XML creado en el paso anterior ementos.xml, R.layout.elementos).w view = inflater.inflate(R.layout.elementos_lista, null,true);

lo nos quedaría modificar los TextView del view que acabamos de definir y retornar el viewultante.

tView textView1=(TextView)view.findViewById(R.id. textView1);View1.setText(Acontactos[position].toString());tView textView2=(TextView)view.findViewById(R.id.textView2);View2.setText(Atelefonos[position].toString());urn view;

método getView() una vez terminado quedaría así:ride

View getView(int position, View convertView, ViewGroup parent)

O Auto-generated m ethod stub

tInflater inflater = actividad.getLayoutInflater(); View view = inflater.inflate(R.layout.elementos, null,true); TextView textView1=(TextView)view.findViewById(R.id.textView1); textView1.setText(Acontactos[position].toew textView2=(TextView)view.findViewById(R.id.textView2); textView2.setText(Atelefonos[position].toString()); return view;

demos comprobar que se obtiene el textView1 con el método findViewById() al igual quelizábamos en nuestros Activity, pero con la diferencia que le anteponemos el view que

abábamos de definir anteriormente: view.findViewById().

visa todo el código completo del BaseAdapter que acabamos de crear. Por ejemplo, en el mé

Page 283: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 283/352

View hemos sustituido los nombres arg0, arg1, arg2; de los argumentos que entran en el métodr los nuestros propios. Igual se ha realizado con las de los otros métodos.

android.app.Activity;android.view.LayoutInflater; import android.view.View;android.view.ViewGroup; import  android.widget.BaseAdapter; import  android.widget.TextView;

c lass MiAdaptador  extends BaseAdapter {final Activity  actividad; private final String Acontactos[]; private final String Atelefonos[];

MiAdaptador(Activity actividad, String contactos[], String telefonos[]) {;ividad=actividad; this.Acontactos=contactos; this.Atelefonos=telefonos;

rident getCount() {

O Auto-generated m ethod stub return Acontactos.length;

rideObject getItem(int arg0) {

O Auto-generated m ethod stub return Acontactos[arg0];

rideong getItemId(int position) { // TODO Auto-generated m ethod stubposition;

rideView getView(int position, View convertView, ViewGroup parent) {

O Auto-generated m ethod stub

tInflater inflater = actividad.getLayoutInflater(); View view = inflater.inflate(R.layout.elementos, null,true); TextView textView1=(TextView)view.findViewById(R.id.textView1); textView1.setText(Acontactos[position].toew textView2=(TextView)view.findViewById(R.id.textView2); textView2.setText(Atelefonos[position].toString()); return view;

mos a nuestro al layout de nuestra Actividad Principal (activity_main.xml). Lo abrimos,ordemos que un ListView siempre debe ir dentro de un FrameLayout. Por lo que añadimos a

estro diseño un FrameLayout (Layouts) y dentro un ListView (Composite).

Page 284: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 284/352

te deberá ser el aspecto de nuestro Layout Principal. Podríamos ver cómo quedaría pero conestra plantilla elementos.xml. Pulsamos con el botón derecho sobre listView1 y Preview Listntent – Choose Layout…

arecerá una nueva ventana con los elementos disponibles en nuestro proyecto.

egimos elementos que es nuestra plantilla creada y pulsamos OK.

Page 285: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 285/352

Page 286: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 286/352

Este sería el resultado de cmostraría nuestro ListView.

ardamos los cambios.onCreate de nuestra clase principal tendremos que definir el Adaptador con el BaseAdapter q

mos creado.

ptador adapter = new  MiAdaptador(MainActivity.this, contactos, telefonos);

ría interesante que comparara el código con el de la creación de ListView con diseñosedefinidos del sistema (ejercicio anterior).

siguiente paso sería apuntar a nuestro listView (listView1) y definirle el adaptador con el creel anterior paso.w listView = (ListView) findViewById(R.id.listView1); listView.setAdapter(adapter);

está creado nuestro listView personalizado, sólo nos quedaría programar los clic en los distimentos de nuestra lista. Aunque se realizaría igual que el ejemplo anterior.

código completo quedaría así:android.os.Bundle;android.app.Activity; import android.view.View;android.widget.AdapterView; import  android.widget.ListView; import  android.widget.Toast;

c lass MainActivity extends Activity {

ontactos[]=new String[] {"Manuel", "Miguel", "Lourdes", "Macarena", "Rocio", "Jose", "Rosa", "Antonio", "Francisco", "Marta"};elefonos[]= new String[] {"658658658","659659659","660660660","661661661", "662662662", "663663663", "664664664", "665665665", "666666666", "667667667"};

rideted void onCreate(Bundle savedInstanceState) {

onCreate(savedInstanceState); setContentView(R.layout.activity_main);ptador adapter = new  MiAdaptador(MainActivity.this, contactos, telefonos);w listView = (ListView) findViewById(R.id.listView1); listView.setAdapter(adapter);

w.setOnItemClickListener( new AdapterView.OnItemClickListener() {ridevoid onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)

introducimos la programa ción que queram os realizar  Toast.makeText (getApplicationContext(), "Has clickado sobre el num. " + position, Toast. LENGTH_SHORT ).show();método onn método setOnItemClickListener  }

Page 287: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 287/352

ra arreglar el tema de las alineaciones del texto de nuestro diseño para que no se estropeen lasición de algunos elementos mostrados, bastaría con poner en la propiedad Width de los Textvalor fill_parent.

edes probar también pinchar en la lista y arrastrar, así comprobaras que el scroll funcionarrectamente cuando la lista supera el tamaño de la pantalla.

Page 288: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 288/352

APÍTULO9

Page 289: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 289/352

Widget”

apítulo 19 “Widget”

Widget es una pequeña aplicación que se mostrará en el escritorio. Todos tenemos presente eoj que se coloca en nuestro escritorio, o el estado de la batería, etc.

rte 19.1 Método actualización con AppWidgetProvider/XMLra crear un Widget necesitaremos:

nterfaz gráfica (GUI)AppWidgetProviderInfo , Configuración del Widget con un XMLAppWidgetProvider, una clase con cuatro métodos para actualizar nuestro widgetDefinirlo en AndroidManifiest.xml

menzaremos por nuestra interfaz gráfica, en la que sólo podremos utilizar los siguientes eleme

Contenedores: FrameLayout, LinearLayout, RelativeLayoutControles: TextView, Button, ImageButton, ImageView, ProgressBar, Chronometer, AnalogClo

tenemos a nuestra disposición todo el arsenal de elementos que tenemos para crear una aplicAndroid, pero con los que nos permite podemos crear casi cualquier aplicación.

mos a crear un simple widget con un textView en el que se muestre la hora del sistema.

lsamos en New – File – New Android Application. De nombre le vamos a poner WidgetReloj

segundo paso vamos a desmarcar la casilla para que nos cree una activity. Un widget carece divity, por lo que crearemos una aplicación sin él.

Page 290: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 290/352

mos a crear un id/string que se llama txtTituloHora, con el valor Última Hora.

mos de alta un nuevo interfaz gráficalayout, por lo que hacemos un clicn el botón derecho sobre la carpetaout y New – Android XML File.

daremos el nombre mireloj y escogemostipo de recurso Layout y

nearLayout.

nos aparece el Layout Horizontal, lombiaremos por LinearLayout Vertical.

adimos dos TextView. El primero tiened txtMensajeTitulo y le asignamos elstring creado anteriormente. El segundodrá el id txtHora.

Page 291: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 291/352

ora crearemos un elemento drawable que será elor de fondo de nuestro widget. Para crearlo,mero pulsamos con el botón derecho sobre lapeta res (recursos) y creamos una nueva

Page 292: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 292/352

peta con el nombre drawable, New – File – lder.

dicha carpeta vamos a crear un elemento XML, con el botón derecho FileNew – Android XML File. Al estar en una carpeta drawable el tipo de recurso deberá aparecema automática Drawable, si no es así, compruebe que lo está realizando en la carpeta adecua

mbie el tipo de recurso por Drawable tal como se muestra.

Root Element podemos marcar desde un Color liso (Color), a un degradado (Gradient), unaagen con bitmap, etc… Nosotros elegimos shape, para luego añadirle un color degradado.

Page 293: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 293/352

Le damos el nombre fondo. Narecerá un código como el que se muestra a continuación.

xml version="1.0"  encoding="utf-8" ?>ape xmlns:android="http://schemas.android.com/apk/res/android"  > </shape>

problema de crear fondos gradientes (Gradiente), es que el plugin de Eclipse no lo tieneomatizado con ventanas, por lo que lo haremos de la forma más sencilla posible.

efecto de degradado (gradient) tiene tres variables, startcolor (color inicial), endcolor (color que se degrada), angle (angulo o inclinación del degradado enados).

la ventana Outline (normalmente columnarecha del espacio de trabajo) aparece elmento shape, pulsando un clic con eltón derecho sobre él podemos elegir Addild - New Element (Añadir hijo – Nuevo

emento).

la ventana que

arece le damos el

Page 294: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 294/352

mbre gradient.

ora en la misma ventana Outline haremos un clic con el botón derecho sobre el nuevo elementadient y pulsaremos en Add Attribute – New Attribute, para cada uno de los elementos: angle,rtcolor, endcolor. Hay que anteponerle la palabra android: delante.

Page 295: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 295/352

9 android:angle con valor 45, sólo múltiplos de 45. android:startColor con valor #ee110android:endColor con valor #dd2ecc

cuerde: Respete las mayúsculas/minúsculas, la C d e Color va en

mayúscula obligatoriamente.código fuente quedará parecido a lo que se muestra a continuación.version="1.0"  encoding="utf-8" ?>

android="http://schemas.android.com/apk/res/andr oid"  >

Page 296: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 296/352

ent android:angle="130"  android:startColor ="#ee1100"  android:endColor ="#dd2ecc" > </gradient>e>

ómo quedará?. Pues vamos a implementarlo en nuestroout de nuestro widget, al que pusimos el nombre dereloj.

lsamos sobre el LinearLayout en la ventana Outline, on pulsamos sobre cualquier zona libre de nuestroerfaz.

a vez seleccionado, en

propiedades buscamospropiedad background yeccionamos nuestro

awable/fondo.xml.

resultado de cómo

Page 297: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 297/352

edaría nuestro layoutn el color degradado sería como el que se muestrala imagen.

ora vamos a crear en la carpeta res una nuevapeta llamada xml, en ella vamos a hacer clic conbotón derecho y New – File – Android XML File

la ventana que aparece seleccionamos como tipo de

urso (Resource Type) AppWidget Provider, de nombre

oj_widgetprovider.

Page 298: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 298/352

la ventana que aparecelenamos las casillas como se muestra en la imagen.

Page 299: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 299/352

Min width: Es el ancho mínimo de nuestro widget medido en dip/dp. Le pondremos el valor 8Min height: Es el alto mínimo de nuestro widget medido en dip/dp. Le pondremos el valor 40dUpdate period millis: Tiempo que tardará en actualizarse nuestro widget. El valor mínimo es00000 milisegundos, 30 minutos. Para programar correctamente nuestro reloj, y que este no seualice cada media hora tendremos que realizar este mismo ejemplo pero con otro método,lizando servicios (Services). Lo haremos tras acabar este ejemplo.Initial Layout: Es el layout o interfaz gráfica inicial que contendrá se mostrará como nuestro

dget. Pulsamos Browse y lo seleccionamos de la carpeta layout.

mayoría de widget les basta con realizarse con este método, ya que actualizando la informacida 30 minutos sería más que suficiente. Por ejemplo, un widget mostrando el tiempo, o cambioa web/redes sociales, informes de visitas de sitios web, etc.

el siguiente paso vamos a crear la parte de programación. Como no tenemos Activity, no nos ado en la carpeta src ninguna clase. En la carpeta src pulsamos con el botón derecho y New –

ass. De nombre de package ponemos com.example.widgetreloj (el mismo que viene en el

droidManifiest.xml), en name pondremos mireloj, y en Superclass escribimos appWidgetProvulsamos el botón Browse para que nos dé las posibilidades con dicha palabra.

Page 300: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 300/352

Page 301: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 301/352

los métodos que tiene la clase AppWidgetProvider vamos a modificar sólo onUpdate() que ecargado de actualizar el contenido de nuestro widget cada 30 minutos.

void onUpdate( Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds ) {se actualiza el widgetdigo colocado aquí se ej ecutará cada 1.8000.000 milisegundos // Especificado en el XML AppWidgetProviderInfo

la programación tenemos que hacer referencia a la clase que estamos programando, por esteotivo primero tendremos que darla de alta en AndroidManifiest.xml

rimos el fichero y pulsamos sobra la pestaña Application. Pulsamos el botón Add… y añadimReceiver.

name pulsamos Browse y nos saldrá reloj que es la clase que acabamo de dar de alta.

Page 302: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 302/352

propiedad Label ponemos el nombre de la aplicación queeremos que se muestre en Android. Le pondremos Widget Mi Reloj.

y que añadir un Intent Filter 222 como hijo del elemento Receiver e acabamos de crear, por lo que pulsamos de nuevo el botón Add…, y marcamos Intent Filter.

spués pulsamos de nuevo ne Add… y añadimos un Action al Intent Filter. En la propiedad Na

Action escribimosdroid.appwidget.action.APPWIDGET_UPDATE. Es posible que no aparezca en la lista

Page 303: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 303/352

splegable este Name, escríbalo respetando las mayúsculas/minúsculas.

te Intent y su hijo Action, son los que informan al sistema Android de que se trata de un Widgede una aplicación.

r último, pulsamos sobre el Receiver y le creamos un Meta pulsando en Add… En la propiedme le ponemos android.appwidget.provider y em Resource seleccionamos XML – oj_widgetprovider.

bería quedar como se muestra en la imagen.

ardamos los cambios y ya podemos ir a programar a la clase reloj.

finimos la variable fecha y extraemos la hora y los minutos en modo simple.echa=new Date();DateFormat sf = new SimpleDateFormat("HH:mm");

te código de programación no es realmente de Android, sino de Java. Sólo tendremos que utilsiguientes clases en nuestro proyecto.

java.text.SimpleDateFormat;j ava.util.Date;

finimos un nombre de componente para que apunte a nuestra clase reloj, la que estamosogramando ahora mismo.

nentName componenteReloj;

cesitaremos el import correspondiente, import  android.content.ComponentName;

ra poder acceder a los objetos contenidos dentro del layout de nuestro widget tendremos quecerlo de forma remota, utilizando un tipo de objeto llamado RemoteViews.

moteViews remoteViews;

luimos el import que necesita, import  android.widget.RemoteViews; Ahora creamos un vinculo de nuestro layoutterfaz gráfico), que tenía el nombre mireloj.xml, con la siguiente línea de programación.

Views = new RemoteViews( c ontext.getPackageName(), R.lay out.mireloj );

emos lo propio con la clase que estamos creando y la vinculamos con componenteReloj.nenteReloj = new ComponentName( context, reloj.class );

ora veamos como podemos modificar o manipular cualquier objeto con remoteViews.Views.setTextViewText( R.id.txtHora, "Hora = " + sf.format(fecha));

r último actualizamos la vista de nuestro widget, porque aunque cambiemos el TextView txtHn remoteViews, visualmente no se actualiza.

dgetManager.updateAppWidget( c omponenteReloj, remoteViews );

n esto ya estaría nuestro widget creado y listo para usar.ódigo completo de la clase quedaría así:e com.example.widgetreloj;

t de JAVAjava.text.SimpleDateFormat; import j ava.util.Date;

Page 304: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 304/352

t de Androidandroid.appwidget.AppWidgetProvider;import  android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context;android.widget.RemoteViews;

c lass reloj  extends AppWidgetProvider {

ejecutar sobre Run en Eclipse, veremos que tras compilarse e instalarlo en la máquina virtuaicación no se ejecuta… esto es porque tendremos que añadirlo de forma manual al escritorio

lsamos el botón de Aplicaciones. Luego pulsamos en Widgets.

Buscamos nuestro Widget que tienmbre Widget Mi Reloj.

Page 305: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 305/352

jando pulsado sobre él lo arrastramos a uan parte libre del escritorio.

tenemos nuestros widgetalmente funcional y añadido en nuestro dispositivo android.

único problema sería que este método sólo se actualiza cada 30 minutos mínimo; y

n ello nos evitamos el tener que programar un servicio.

nque le pueda resultar complicado y difícil de memorizar, es tan sólo realizar unos cuantos

dgets y verá como no le parece tan difícil en realidad.

Page 306: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 306/352

Parte 19.2 Método actualización con AlarmManager

s procesos a realizar en un Widget suelen ser sencillos, pero no pueden tardar en ejecutarse m5 segundos. Es por esto que se recomienda utilizar un servicio para ejecutar el código deualización del widget, más si para actualizarse requiere de consultas por red/internet que pue

morarse más de 5 segundos. Por lo que el ejemplo anterior meteríamos todo el código deualización del widget en un Service (Servicio) y el código quedaría lago similar a esto:

android.app.Service;android.appwidget.AppWidgetManager; import android.content.ComponentName; import  android.content.Intent;

android.os.IBinder;android.widget.RemoteViews;

c lass  ActualizarWidget extends Service {

ridevoid onCreate() {

onCreate(); }

ressWarnings ("deprecation") // Esta línea es para que ignore SimpleDateFormat que está en desusorident onStartCommand(Intent intent, int flags, int startId)

dgetManager appWidgetManager =dgetManager. getInstance(this.getApplicationContext());

emos la fecha/hora del sistemaecha=new Date();amos un form ato simple, solo con hora y minutos SimpleDateFormat sf =  new SimpleDateFormat("HH:mm");

nentName componenteReloj; RemoteViews remoteViews;ulamos la vista rem ota con el lay outViews = new RemoteViews( this.getApplicationContext().getPackageName(),

ut.mireloj );ulamos el c omponente con la clase (e sta, reloj.class)nenteReloj = new ComponentName( getApplicationContext(), reloj.class ); // Actualizamos el valor de un TextView de la vista remota, con rem oteViews // Damos form ato a la variable fecha c on sf.format()Views.setTextViewText( R.id.txtHora, "Hora = " + sf.format(fecha));

dgetManager.updateAppWidget( c omponenteReloj, remoteViews );super.onStartCommand(intent, flags, startId); }

rideIBinder onBind(Intent intent) {

null; }

Page 307: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 307/352

desde el widget iniciamos el servicio en su lugar:void onUpdate(Context context, AppWidgetManager a ppWidgetManager,int[] appWidgetIds) {nentName thisWidget = new ComponentName(context, cuentaatrasWidget.class);

ntent = new  Intent(context, ActualizarWidget.class); // Comprobamos que no e xista una instancia del servicio en eje cución if (service==null)

= PendingIntent. getService(context, 0, intent, PendingIntent. FLAG_CANCEL_CURRENT ); }.startService(intent); }

problema reside en que seguiría ejecutándose como mínimo una vez cada 30 minutos, salvand

e con el servicio tendríamos algo más de 5 segundos para ejecutar el código de actualización dget. Pero además si queremos que se actualice en un tiempo inferior a 30 minutos, entoncesdremos que utilizar AlarmManager para programar la ejecución del widget cada x

gundos/minutos.

stTime = SystemClock.elapsedRealtime();guración de ejec ución de un servicio cada segundo

Manager a m = (AlarmManager)context.getSystemService(Context. ALARM_SERVICE ); am .setRepeating(AlarmManager. ELAPSED_REALTIME_WAKEUP ,firstTime, 1000, service);

earemos un programa que realice una cuenta atrás hasta la media noche (24 horas). Damos a nicación Android y le damos el nombre cuenta24h, quitándole que no nos cree Activity.

demos crear el fondo en la carpeta drawable o bien copiar el del ejercicio anterior en nuestrooyecto. /res/drawable/fondo.xmlmos a dar de alta el id/String labelQuedan con valor Quedan…

ora la interfaz gráfica de nuestro Widget. En la carpeta layout creamos el fichero Android XMn nombre main.xmlponemos como fondo el diseñado, o copiado, leroducimos dos textView.

extView1 le cambiamos el id lblQuedan y legnamos el id/string lblQuedanextView2 le cambiamos el id por txtQuedan

resultado visual debería parecerse al de laagen.el siguiente paso vamos a crear el XML para AppWidgetProvider. Creamos la carpeta xml y

Page 308: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 308/352

a creamos el ficheroml_widgetprovider.xml

la ventana que aparece rellenamos las casillas como se muestra en la imagen.

Page 309: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 309/352

mos a dar de alta dos clases:ppWidgetProvider ervice

lsamos en New – Class sobre la carpeta src.

package ponemos lo que tengamos endroidManifiest.xml, en nuestro caso

m.example.cuenta24h

nombre le ponemos cuenta24hsuperclass appWidgetProvider y pulsamos

owse para elegirlo.

Page 310: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 310/352

ardamos los cambios.eamos una nueva clase, para el servicio, en la carpeta src; si lo creamos sobre el package ya ndremos que volver a escribirlo.

nombre le pondremos actualizarWidget.superclass escribimos Service y pulsamos Browse para elegirlo.

ardamos los cambios y daremos las dos clases de alta en AndroidManifiest.xmlrimos el fichero AndroidManifiest.xml y pulsamos sobra la pestaña Application. Pulsamos eltón Add… y añadimos un Receiver.

la propiedad name pulsamos Browse y nos saldrá la clase cuenta24 que es la clase que acabadar de alta.

Page 311: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 311/352

Page 312: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 312/352

propiedad Label ponemos el nombre de la aplicación queeremos que se muestre en Android. Le pondremos Cuenta Atrasedianoche.

y que añadir un Intent Filter como hijo del elemento Receiver que acabamos de crear, por lo qlsamos de nuevo el botón Add…, y

rcamos Intent Filter.

spués pulsamos de nuevo ne Add… y añadimos un Action al Intent Filter. En la propiedad NaAction escribimos

droid.appwidget.action.APPWIDGET_UPDATE. Es posible que no aparezca en la listasplegable este Name, escríbalo respetando las mayúsculas/minúsculas.te Intent y su hijo Action, son los que informan al sistema Android de que se trata de un Widgede una aplicación.

lsamos sobre el Receiver y le creamos un Meta pulsando en Add… En la propiedad Name lenemos android.appwidget.provider y em Resource seleccionamos XML – xml_widgetprovide

n solo quedaría dar de alta el servicio enestro proyecto, por lo que pulsamos en cualquier pacio en blanco y volvemos a pulsar Add…,eccionamos Create a New Element … y Service.

name seleccionamos

ualizarWidget.

Page 313: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 313/352

ardamos todos losmbios realizados endroidManifiest.xml

Debería quedar como se mula imagen.

sta este punto todo ha sido exactamente igual que en el ejemplo anterior, pero creando un servdándolo de alta en

droidManifiest.xml. En la programación si existen varios cambios, ya mostrados anteriorment

mero editamos la clase cuenta24h que es nuestro appWidgetProvider.do el código se ha comentado para que pueda comprenderlo.a ndroid.app.AlarmManager;android.app.PendingIntent;android.appwidget.AppWidgetManager;android.appwidget.AppWidgetProvider;android.content.ComponentName;android.content.Context;android.content.Intent;android.os.SystemClock;

c lass cuenta24h extends AppWidgetProvider 

mos una variable global para la clase que nos indique si el servicio está iniciadoe PendingIntent service = null;ridevoid onUpdate(Context context, AppWidgetManager a ppWidgetManager,int[] appWidgetIds)

nimos el componente actual de esta clasenentName thisWidget = new ComponentName(context, cuenta24h.class);

nimos la intención apuntando a la clase del servicio actualizarWidget Intent intent =  new  Intent(context, actualizarWidget.class);servicio no se ha ej ecutado anteriormente será nullce==null)

valor es nulo, entonces cogemos el servicio= PendingIntent. getService(context, 0, intent,

gIntent. FLAG_CANCEL_CURRENT );

amos el servicio iniciamos

.startService(intent);nimos firstTime con e l tiempo real del reloj del sistema  long firstTime = SystemClock.elapsedRealtime();guración de la a larma

Page 314: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 314/352

Manager a m = (AlarmManager)context.getSystemService(Context. ALARM_SERVICE ); // Ejecutamos service c ada 1000 milis (1 segundo) con el AlarmManager def inido

nea anterior Repeating(AlarmManager. ELAPSED_REALTIME_WAKEUP ,firstTime, 1000, service);

ridevoid onDisabled(Context context) {

larmManager m = (AlarmManager) c ontext.getSystemService(Context. ALARM_SERVICE );

ctivamos la alarma si se elimina la última instancia del Widget en el escritorio del sistemael(service);

código fuente para el servicio actualizarWidget quedaría completo así…android.app.Service;android.appwidget.AppWidgetManager; import android.content.ComponentName; import  android.content.Intent;

android.os.IBinder;android.widget.RemoteViews;

c lass actualizarWidget extends Service {

ridevoid onCreate() {

onCreate(); }

ressWarnings ("deprecation")rident onStartCommand(Intent intent, int flags, int startId) {

nimos la a ppWidgetManager  AppWidgetManager appWidgetManager = AppWidgetManager. getInstance(this.getApplicationContext());

gemos la fecha del sistema231Date fechafinal=new Date();c hainicio=new Date();

biamos de la hora actual guardada en la variable fechafinal fechafinal.setHours(24);nal.setMinutes(0);nal.setSeconds(0);sta forma tendrem os la fecha ac tual, pero con la hora apuntando a

ianoche

mos am bas fechas y nos devuelve un valor long con los milisegundos que restan entre am bas fechaslisegundos = fechafinal.getTime() - fechainicio.getTime();

nentName componenteReloj; RemoteViews remoteViews;ulamos la vista rem ota con el lay outViews = new

eViews( this.getApplicationContext().getPackageName (), R.lay out.main ); // Vinculamos el c omponente con la clase ( esta, reloj.class) componenteReloj = new  ComponentName( getApplicationContext(),

24h. class );alizamos el valor de un TextView de la vista rem ota, conViews // Damos formato a la variable fecha con sf.format()

Views.setTextViewText( R.id.txtQuedan, (milisegundos/1000)+"os");

WidgetManager.updateAppWidget( componenteReloj, rem oteViews );super.onStartCommand(intent, flags, startId); }

rideIBinder onBind(Intent intent)

null;

s métodos .setHours(), .setMinutes(),tSeconds(), se encuentran tachados porqueán en desuso, por eso añadimos la línea

SuppressWarnings("deprecation") englobandoStartCommand(); para que lo obvie y no nosadvertencias (warnings).

Page 315: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 315/352

ta: Si no le aparecen errores y le notificae la instalación ha sido correcta, pero noarece en la lista de Widgets, revise lasyúsculas y minúsculas en AndroidManifiest,e no existan espacios ni antes ni después en los Name, etc.; es algo muy común poner droid.appWidget.Provider en lugar dedroid.appwidget.provider.

Page 316: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 316/352

APÍTULO0

Page 317: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 317/352

Publicar la aplicación”

apítulo 20 “Publicar la aplicación”

ra poder monetizar una aplicación, lo primero es tenerla creada y subida a internet, bien en elogle Play Store o en nuestra web, etc.

r lo que veremos primero como publicar nuestra aplicación ya creada, y posteriormente veremmo modificarla para poderla monetizar.te proceso consta de dos partes, la primera es darnos de alta como desarrolladores y la segunbir nuestras aplicaciones.rte 20.1 Alta en Google Play Storemos a darnos de alta una cuenta de servicio Android Market como desorrallador.ra publicar nuestra aplicaciones en Android Market (Google play) tenemos que darnos de altamo desarrolladores; y tendrá un coste de 25$ (dólares USA) a fecha del año 2012.primero que debemos hacer es ir a la url http://market.android.com/publish

Page 318: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 318/352

ya tenemos una cuenta de Google y estamos autentificados nos aparecerá de forma automáticaestra cuenta de correo electrónico en los dos cuadros de blanco que tapan la información. El oculo rojo marca el precio o cuota de pago único que tenemos que realizar mediante Checkout.iere decir que hacemos un solo pago de la cantidad estipulada, en este caso 25$ US, y podrembir todas las aplicaciones que deseemos. 234 Una vez subida una aplicación Google la examinaguardará la posibilidad de decisión de publicarla o no. En la mayoría de los casos, si laicación no es dañina o maligna para el equipo, y funciona correctamente sin errores graves, sblicará en el Android Market (Google Play).

roducimos nuestros datos (reales):

Nombre del desarrollador (será el nombre que se muestra debajo de la aplicación). Direcccorreo electrónicoURL de nuestro sitio webNúmero de teléfono incluyendo delante el signo más y el código del país. Ejemplo para

paña: +34650650650.

Marcamos la casilla de si queremos recibir noticias sobre oportunidades de Googleay y desarrollo; sería interesante porque nos pueden notificar cosas que nos podríaneresar como desarrolladores.

lsamos Seguir, y nos aparecerá el Acuerdo de distribución para desarrolladores. Una vez lomos marcamos la casilla de Acepto las condiciones y pulsamos en seguir.

la siguiente pantalla nos pide el pago de la cuota.

Pulsamos sobre Buy withogle.s aparece el pedido.total a pagar.el inicio de sesión (autentificación) en caso de que tengamos una cuenta de Google.

a vez autenticados con nuestro usuario y contraseña de Google, nos aparecerá la información gar.

Page 319: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 319/352

Page 320: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 320/352

lo nos quedaría meter nuestros datos personales y los datos de nuestra tarjeta de crédito.

dos los datos personales de la captura han sido borrados por privacidad. Corresponden a nompellidos, dirección, teléfono, etc.

ardamos y Realizamos el pedido Ahora.

r último nos muestra un mensaje dándonos las gracias e informándonos que ha terminado el

oceso de alta. Ahora volveremos al Sitio de Desarrolladores de Google Play para finalizar nugistro.

Page 321: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 321/352

pamos, otra vez, en la captura tanto el nombre y apellidos, como el correo electrónico por vacidad.s dirigimos a la URL para desarrolladores de Android.p://play.google.com/apps/publish/nos aparecerá nuestra cuenta con el mensaje “Se ha aprobado tu registro comosarrollador de Google Play”.

podemos subir nuestras aplicaciones al Android Market, Google Play.236 Para poder cobrar paplicaciones (en

so de que estas vayan a ser de pago),drás que crear una cuenta Googleeckout.

Page 322: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 322/352

Parte 20nerar certificadonecesita generar un certificado válido de al menos 25 años para que Google Android Market

mita nuestro APK de la aplicación.

Page 323: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 323/352

Se puede crear el certificado desde el propio Eclipse.

primer lugar, una vez terminada y testeada por completo nuestra aplicación, pulsamos con eltón derecho sobre la carpeta de nuestro proyecto (desde Eclipse) y vamos a Export.

spués en la ventana que nos aparece seleccionamos AndroidExport Android Application.

s da a elegir el proyecto, por si habíamos accedido por el menú de la aplicación, o queríamoeccionar otro proyecto distinto. Pulsamos siguiente.

Page 324: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 324/352

Page 325: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 325/352

7 Introducimos la ruta donde se almacenará los ficheros de claves.

mo es la primera vez que creamos untificado pulsamos sobre crear nuevaystore (Create New KeyStore), ponemosntraseña y lanfirmamos. En lasuientes aplicaciones que desarrollemos como ya disponemos de un keystore le pulsamos en ukeystore existente (Use existing keystore).

Page 326: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 326/352

En el siguiente paso rellenaredos los datos con los que certificaremos nuestras aplicaciones.

Alias: identificador de la clave.Password: contraseña de la clave, debemos guardarla o recordarla pues lacesitaremos cada vez que queramos publicar una nueva actualización de la aplicación en Andrarket.Confirm: confirmar lantraseña anterior.Validity (years): validez del certificado, mínimo 25 años.First and Last Name: nombre del desarrollador o de la empresa.Organization Unit:partamento.Organization: nombre de la empresa.City or Locality: ciudad.State or Province: provincia.Country Code: código ciudad.

este paso indicamos la ruta y el nombre del paquete APK compilado y certificado, que será ehero que subiremos al Google Android Market.

lsamos Finish y ya podemos ir al Android Market a subir nuestra aplicación.

Page 327: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 327/352

Page 328: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 328/352

238rte 20.3 Subir nuestra aplicacióntramos en http://market.android.com/publish y nos autentificamos con nuestra cuenta de Googl

la ventana principal podemos comprobar como nos informan que se ha aprobado nuestro regimo desarrollador de Google Play. Esta aprobación la podemos perder si subimos softwaredecuado, como por ejemplo que suponga un mal funcionamiento para el sistema, lo ponga enigro, contenga contenido no permitido. Todo estaba detallado en el documento de privacidad

mó al darse de alta y que puede volver a consultarlo al subir una aplicación.

ntamos para este ejemplo que ya tenemos creada una aplicación completa y funcional.esta pantalla de Bienvenida pulsamos el botón Subir Aplicación.

Page 329: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 329/352

arece una advertencia sobre las claves de licencia. En el caso de que tu aplicación sea de pagliza sistemas de facturación integradas en la aplicación, tendrá que obtener una clave de licennuestro ejemplo la aplicación será Gratuita y sólo se obtendrá beneficio a través de publicida

guiente capítulo).

bimos nuestro fichero APK, que estará en la carpeta bin de nuestro proyecto.

lo hay que añadir archivos de expansión si la aplicación supera un tamaño de 50MB.

Page 330: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 330/352

 Nos confirma la subnuestra aplicación y las advertencia de filtrado que recibirían los usuarios al instalar nuestraicación.

lsamos el botón Guardar.s aparecerá una página donde incluir toda la información de nuestra aplicación, Capturas de

ntalla, Iconos de alta resolución, Gráfico promocional, Idiomas, Titulos y descripciones en va

omas, nivel de madurez, Precios (no aparecerá de pago, puesto que hemos elegido anteriormelicencia), países soportados donde podrá instalarse. Todas las posibilidades de los datos aluir, vienen en la columna derecha.

Mínimo dos capturas de pantalla de la aplicación: esomendable que tengan buena calidad pues aparecerán cuando el usuario pulse en "Más" endroid Market, de esta forma le causaremos buena impresión.

Icono de la aplicación: la aplicación debe identificarse con un icono, a ser posible realizado

sotros mismos pues éste aparecerá en la parte izquierda cuando los usuarios busquen y encuen

Page 331: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 331/352

estra aplicación en Android Market.

Opcionalmente podemos incluir una imagen promocional.Opcionalmente podemos incluir una imagen de funciones.Opcionalmente podremos incluir un vídeo promocional de Youtube. Si no queremos que laicación sea promocionada fura de

droid Market maracaremos el check: "No promocionar mi

icación salvo en Android Market y en los sitios web o para móviles propiedad de Google.imismo, soy consciente de que cualquier cambio relacionado con esta preferencia puede tardaenta días en aplicarse".

Podremos elegir varios idiomas para añadir la descripción de las funciones y uso de nuestraicación. El inglés es obligatorio. En este punto nos solicitará:

Título de la aplicación: será el nombre que aparezca en las búsquedas, no debe ser muy largoferior a 30 caracteres).

Descripción: una descrión detallada (hasta 4000acteres) de lo que hace nuestra aplicación, es aquí donde hay que convencer al usuario de qu

estraicación tiene funciones únicas.

Cambios recientes: si es una actualización, podremos indicar aquí las últimas mejoras de laicación.

Si hemos añadido un vídeo promocional, podemos añadir un texto promocional.Tipo de aplicación: seleccionaremos del desplegable el que más se ajuste.Categoría: seleccionaremos del desplegable la que más se ajuste a nuestra aplicación.A continuación indicaremos si nuestra aplicación está protegida contra copias. Lo normal es qlo esté puesto que, como indica Android Market, esta función quedará obsoleta en breve, sien

stituida por el servicio de licencias.Clasificación del contenido: marcaremos si nuestra aplicación es para todos los públicos ontiene algún tipo de contenido para mayores.Precios: indicaremos aquí si nuestra aplicación será gratuita o de pago. (Sólo nos aparece elea opción en caso de241que hayamos elegido con Licencia en el paso anterior)

Si hemos elegido de pago, en "Precio predeterminado" introduciremos el precio que considerde tener nuestra aplicación. Pulsando el botón "Autocompletar" hará los ajustes para los diferses en los que queramos publicarla. En algunos hay precio mínimo, nos lo indicará de ser asíTambién nos indicará el número aproximado de modelos de dispositivos Android que soportaestra aplicación según los filtros indicados en el archivo de manifiesto.Por último introduciremos la información de contacto: o Sitio web.Correo electrónico.Teléfono.

Page 332: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 332/352

a vez rellenos todos los datos, pulsamos el botón superior de Guardar. Comprueba que los dan correctos, si hay errores los marcará.

arcamos la casilla y Aceptar.

ese bien en la parte superior, porque sale durante un muy breve intervalo de tiempo el mensajardada Correctamente. Sólo faltaría Activar nuestra aplicación. Para realizar este paso pulsam

bre la pestaña Archivos APK. Aquí estarán los archivos APK subidos anteriormente.

demos Activar osactivar nuestraicación. Por mplo, en caso de

e tenga un error ave y queramossactivarla mientras

Page 333: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 333/352

e preparamos ybimos la actualización.

ese en las características de la aplicación, las plataformas soportadas, resoluciones, etc.

está todo correcto y haivado el APK, podemos pulsar botón Publicar.

s dá un aviso sobre establecer aplicación como gratuita.espués no se podrá cambiar elecio).

tenemos nuestra aplicación instalada. Podemos ver los comentarios, la puntuación, instalacioales y activas, notificaciones de errores de la aplicación, etc…

ede llegar a tardar unas pocas horas en salir publicada en el Google Play Store, sea paciente.

ta: En el caso de aplicaciones de pago, Google se quedará una comisión del 30%. Este dineroá ingresado en tu cuenta de Google Checkout, creada en el punto anterior para darnos de alta csarrolladores de Google.

Page 334: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 334/352

APÍTULO1

Page 335: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 335/352

Monetizando nuestra aplicación”

apítulo 21 “Monetizando nuestra aplicación”

hora de rentabilizar nuestro esfuerzo creando una aplicación. Existen varias formas de sacar nero de un programa.

orma directa.Mediante publicidad, tenemos dos posibilidades con Google. La ideada para aplicaciones andllama Google AdMob. También podemos monetizar nuestra aplicación haciendo uso de unebView y mostrando publicidad de Google Adsense, la misma que en páginas webs.

Cobrando por la aplicación. Cuando una aplicación es única en su segmento, y de una calidadstante buena se puede decidir tomar este tipo de remuneración por nuestro trabajo. Es el menoomendable, ya que los portales de aplicaciones costan de miles de aplicaciones gratuitas con

uy buena calidad. Para poder optar por este punto, en el momento de la publicación de laicación (siguiente capítulo), existe una posibilidad de poder marcar la aplicación como gratupago, gestionándolo automáticamente el app Store en el que estemos (nosotros utilizaremos elogle Play Store).

Otra forma menos conocida son los add ons. Es decir, una aplicación es funcional pero le faltancionalidades, que si se compran se bajan de internet y se guardan dentro de la aplicación.

orma IndirectaHay muchas aplicaciones que dan un valor añadido a una web o servicio, que obtiene de for directa los beneficios. Por ejemplo, aplicaciones de diarios y periódicos, servicios de

municación, etc. La empresa se ve indirectamente beneficiada por una aplicación por la que ería es “gratuita”; el usuario no tendrá que pagar nada por ella.

rte 21.1 “AdMob”primero es darnos de alta en la web que google tiene para AdMob. Tienes un breve tutorial,mplos, etc.p://www.google.com/AdMob

ede darse de alta como nuevo usuario, o pulsar en “ Si ya es usuario de AdMob, acceda desde

uí.” A continuación le pulsamos autentificación con mi cuenta de Google, ponemos nuestro coontraseña.

s mostrará la página de admob de google, algo parecido a la captura.

Page 336: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 336/352

Mob es la unión de anunciantes y anunciadores, algo así como mezclar Adsense y AdWords e

o servicio. Nosotros sólo vamos a tratar cómo rentabilizar nuestra aplicación ganando dineromos a pulsar sobre la pestaña Sitios y Aplicaciones. Agregar sitio/aplicación y marcamos lación de aplicación Android (puede comprobar que AdMob le permitirá colocar anuncios enicaciones de casi cualquier tipo de plataforma móvil).

Page 337: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 337/352

Page 338: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 338/352

llenamos los datos del formulario, En el cuadro de URL del paquete Android deberá ponerla rket://details?id=<package-name>

va a Google Play, busca su aplicación verá que en la URL aparece el id.

a vez relleno todo pulsaremos sobre Continuar y pasaráomáticamente al siguiente paso Obtener código del sitio.

de descargar e instalar el SDK de AdMob. Puede realizarlo desde este punto o desde el SDK anager, como se muestra a continuación.

talar el Google AdMob SDK.

ecutamos bien desde el menú de programas dendows o desde el propio Eclipse el Android

DK Manager.

scamos Extras – Google AdMob Ads SDK. Lo

rcamos y pulsamos el botón Install.

Aceptam

do e instalamos.

Page 339: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 339/352

mos a buscar un dato que nos será imprescindible en la programación. Pulsamos en Ir aios/Aplicaciones en la página de admob, y buscamos Gestionar Configuración.

s dará un Id de editor que es fundamental cuando estemos programando los anuncios.

de editor: xxxxxxestamos en disposición de modificar nuestra aplicación para incluir publicidad en ella.

cesitamos realizar tres pasos para incluir anuncios de Google AdMob.Añadir el JAR SDK al proyecto EclipseDeclarar com.google.ads.AdActivity en AndroidManifiestConfigurar los permisos necesarios.

Añadir el JAR Admob SDK al nuestro Proyecto Eclispe. Pulsamos con el botón derecho sobr

estro proyecto y pulsamos en Propiedades.

va Build Path y pestaña Libreries (Librerias), clic sobre el botón Add External JARs… y

scamos en la ruta donde tenamos las librerías de Google Android instaladas el fichero de

Page 340: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 340/352

ogleAdMobSdsSDK. Normalmente, la ruta de instalación será:

os\<nombre usuario>\AppData\Local\Android\android-sdk\extras\google

ments And Settings\<nombre usuario>\AppData\Local\Android\android-sdk\extras\google 248Declarar com.google.ads.AdActivity en AndroidManifiest

rimos el fichero AndroidManifiest.xml, pestaña Application y añadimos un Activity con namem.google.ads.AdActivity; como ya tenemos otros elementos tendremos que pulsar en Crear numento en el nivel superior (Create a new Element in a top level).

propiedades de la Activity buscamos Configanges y pulsamos el botón Select.leccionamos: keyboard, keyboardHidden,entation, screenLayout, uiMode,eenSize, smallestScreenSize.

Configurar los permisos necesariosmos a la pestaña Permisos (Permissions) y

adimos dos Uses Permission:droid.permission.INTERNETdroid.permission.ACCESS_NETWORK_STATE

AndroidManifiest.xml debería quedar como uestra en la imagen.

Page 341: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 341/352

Código droidManifiest.xml resultado de nuestro ejemplo.version="1.0"  encoding="utf-8" ?>

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

e="com.tecnocodigo.checkcreditcar" 

:versionCode= "1" 

d:versionName="1.0"  >

sdk :minSdkVersion="8" 

:targetSdkVersion="16"  />

permission android:name="android.permission.INTERNET" />permission android:name="android.permission.ACCESS_NETWORK_STATE" />

cation:allowBackup="true" 

:icon= "@drawable/ic_launcher" 

:label= "@string/app_name"  249 android:theme="@style/AppTheme"  >

ityd:name="com.tecnocodigo.checkcreditcar.MainActivity"  android:label="@string/app_name"  >-filter >

n android:name="android.intent.action.MAIN"  />

gory  android:name="android.intent.category.LAUNCHER"  />t-filter >ity >ty  android:name="com.google.ads.AdActivity" 

:configChanges ="keyboard|keyboardHidden|orientation|screenLayout|uiMode|scree nSize|smalle stScree nSize" ></activity >cation>

fest>

ogramación para incluir anuncios en nuestra aplicación.rimos el código fuente de nuestro Activity principal.Incluimos el siguiente import.ort com.google.ads.*;

finimos un AdView dentro de la clase.vate AdView adView;

r ultimo en onCreate creamos nuestra publicidad:rear la adView

View = new AdView(this , AdSize. BANNER, "a15116344e3cc32");

uscar Layout donde se incluirá el anuncioearLayout layout=(LinearLayout) findViewById(R.id.milayout );ut.addView(adView);

etición para mostrar un anuncioada vez que llamemos a esta función se mostrará un nuevo anuncio adView.loadAd(new AdRequest());

último dato del AdView a1511… es el id de Editor que anotamos en pasos anteriores. En Addrá encontrar distintos tamaños de anuncios disponibles.

Layout de nuestro ejemplo se llama milayout, y se recomienda que sea un LinearLayout HorizVertical.

Page 342: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 342/352

da vez que se muestren los anuncios de nuestra aplicación, se generan unos ingresos por ualizaciones o clics. En la página de AdMob podremos ver todos los datos.ra poder cobrar el dinero generado por adMod deberá rellenar los datos en Cuenta – Detallesgo en la página de Admob.

roduce los datos personales (reales), el Id impositivo local es su NIF o CIF. Y en Detalles deberá marcar Transferencia o cobro por Paypal.

sultado final de la aplicación con la publicidad de AdMob.

portante es tener en cuenta que nos pueden sancionar si visitamos nosotros mismos la aplicacira generar tráfico de publicidad, y mucho peor hacer clics. Esto se considera actividad frauduGoogle puede tomar la determinación de cerrar nuestra subscripción al servicio AdMob. Por emuy importante añadir unas líneas que informaran a Google que estamos en modo TEST.

código de petición de publicidad quedaría modificado así, mientras estemos realizando prueb

Page 343: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 343/352

nuestra aplicación:

r la adView, con el c ódigo que AdMob nos asigna al dar una aplicación de a lta adView = new AdView(this, AdSize. BANNER, "a1511cb8xxxxx");ar Lay out donde se incluirá el a nuncio, nuestro layout se llama miLinear Layout lay out=(LinearLayout) findViewById(R.id.miLinear );addView(adView);uest adRequest =  new AdRequest();uest.addTestDevice(AdRequest.TEST_EMULATOR); // Emulador T_DEVICE_ID es un valor que …ece en LogCat al realizar una peticion de anuncio sólo si no es el emulador Android adRequest.addTestDevice("TEST_DEVICE_ID");

ar una solicitud genérica para c argarla con un a nuncio 251adView.loadAd(adRequest);

OTA: Hay que tener en cuenta que puede tardar cierto tiempo en mostrarse los anuncios la prim

z. En las pruebas que he realizado, en unas ocasiones no tardaba más de unos minutos; en otraasiones tardó un par de horas.

rte 21.2 “WebView y AdSense”

ra publicidad es crear una aplicación mediante WebView y acompañar el código HTML conblicidad de AdSense, el problema es que la publicidad de AdSense tradicional no se muestra positivos móviles. Para ello Google ha creado una sección dentro de AdSense para crear los

oques de anuncios para dispositivos móviles.

traremos en AdSense con nuestra cuenta de Google, y pulsaremos en el menú sobre Contenidoóviles – Bloques de Anuncios.

a vez en esta pantalla pulsamos sobre Nuevo bloque de anuncios, damos de alta un anuncionfigurando las opciones deseadas y nos dará un código para colocar en nuestros html.

está todo listo. Los ficheros html se mostraran en un componente WebView, tal como se mospítulos anteriores y tendremos otra forma de monetizar nuestra aplicación.

rte 21.3 “Aplicaciones de pago”ra crear una aplicación de pago debemos antes completar el alta en Google Checkout parapresas.

ra esto entramos en la página de publicación de aplicaciones de Android utilizada en el puntobir nuestra aplicación. http://market.android.com/publish

Page 344: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 344/352

lsamos en la opción “Informes financieros” y veremos un mensaje avisando que para ganar dinn aplicaciones de pago debemos darnos de alta una cuenta como comerciante en Google Checkya la teníamos creada anteriormente, lo único que nos pedirá será algunos datos nuevos ynfirmar.

ra entrar en la siguiente página de Google Checkout quizás deba autentificarse de nuevo con suail y contraseña de google. Le aparece una página on tres apartados:

Información de contacto privada: Esta información será privada, y sólo podrá consultarla GooInformación de contacto pública: Información la verá cualquier cliente que puede comprar nuicación.

Información financiera: Datos de interés para Google sobre nuestra empresa, como puede ser estra fecha de nacimiento (para saber si somos mayores de edad), volumen de ventas anuales destra empresa, etc.

ajo podemos marcar la opción de recibir boletines periódicos informativos. Marcamos la opc

Acepto las Condiciones del servicio… y pulsamos en Completar Registro.

Page 345: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 345/352

ntana que aparecerá una vez completado el registro. Ya podemos publicar aplicaciones de paGoogle Android Market (Google Play).

blicando aplicación de pago

a vez generada nuestra aplicación y exportada con las claves de certificado, entramos en la pápublicación de aplicaciones de Google Play.

ps://play.google.com/apps/publishlsamos el botón Añadir nueva aplicación.

leccionamos El idioma

etederminado, el nombre de la aplicación y Subir APK.

este momento si tu aplicación va a ser de pago necesitarás una Licencia. La licencia para unaicación va asignada de forma individual para cada aplicación. Pulsamos el botón de Obtenerve de licencia.

Page 346: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 346/352

s mostrará un número de Clave de Licencia para la aplicación, y nos informa de que debemosluir el código binario en nuestraicación.254 Para realizar este paso tendremos que instalar en Android SDK Manager el LVLcense Verification Library). Desde Eclipse o desde los programas ejecutamos Android SDK 

anager y en extras buscamos e instalamos Google Market Licensing package.

ta: No es necesario incluir la Clave de Licencia en nuestra aplicación. Sirve para que no pueratear” nuestra aplicación.

proceso es un tanto complicado por lo que omitiremos este paso, la documentación de Googlee punto es críptica y poco clara. Por este motivo, continuaremos con la publicación de nuestraicación de pago sin incluir la Clave Licencia. Puede obtener la documentación de cómo incluEclipse y en su aplicación en la siguiente URL:p://developer.android.com/google/play/licensing/setting-up.html

Page 347: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 347/352

a vez subido el APK de nuestra aplicación, pulsamos la pestaña de Precios y Distribución.

remos que podemos marcar la aplicación De pago o Gratuita. Marcamos la casilla de “De pamprobamos el tipo de moneda, monedas e impuestos en determinados países, etc. Para distribtodos los países marcamos la casilla “Seleccionar todos los países”.

cluimos el precio en la casilla de Precio Predeterminado.veremos que aparece el botón Convertir preicos automáticamente, que pasará el precio a otraonedas.

arcamos las casillas de conocimiento de las leyes y directrices, así como también podemos opr Excluir mi aplicación de otros Stores de la competencia de Google.

lsamos Guardar.tenemos publicada nuestra aplicación de pago.

y que recordar que para incluir un código en nuestra aplicación, para impedir que la pirateendríamos que incluir la licencia dentro de nuestra aplicación.

Page 348: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 348/352

ogramación Android por Antonio Morales Carmona

Page 349: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 349/352

LOSARIO

LOSARIO

tivity ............................................................................................................ 16,20,30, etc.DK............................................................................................................................ 8, 210VD ...................................................................................................................... 4,9,10,128Sense................................................................................................................. 245,252Mob .................................................................................................................. 245-251licaciones de Pago ........................................................................................ 243,253-254droidManifiest ............................................................................................ 43,46,59, etc.tionBar........................................................................................................... 128,132-134armManager ....................................................................................174-176,189,225-231yncTask.............................................................................................................. 197-199pWidgetProvider ................................................................................... 217-224,228,230

se de Datos..............................................................................................84-88,92,97-101seAdapter...................................................................................................... 203,206-212oadcast .......................................................................................................... 171-183,189oadcast Receiver ........................................................................................... 171,177,183ckground ......................................................................................27,49,109,138-141,220

pa .......................................................................................... 16,31,40,47-49,104,etc.

S3................................................................................................................. 2,104,109257

alificadores........................................................................................................ 148-154

Page 350: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 350/352

DMS .................................................................................................................... 100,183awable............................................................................26-28,118,122,127-137,149,etc.

lipse ..........................................2-7,12,21,48,58,80,85,90,100,118,126,144,150,175,etc.plorador Proyectos............................................................................................ 172plorador Ficheros (File Explorer) ....................................................................... 100

e Explorer .......................................................................................................... 100cheros Secuenciales ............................................................................................. 73,79

ogle Play Store.............................................................................................. 234,243,245ogle AdSense .................................................................................................... 245,252ogle AdMob ...................................................................................................... 245-251

TML5................................................................................................................... 104,109los ...................................................................................................................... 191, 197

ndler.................................................................................................................. 191 258 Iomas.................................................................................................................. 144ageView ........................................................................................................ 149,210,217erface Eclipse...................................................................................................... 19

vascript............................................................................................................... 105-116ly Bean .............................................................................................................. 159K............................................................................................................................. 5-6

yout................................................................................................. 40,48,52,203,215,etc.gcat.................................................................................................................... 182tView ................................................................................................................. 203

enu..................................................................................................................... 123ultiidiomas ......................................................................................................... 144enu Contextual .................................................................................................. 137áquina Virtual Android .......................................................................................... 9,20259 Notificaciones ......................................................................................................... 46

tification.Builder............................................................................................... 156-167

Click..................................................................................................................... 32,etc.

ay Store .......................................................................................................... 234,243,245blicar aplicación ................................................................................................ 254

nnable ............................................................................................................... 195-196

bversion............................................................................................................... 43

Page 351: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 351/352

MS ....................................................................................................................... 118QLite ...................................................................................................................... 84-92rvicios ................................................................................................................ 184aredPreferences.................................................................................................. 64OnClickListener .................................................................................................. 30-31

DK ...........................................................................................................2-8,14,131-32,etc.

ast........................................................................................................................ 46

read ................................................................................................................ 191-197 260 Vstas/View ............................................................................................................. 54rsion .................................................................................................................... 43

dget................................................................................................................... 28,30,216ebView............................................................................................................... 104,253

ML ............................................................................................................. 26,55,57,64,etc.1 Anota tu Glosario

Page 352: Programación Android Paso a Paso - Antonio Morales Carmona

7/23/2019 Programación Android Paso a Paso - Antonio Morales Carmona

http://slidepdf.com/reader/full/programacion-android-paso-a-paso-antonio-morales-carmona 352/352

U GLOSARIO

262

263 O