Android – Introducción CatDroid – Jan. 2011 (por Roberto C. Serrano)
Acerca de mi <ul><li>Roberto C. Serrano </li></ul><ul><li>Ex-Motorolan (Ingeniero de Software y Developer Advocate. </li><...
En esta mini-presentación <ul><li>Introducción:  </li></ul><ul><li>Introducción al sistema operativo Android y sus peculia...
Introducción al sistema operativo Android y sus peculiaridades
Demo del shell de Android <ul><li>Android es casi un Linux  (pero con muchas peculiaridades) </li></ul><ul><li>http://code...
Openness y Android <ul><li>“ Android es la primera plataforma extensiva para electrónica movil.…” </li></ul><ul><li>Compon...
Android Applications <ul><li>Sin Licencia en la plataforma (http://android.git.kernel.org/) </li></ul><ul><ul><li>SMS mana...
Carácter. del Android SDK y Plataforma <ul><li>Open platform (no fees, no licensing) </li></ul><ul><li>Wi-fi hrdw. acess <...
Funcionalidad disponible <ul><li>Sistema Agnóstico al Hardware  (via el Kernel) </li></ul><ul><li>Background services </li...
El pastel de Android HAL CORE ANDROID + LIBRARIES HAL Multimedia / Graphics  TCMD MBM / Boot loader CONNECTIVITY USB BLUET...
El concepto de Activity en Android
Activities y Tasks <ul><li>Definición de Dan Morrill’s:   </li></ul><ul><ul><li>Una Actividad es como una molécula, un tro...
Activities y Tasks (cont.) <ul><li>Por defecto cada aplicación de Android vive en su mundo: </li></ul><ul><ul><li>Cada App...
Activities (continue)
Activities (continue)
Actividad frente a Tarea (apps) <ul><li>Una clase concreta en el API </li></ul><ul><li>Encapsula una operación particular ...
Process(a) esto... <ul><li>En que se parece un Android y un Linux? </li></ul><ul><ul><li>Android process == Linux process ...
Componentes de una App. en Android <ul><li>Content Providers : Una abstracción provista para representar cualquier informa...
Otros Componentes  <ul><li>Elementos Gráficos :  Menus, Dialogs, ListViews, ListActivity, Buttons, Widgets, Toast, etc. </...
Otros elementos a tu disposición  (lista no exhaustiva) <ul><li>Storage :  Puedes empaqueta ficheros de datos, para elemen...
Q&A
Android Básico <ul><li>Introducción:  </li></ul><ul><ul><li>Introducción a un Android Activity y los Componentes de una Ap...
La topografía del Proyecto de Android  (visto desde Eclipse)
Elementos “Automáticos” <ul><li>Porciones automáticas (gestionadas pro Eclipse y el ADT plugin). </li></ul><ul><li>Derecha...
Elem. generados  (pero no automáticos) <ul><li>Pantalla anterior: Manifest (* generado pero no automático), directorios y ...
El directorio res y R.class <ul><li>La clase R provee referencias (direcciones estáticas) a los objetos en binario que rep...
Android AVD y SDK Manager <ul><li>Virtual Devices: Gestión de todas las máquinas virtuales con diferentes perfiles que pod...
New Device <ul><li>Hardware -> New. Nos permite controlar algunos aspectos adicionales sobre el perfil de hardware a emula...
Hello World!! <ul><li>Creemos un proyecto nuevo. </li></ul><ul><li>Selecciona File > New > Android Project  </li></ul><ul>...
Project Properties Project Name Nombre del directorio donde guardaremos en el proyecto en el workspace de Eclipse Package ...
Finalmente:  Ejecutando Hello World! <ul><li>Siempre que le damos al botón de play (o Ctrl-F11) una configuración de ejecu...
Ejecutando H. World (Continua) <ul><li>Ya desde aquí le podemos  dar a Run.  </li></ul><ul><li>En ejecuciones  consecutiva...
Android Activity Life Cycle <ul><li>Una actividad tiene tres estados básicos </li></ul><ul><ul><li>La actividad esta en ej...
Android Activity Life Cycle (cont.) <ul><li>A medida que la actividad transita de un estado a otro, es notificada de los c...
Más sobre el Lifecycle! <ul><li>Estos siete métodos definen el ciclo entero de la vida de una actividad. Con tres bucles a...
Los estados
Guardando el estado de la Actividad <ul><li>Para capturar el estado antes de que una actividad sea cerrada la aplicación p...
Q&A
Los materiales de construcción básicos
Layouts, Containers y Widgets  <ul><li>Todos son views. </li></ul><ul><li>Todos tienen una representación en XML </li></ul...
El significado de @+id <ul><li>@+id/  es equivalente auna abreviación de el directorio ‘res/’ contenido en nuestro proyect...
Widgets AbsListView AbsSeekBar AbsSpinner AlphabetIndexer AnalogClock AutoCompleteTextView Button CheckBox CheckedTextView...
Widgets <ul><li>Un Widget es un objeto de tipo View que sirve como interfaz, estableciendo una conexión lógica entre eleme...
UI-Events <ul><li>Para capturar un evento tenemos dos maneras: </li></ul><ul><li>Definir un Listener y registrarlo con la ...
UI Events - Definiendo el Listener <ul><li>El listener de un evento es un interface de Java definido en la Vista de la cla...
Lista de eventos OnCreateContextMenu también está disponeble y lo veremos más tarde. Para ver más detalles mirar: http://d...
Conectando el Evento public   class  Ahora  extends  Activity implements  View.OnClickListener { Button  btn ; @Override p...
Conectando el Evento 2 public   class  NowRedux2  extends  Activity { Button btn; private  OnClickListener myBtnListener =...
Conectando el Evento public   class  Ahora  extends  Activity implements  View.OnClickListener { Button  btn ; @Override p...
Depurando e Informando al usuario <ul><li>Para hacer funciones de depurar, tenemos varias opciones: </li></ul><ul><ul><li>...
Depurando e Informando al usuario <ul><li>Para hacer funciones de depurar, tenemos varias opciones: </li></ul><ul><li>Ecli...
Log y logcat <ul><li>Android dispone de un buffer circular donde al que todos los programas puedes mandar contenido para c...
Raise a Toast <ul><li>Por otra banda Toast cumple una función gráfica en Android ya que se usa para proporcionar mensajes ...
Alert <ul><li>Alert es un diálogo modal que podemos usar para alertar al usuario y exigir su atención. </li></ul><ul><li>L...
Containers <ul><li>To arrange widgets with some flexibility we have a the following set of “Container” layouts: </li></ul>...
Linear Layout <ul><li>Alinea todos los hijos en una sola dirección.  </li></ul><ul><li>El atributo “orientation” determina...
Conceptos importantes para LinearLayout <ul><li>Orientation:  Determina si el layout es una columna o una fila. </li></ul>...
Table Layout <ul><li>TableLayout posicionas sus hijos en filas y columnas.  </li></ul><ul><li>No dibuja bordes entre las f...
Conceptos importantes para TableLayout <ul><li>Podemos intercalar TableRow con otros tipos de views.  Cuando hacemos esto ...
Relative Layout <ul><li>Permite a las vistas hijas definir su posición relativa a su padre o entre ellas, especificado el ...
Conceptos Importantes para RelativeLayout <ul><li>Propiedades para “relative to container”. </li></ul><ul><li>Propiedades ...
ScrollView <ul><li>Es un contenedor que provee de un mecanismo de scrolling para el contenido de cualquier layout. </li></...
ViewGroup, etc <ul><li>Si lo anterior no resulta suficientemente flexible se puede crear una clase que herede de ViewGroup...
Adapter View <ul><li>La clase AdapterView es una subclase de ViewGroup cuyas vistas hijas son decididas por un Adaptador q...
Usando un ArrayAdapter <ul><li>Array Adapter tiene tres parámetros: </li></ul><ul><ul><li>El contexto (típicamente la inst...
Creando un menu de contexto <ul><li>// Igual que el ejemplo de antes </li></ul><ul><li>@Override </li></ul><ul><li>public ...
Q&A
A propósito de recursos <ul><li>Los siguientes recursos están disponibles para la inclusión de elementos estáticos en nues...
Strings <ul><li>Strings pueden almacenar todos los datos textuales de nuestra aplicación (etiquetas, mensages, etc.) </li>...
Intents – Cual es tu “Intentción”
Intro. <ul><li>Intents son mensajes de sistema que notifican aplicaciones de vaios eventos:  </li></ul><ul><li>Activity ev...
Intents – Descripción <ul><li>Actividades, servicios, broadcast receiver todos usan intents para empezar (ser disparados)....
Intent – El objeto <ul><li>Component name:  Quien gestiona el Intent?  Es el nombre de una clase (FullyQualified class nam...
Intent Filter <ul><li>Expone la funcionalidad de un componente </li></ul><ul><li>Usado durante la instalación y arranque. ...
Filter II <ul><li>Action Test </li></ul><ul><ul><li>TAKE_PICTURE </li></ul></ul><ul><ul><li>Intent sin acción siempre acep...
Filter III <ul><li>Category test: </li></ul><ul><ul><li>CATEGORY_BROWSABLE </li></ul></ul><ul><ul><li>Todas las categorías...
Intent Resolution <ul><li>Dos tipos de Intents: </li></ul><ul><ul><li>Intents Explicitos:  nombran el componente a ejecuta...
Lanzando un Intent <ul><li>4 maneras: </li></ul><ul><ul><li>startActivity() </li></ul></ul><ul><ul><li>startActivityForRes...
Q&A
The Manifest <ul><li>La función principal es la de actuar como nexo entre el sistema de Android y tu Aplicación: </li></ul...
Application – el corazón del Manifest, el corazón de la App. <ul><li>Intent-Filter define los tipos de acciones que nuestr...
BroadcastReceiver <ul><li>La respuesta a SendBroadcast. </li></ul><ul><li>Clase muy sencilla con un método onRecive(Contex...
Upcoming SlideShare
Loading in...5
×

Intro. a Android Instituto Bosc de la Coma en Olot

4,228
-1

Published on

Intro. a Android Instituto Bosc de la Coma en Olot.

Intro y elementos de construcción básicos de una app.

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,228
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
140
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Intro. a Android Instituto Bosc de la Coma en Olot

  1. 1. Android – Introducción CatDroid – Jan. 2011 (por Roberto C. Serrano)
  2. 2. Acerca de mi <ul><li>Roberto C. Serrano </li></ul><ul><li>Ex-Motorolan (Ingeniero de Software y Developer Advocate. </li></ul><ul><li>Desarrollador de Android </li></ul><ul><li>Responsible desarrollo dispoitivos móviles para Addapta Technological Services </li></ul><ul><li>Co-fundador de la comunida CatDroid </li></ul><ul><li>Fundador de los grupos Chicago Androids y Barcelona Androides </li></ul><ul><li>Info de Contacto: </li></ul><ul><ul><li>[email_address] o twitter.com/hojalataverde </li></ul></ul>
  3. 3. En esta mini-presentación <ul><li>Introducción: </li></ul><ul><li>Introducción al sistema operativo Android y sus peculiaridades </li></ul><ul><li>Introducción a un Android Activity y los Componentes de una Applicación </li></ul>
  4. 4. Introducción al sistema operativo Android y sus peculiaridades
  5. 5. Demo del shell de Android <ul><li>Android es casi un Linux (pero con muchas peculiaridades) </li></ul><ul><li>http://code.google.com/p/android-vnc/ </li></ul><ul><li>Get fbvncserver binary </li></ul><ul><li>Load it into the phone/emulator: </li></ul><ul><li>adb push fbvncserver /data/local  </li></ul><ul><li>adb shell chmod 777 /data/local/fbvncserver </li></ul><ul><li>adb forward tcp:5901 tcp:5901 </li></ul><ul><li>Run the vnc server: </li></ul><ul><li>adb shell /data/local/fbvncserver </li></ul>
  6. 6. Openness y Android <ul><li>“ Android es la primera plataforma extensiva para electrónica movil.…” </li></ul><ul><li>Componentes: </li></ul><ul><ul><li>Una referencia de diseño de de hrdw que describe los requisitos mínimos para dar soporte a la plataforma. </li></ul></ul><ul><ul><li>Linux Kernel </li></ul></ul><ul><ul><li>Librerias Open Source a </li></ul></ul><ul><ul><li>Run time environment (Dalvik) </li></ul></ul><ul><ul><li>Framework para aplicaciones </li></ul></ul><ul><ul><li>Un framework para interface de usuario </li></ul></ul><ul><ul><li>Un paqueta de aplicaciones preinstaladas (un telefono inteligente 100% funcional) </li></ul></ul><ul><ul><li>Un kit de desarrollo (Tools, plug-ins, and documentation) </li></ul></ul>
  7. 7. Android Applications <ul><li>Sin Licencia en la plataforma (http://android.git.kernel.org/) </li></ul><ul><ul><li>SMS management app. </li></ul></ul><ul><ul><li>PIM (Google calendar, etc) </li></ul></ul><ul><ul><li>WebKit based browser </li></ul></ul><ul><ul><li>Cliente de Mail POP3 </li></ul></ul><ul><ul><li>Instant Messaging Client (GChat) </li></ul></ul><ul><ul><li>Music Player and Picture viewer </li></ul></ul><ul><li>Con Licencia: </li></ul><ul><ul><li>Android Market Place </li></ul></ul><ul><ul><li>App. Google Maps y navegación </li></ul></ul><ul><ul><li>Cliente eMail(GMail) </li></ul></ul><ul><li>Etc. </li></ul>
  8. 8. Carácter. del Android SDK y Plataforma <ul><li>Open platform (no fees, no licensing) </li></ul><ul><li>Wi-fi hrdw. acess </li></ul><ul><li>Full comm. stack (GSM, EDGE, 3G, Bluetooth) </li></ul><ul><li>GPS </li></ul><ul><li>Multimedia (playback and recording of audio, video, etc) </li></ul><ul><li>APIs to accel. And compass hrdwr. </li></ul><ul><li>IPC messaging </li></ul><ul><li>Share Data stores </li></ul><ul><li>Web-Kit browser </li></ul><ul><li>Eventually hwrd. accel. 3D graphics (Open GL ES) </li></ul><ul><li>Media Libraries (Licensed for MP3, etc…) </li></ul><ul><li>And open Application Framework (reuse and replacement) </li></ul>
  9. 9. Funcionalidad disponible <ul><li>Sistema Agnóstico al Hardware (via el Kernel) </li></ul><ul><li>Background services </li></ul><ul><li>SQLite DB </li></ul><ul><li>Comunicación entre applicaciones </li></ul><ul><li>Incluye Soporte multimedia </li></ul><ul><li>Sistema de optimización de Mem. y gestión de Procesos </li></ul><ul><li>Busqueda rápida desde 1.6 </li></ul><ul><li>Sintetizador de voz desde 1.6 </li></ul><ul><li>Gestión Transparente o intencionada de de múltiples resoluciones desde 1.6 </li></ul><ul><li>API de Blutooth desde 2.0 </li></ul><ul><li>Gestión centralizada de contactos desde 2.0 </li></ul><ul><li>Live WallPapers desde 2.0 </li></ul><ul><li>Reconocimiento de voz desde 2.1 </li></ul><ul><li>navegación desde 2.1 </li></ul><ul><li>Mensajes de la Nube al teléfono (Push) desde 2.2 </li></ul><ul><li>Apps instalables en memoria externa (SD) desde 2.2 </li></ul><ul><li>NFC desde 2.3 </li></ul><ul><li>Internet Telephony (SIP protocol desde 2.3 </li></ul>
  10. 10. El pastel de Android HAL CORE ANDROID + LIBRARIES HAL Multimedia / Graphics TCMD MBM / Boot loader CONNECTIVITY USB BLUETOOTH Wi-Fi CONNECTIVITY MODEM + RIL KERNEL+BSP GPS
  11. 11. El concepto de Activity en Android
  12. 12. Activities y Tasks <ul><li>Definición de Dan Morrill’s:   </li></ul><ul><ul><li>Una Actividad es como una molécula, un trozo cuantificable de funcionalidad. </li></ul></ul><ul><ul><li>Una tarea es una collección de actividades (parte una o multiples aplicaciones) </li></ul></ul><ul><ul><li>Un proceso en Android es un “proceso” estandard de Linux </li></ul></ul>
  13. 13. Activities y Tasks (cont.) <ul><li>Por defecto cada aplicación de Android vive en su mundo: </li></ul><ul><ul><li>Cada Applicación se ejecuta en su propio proceso por defecto </li></ul></ul><ul><ul><li>Cada proceso se ejecuta dentro de su propia máquina virtual </li></ul></ul><ul><ul><li>Cada aplicación recive su Linux User ID </li></ul></ul>
  14. 14. Activities (continue)
  15. 15. Activities (continue)
  16. 16. Actividad frente a Tarea (apps) <ul><li>Una clase concreta en el API </li></ul><ul><li>Encapsula una operación particular </li></ul><ul><li>Se ejecuta en el Proceso del .APK que las instaló </li></ul><ul><li>Opcionalmente asociadas con su ventana (UI) </li></ul><ul><li>Es el contexto de ejecución del APK </li></ul><ul><li>Es más una noción que una parte del API </li></ul><ul><li>Collección de Actividades relaccionas </li></ul><ul><li>Capaz de extenderse a múltiples APKs y procesos </li></ul><ul><li>Asociado con su propio “history stack” </li></ul><ul><li>Son lo que los usuarios de otras plataformas entiende como “aplicaciones” </li></ul>
  17. 17. Process(a) esto... <ul><li>En que se parece un Android y un Linux? </li></ul><ul><ul><li>Android process == Linux process (con su unico UID) </li></ul></ul><ul><ul><li>Por defecto, 1 proceso por APK </li></ul></ul><ul><ul><li>Por defecto, 1 hilo (thread) por proceso </li></ul></ul><ul><ul><li>La mayoría de los componente conectan eventos via el hilo principal. </li></ul></ul>
  18. 18. Componentes de una App. en Android <ul><li>Content Providers : Una abstracción provista para representar cualquier información (data) almacenada en el aparato y a la que necesitan acceso múltiples aplicaciones. </li></ul><ul><li>Services : Unidad de ejecución provista para que sobreviva más allá de una actividad. Pueden ser ejecutados como parte o independientemente de una actividad. </li></ul><ul><li>Intents : Mortero que una el resto de los componentes. Mensajes de sistema que transmiten eventos representado cambios de estado en el hardware, acciones, etc. </li></ul><ul><li>Broadcast Receivers : Los consumidores de los Intents. Registrando tu app. como un broadcast reciever le estas dando a la aplicación la habilidad de consumir Intents que coinciden con un criterio de filtrado específico. </li></ul><ul><li>Notifications : El framework de notificación a usuarios permite que un Servicio o aplicación comunique con el usuario sin interrumpir su flujo de trabajo. </li></ul>
  19. 19. Otros Componentes <ul><li>Elementos Gráficos : Menus, Dialogs, ListViews, ListActivity, Buttons, Widgets, Toast, etc. </li></ul><ul><li>Persistent Storage : Sistema de almacenamiento simplificado útil para persistir información de una sesión a otra (usado principalmente para almacenar preferencias). </li></ul><ul><li>Async Tasks : Además de el método tradicional de java para crear hilos, Android provee de esta clase útil para envolver tareas pesadas para que no interfieran con la experiencia del usuario. </li></ul><ul><li>WebViewClient : Estructura disponible para que una aplicación pueda mostrar contenido Web (basado en WebKit). </li></ul><ul><li>PreferenceActivity : Permite la creación de Actividades de Ajustes (settings) y persistencia de los datos de manera simplificada. </li></ul><ul><li>HTTPClient : Estructura provista para la adquisición de datos desde un servidor web (útil para extrar objetos json o xml). </li></ul><ul><li>MapView Activit y: Estructura que permite hacer uso de la infraestructura de Google Maps desde una aplicación. </li></ul>
  20. 20. Otros elementos a tu disposición (lista no exhaustiva) <ul><li>Storage : Puedes empaqueta ficheros de datos, para elementos estáticos, como iconos, cadenas de texto, arrays, etc. Se puede obtener espacio en la base de datos (SQLite) y en la memoria principal, o si el usuario provee de tarjeta SD, también se puede usar para almacenar todo ello para almacenar elementos generados de manera dinámica (o descargados de internet). </li></ul><ul><li>Network : Desde Java Sockets (via NIO) a pantallas que contengan un navegador, Android provee de un montón de mecanismos para aprovechar la accesibilidad a Internet. </li></ul><ul><li>Multimedia : Desde la lógica de una aplicación se puede incluir la reproducción y grabación de Audio y vídeo así como la de captura de imágenes (fotos). </li></ul><ul><li>GPS : Aparatos estandarizados de Android tienen la habilidad de reportar la ubicación (con diferentes niveles de granularidad). Además usando google maps, se pueden mostrar mapas, etc. </li></ul><ul><li>Phone Services : Una aplicación de android puede hacer uso de los servicios de telefonía, permitiendo el iniciar llamadas, enviar SMS, etc. </li></ul>
  21. 21. Q&A
  22. 22. Android Básico <ul><li>Introducción: </li></ul><ul><ul><li>Introducción a un Android Activity y los Componentes de una Applicación </li></ul></ul><ul><li>Lo básico: </li></ul><ul><ul><li>La topografía de un proyecto de Android (visto desde Eclipse) </li></ul></ul><ul><ul><li>Life Cycle s de una aplicación Android. </li></ul></ul><ul><ul><li>Layouts, Containers y Widgets </li></ul></ul><ul><ul><li>Intents </li></ul></ul><ul><ul><li>Manejando Inputs (Events): </li></ul></ul><ul><ul><li>TouchEvents </li></ul></ul><ul><ul><li>Key events </li></ul></ul><ul><ul><li>El manifest.xml </li></ul></ul><ul><ul><li>Debugging </li></ul></ul><ul><ul><li>Etc... </li></ul></ul>
  23. 23. La topografía del Proyecto de Android (visto desde Eclipse)
  24. 24. Elementos “Automáticos” <ul><li>Porciones automáticas (gestionadas pro Eclipse y el ADT plugin). </li></ul><ul><li>Derecha: R class and the android library (no se toca...) </li></ul>
  25. 25. Elem. generados (pero no automáticos) <ul><li>Pantalla anterior: Manifest (* generado pero no automático), directorios y esqueleto de nuestra aplicación. </li></ul><ul><li>Izquierda aquí: src, donde tus clases (código de la App reside) </li></ul><ul><li>Derecha: Resources (recursos), recursos estáticos que constituyen nuestra App. Todos estos recursos son “precompilados” en la clase R </li></ul>
  26. 26. El directorio res y R.class <ul><li>La clase R provee referencias (direcciones estáticas) a los objetos en binario que representan el directorio res. (layout, strings, media, etc.) </li></ul><ul><li>De esta manera, estos recursos pueden ser referenciados una vez son “inflados”. </li></ul><ul><li>En el caso de los layouts, cuando desde onCreate llamamos el método setContentView(int layoutResId) el layout.xml que representa la estructura del layout es inflado y referenciado. </li></ul><ul><li>Una vez es posible referenciar, podemos establecer conexiones entre objetos de Java y su representación en el Layout mediante la función findViewById(int resId). </li></ul>
  27. 27. Android AVD y SDK Manager <ul><li>Virtual Devices: Gestión de todas las máquinas virtuales con diferentes perfiles que podemos crear para gestionar las diferentes configuraciones que deseamos testear </li></ul><ul><li>Available Packages: Nos permite gestionar los repositorios donde obtener los paquetes. </li></ul>
  28. 28. New Device <ul><li>Hardware -> New. Nos permite controlar algunos aspectos adicionales sobre el perfil de hardware a emular. </li></ul>
  29. 29. Hello World!! <ul><li>Creemos un proyecto nuevo. </li></ul><ul><li>Selecciona File > New > Android Project </li></ul><ul><li>Vamos a rellenar los detalles del proyecto: </li></ul><ul><li>Pon HelloWorld como Project Name </li></ul><ul><li>Selecciona “Create new project in workspace” </li></ul><ul><li>Entra helloworl in App name. </li></ul><ul><li>Entra com.materiales.intro in Package Name </li></ul><ul><li>Enter HelloActiviy in Activity name y adelante... </li></ul>
  30. 30. Project Properties Project Name Nombre del directorio donde guardaremos en el proyecto en el workspace de Eclipse Package Name Este es el paquete o namespace (alcance) en el que quieres que tu código exista. Las mismas reglas que en java aplican. El nombre de tu paquete tiene que ser único en tu sistema (teléfono), por eso es relativamente importante incluir nombres que siguen el estilo de los dominios como “com.isoco.departamente” Activity Name Nombre que le vamos a dar a la clase que el API generará y heredará de Activity. Application Name This is the human-read Título de nuestra aplicación. able title for your application.
  31. 31. Finalmente: Ejecutando Hello World! <ul><li>Siempre que le damos al botón de play (o Ctrl-F11) una configuración de ejecución se usa para determinar los parámetros de ejecución. </li></ul><ul><li>Para ajustar esos parámetros ve a Run Configurations (derecha). </li></ul>
  32. 32. Ejecutando H. World (Continua) <ul><li>Ya desde aquí le podemos dar a Run. </li></ul><ul><li>En ejecuciones consecutivas podemos usar el icono de 'play' de color verde o ctrl-F11. </li></ul><ul><li>Elige Android Project </li></ul><ul><li>Y a esperar... </li></ul>
  33. 33. Android Activity Life Cycle <ul><li>Una actividad tiene tres estados básicos </li></ul><ul><ul><li>La actividad esta en ejecución y ocupa el primer plano. </li></ul></ul><ul><ul><li>Esta pausada pero todavía es visible al usuario (no está enfocada). *Kill. </li></ul></ul><ul><ul><li>Esta parada y en segundo plano no visible al usuario. *Kill2. </li></ul></ul>
  34. 34. Android Activity Life Cycle (cont.) <ul><li>A medida que la actividad transita de un estado a otro, es notificada de los cambios por el OS recibiendo llamadas a los siguientes métodos: </li></ul><ul><ul><li>void onCreate(Bundle savedInstanceState) </li></ul></ul><ul><ul><li>void onStart() </li></ul></ul><ul><ul><li>void onRestart() </li></ul></ul><ul><ul><li>void onResume() </li></ul></ul><ul><ul><li>void onPause() </li></ul></ul><ul><ul><li>void onStop() </li></ul></ul><ul><ul><li>void onDestroy() </li></ul></ul>
  35. 35. Más sobre el Lifecycle! <ul><li>Estos siete métodos definen el ciclo entero de la vida de una actividad. Con tres bucles anidados, puedes monitorizar el ciclo de una de las siguientes maneras: </li></ul><ul><li>Entre onCreate y onDestroy(). Transfondo (Background). </li></ul><ul><li>Entre onStart() y onStop(). Visible. </li></ul><ul><li>Entre onResume() y onPause(). Primer Plano (Foreground). </li></ul><ul><li>Leyenda: Óvalos de color representan estados principales. Cuadrados representa los métodos “call back” que puedes refinar (override) en tu actividad para capturar las transiciones entre estados. </li></ul>
  36. 36. Los estados
  37. 37. Guardando el estado de la Actividad <ul><li>Para capturar el estado antes de que una actividad sea cerrada la aplicación puede implementar onSaveInstanceState(). </li></ul><ul><li>El método Recibe un objeto Bundle en la que el usuario puede almacenar el estado el estado antes de que la actividad sea vulnerable a ser destruida, usando pares nombre-valor. </li></ul><ul><li>Este Bundle es pasado de vuelta al método onCreate cuando la actividad es abierta de nuevo. </li></ul><ul><li>El método no es llamado cuando la actividad es cerrada por la lógica del programa o cuando el usuario pulsa “back” (presuntamente cerrando la actividad de manera expresa). </li></ul>
  38. 38. Q&A
  39. 39. Los materiales de construcción básicos
  40. 40. Layouts, Containers y Widgets <ul><li>Todos son views. </li></ul><ul><li>Todos tienen una representación en XML </li></ul><ul><li>La caja de la izquierda contiene quizás el ejemplo más básico: </li></ul><ul><li>En este ejemplo el Botón es elemento Raiz de nuestro XML, donde normalmente tendríamos un contenedor. </li></ul><ul><li>Contenedores espacian una colección de widgets (o contenedores hijos) en un área específica. </li></ul><?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> <Button xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; android:id=&quot;@+id/button&quot; android:text=&quot;&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;fill_parent&quot;/>
  41. 41. El significado de @+id <ul><li>@+id/ es equivalente auna abreviación de el directorio ‘res/’ contenido en nuestro proyecto </li></ul><ul><li>Cualquier elemento que necesite ser referenciado desde Java necesita un id '@+id/button'. El texto después de la barra se convertirá el identificador único para el elemento. </li></ul><ul><li>La Implementación por defecto de onSaveInstanceState() almacenará todos los campos que estén marcados por (@+id). </li></ul>
  42. 42. Widgets AbsListView AbsSeekBar AbsSpinner AlphabetIndexer AnalogClock AutoCompleteTextView Button CheckBox CheckedTextView DatePicker Chronometer CompoundButton DigitalClock EditText ExpandableListView Gallery GridView HorizontalScrollView ImageButton ImageSwitcher Scroller ScrollView SeekBar SlidingDrawer Spinner TabHost TableLayout TableRow TabWidget TextSwitcher ImageView ListView MediaController MultiAutoCompleteTextView PopupWindow ProgressBar QuickContactBadge RadioButton RadioGroup RatingBar RemoteViews TextView TimePicker Toast ToggleButton TwoLineListItem VideoView ZoomButton ZoomButtonsController ZoomControls
  43. 43. Widgets <ul><li>Un Widget es un objeto de tipo View que sirve como interfaz, estableciendo una conexión lógica entre elementos gráficos y eventos, de manera que el usuario pueda interactuar con la aplicación. </li></ul><ul><li>Pero, tampoco estás limitado a los widgets que te provee la plataforma y puedes crear los tuyos propios: http://developer.android.com/guide/topics/ui/custom-components.html </li></ul>
  44. 44. UI-Events <ul><li>Para capturar un evento tenemos dos maneras: </li></ul><ul><li>Definir un Listener y registrarlo con la vista (efectivamente manejando el evento desde la clase que esta “inflando” la vista). El ejemplo que nos concierne ahora. </li></ul><ul><li>Override el callback de una clase existente del tipo view (manejando el evento desde la clase que define el view). </li></ul>
  45. 45. UI Events - Definiendo el Listener <ul><li>El listener de un evento es un interface de Java definido en la Vista de la clase concerniente y que contiene un simple callback. Este método será llamado por el framework de Android cundo el listener ha sido registrado desde la vista y el usuario interactua con el elemento en el Interfaz (o el botón físico). </li></ul><ul><li>Los pasos a seguir son los siguientes: </li></ul><ul><ul><li>La clase necesita implementar View.OnClickListener </li></ul></ul><ul><ul><li>Registra tu calse para que sea “callback” cuando un evento concreto es disparado, usando los setOn<…> methods </li></ul></ul><ul><ul><li>Define un on<…> method in your class </li></ul></ul><ul><li>Hay dos maneras más de establecer la conexión entre nuestra clase y los eventos de los widgets… Luego les echamos un vistazo. </li></ul>
  46. 46. Lista de eventos OnCreateContextMenu también está disponeble y lo veremos más tarde. Para ver más detalles mirar: http://developer.android.com/guide/topics/ui/ui-events.html Register Listener Call Back Source More info. View.setOnClickListener( listener ) onClick() View.OnClickListener() Usuario toca el elemento (durante touchmode), o enfoca con las teclas de navegación ot trackball y p Para capturar un evento tenemos dos maneras: Definir un Listener y registrarlo con la vista (efectivamente manejando el evento desde la clase que esta “inflando” la vista). El ejemplo que nos concierne ahora. Override el callback de una clase existente del tipo view (manejando el evento desde la clase que define el view). ulsa enter o el trackball. View.setOnLongClickListener( listener ) onLongClick() View.OnLongClickListener() Usuario toca y mantiene la pulsación en elemento (durante touchmode), o enfoca y pulsa con enter o el trackball (durante un segundo). View.setOnFocusChangeListener( listener ) OnFocusChange() View.OnFocusChangeListener() Usuario navega al elemento o se marcha (usando las teclas de navegación o trackball). View.setOnKey( listener ) OnKey() View.OnKeyListener() Usuario enfoca en elemento o y User is focused on the item and presses or releases a key on the device View.setOnTouch( listener ) OnTouch() View.OnTouchListener() Usuario realiza un acción de tipo touch, incluyendo pulsar, solta, o cualquier gesto en la pantalla dentro de las coordenadas que componen el elemento en cuestión.
  47. 47. Conectando el Evento public class Ahora extends Activity implements View.OnClickListener { Button btn ; @Override public void onCreate (Bundle icicle ) { super.onCreate( icicle ); setContentView(R.layout.main); btn=(Button)findViewById(R.id.button); btn.setOnClickListener(this); updateTime(); } public void onClick(View view) { updateTime(); } }
  48. 48. Conectando el Evento 2 public class NowRedux2 extends Activity { Button btn; private OnClickListener myBtnListener = new OnClickListener() { public void onClick(View v) { updateTime(); } }; @Override public void onCreate(Bundle icicle) { super .onCreate(icicle); setContentView(R.layout. main ); btn=(Button)findViewById(R.id. button ); btn.setOnClickListener(myBtnListener); updateTime(); } private void updateTime() { btn.setText( new Date().toString()); } } public class NowRedux3 extends Activity { Button btn; @Override public void onCreate(Bundle icicle) { super .onCreate(icicle); setContentView(R.layout. main ); btn=(Button)findViewById(R.id. button ); btn.setOnClickListener( new View.OnClickListener() { public void onClick(View v){ updateTime(); } }); } private void updateTime() { btn.setText( new Date().toString()); } } public class NowRedux2 extends Activity { Button btn; private OnClickListener myBtnListener = new OnClickListener() { public void onClick(View v) { updateTime(); } }; @Override public void onCreate(Bundle icicle) { super .onCreate(icicle); setContentView(R.layout. main ); btn=(Button)findViewById(R.id. button ); btn.setOnClickListener(myBtnListener); updateTime(); } private void updateTime() { btn.setText( new Date().toString()); } } public class NowRedux3 extends Activity { Button btn; @Override public void onCreate(Bundle icicle) { super .onCreate(icicle); setContentView(R.layout. main ); btn=(Button)findViewById(R.id. button ); btn.setOnClickListener( new View.OnClickListener() { public void onClick(View v){ updateTime(); } }); } private void updateTime() { btn.setText( new Date().toString()); } }
  49. 49. Conectando el Evento public class Ahora extends Activity implements View.OnClickListener { Button btn ; @Override public void onCreate (Bundle icicle ) { super.onCreate( icicle ); setContentView(R.layout.main); btn=(Button)findViewById(R.id.button); btn.setOnClickListener(this); updateTime(); } public void onClick(View view) { updateTime(); } }
  50. 50. Depurando e Informando al usuario <ul><li>Para hacer funciones de depurar, tenemos varias opciones: </li></ul><ul><ul><li>Eclipse Breakpoints, y usar DDMS (más tarde lo veremos con más detenimiento) </li></ul></ul><ul><ul><li>Podemos mostrar el contenido de variables via LOG (logcat) y via Toast. </li></ul></ul><ul><li>Y en relacción a Toast...también podemos crear Alerts (ventanas modales)... </li></ul>
  51. 51. Depurando e Informando al usuario <ul><li>Para hacer funciones de depurar, tenemos varias opciones: </li></ul><ul><li>Eclipse Breakpoints, y usar DDMS (más tarde lo veremos con más detenimiento) </li></ul><ul><li>Podemos mostrar el contenido de variables via LOG (logcat) y via Toast. </li></ul><ul><li>Y en relacción a Toast...también podemos crear Alerts (ventanas modales)... </li></ul>
  52. 52. Log y logcat <ul><li>Android dispone de un buffer circular donde al que todos los programas puedes mandar contenido para crear un log. </li></ul><ul><li>En cualquier momento se puede acceder a este log usando adb logcat o la vista de ddms de Eclipse. </li></ul><ul><li>Para mandar contenido usamos los métodos: </li></ul><ul><ul><li>Log.v() Log.d() Log.i() Log.w() and Log.e() </li></ul></ul><ul><li>Todos siguen este formato más o menos: </li></ul><ul><ul><li>Log.v(TAG, &quot;index=&quot; + i); </li></ul></ul><ul><li>Es buena práctica definir TAG para nuestro activity: </li></ul><ul><ul><li>private static final String TAG = &quot;MyActivity&quot;; </li></ul></ul>
  53. 53. Raise a Toast <ul><li>Por otra banda Toast cumple una función gráfica en Android ya que se usa para proporcionar mensajes al usuario que son transitivos y no interactivos. </li></ul><ul><li>Toast pueden también estar compuestos por views complejos, pero lo normal es que sean texto. </li></ul><ul><li>Usando Toast es bastante sencillo: </li></ul><ul><li>Toast </li></ul><ul><li>.makeText(this, &quot;<clink, clink>&quot;, Toast.LENGTH_SHORT) </li></ul><ul><li>.show(); </li></ul>
  54. 54. Alert <ul><li>Alert es un diálogo modal que podemos usar para alertar al usuario y exigir su atención. </li></ul><ul><li>La forma más fácil de construir un diálogo modal es usar la clase Builder: </li></ul><ul><ul><li>setMessage(): establece el mensaje desde un String o ID de un recurso tipo string </li></ul></ul><ul><ul><li>setTitle() and setIcon(), para configurar el texto o icono que a de apareceren la barra de título </li></ul></ul><ul><ul><li>setPositiveButton(), setNeutralButton(), setNegativeButton(), indica que botones han de aparecer en la parte de abajo de la ventan de diálogo y su posición respectivamente (izquierda, centro y derecha respectivamente), que texto debería contener, y el evento que debería ser llamado aparte de cerrar la ventana de diálogo. </li></ul></ul><ul><li>new android.app.AlertDialog.Builder( this ) </li></ul><ul><li>.setTitle(&quot;MessageDemo&quot;) </li></ul><ul><li>.setMessage(&quot;eek!&quot;) </li></ul><ul><li>.setNeutralButton(&quot;Close&quot;, new DialogInterface.OnClickListener() { </li></ul><ul><li>public void onClick(DialogInterface dlg, int sumthin) { </li></ul><ul><li>// do nothing – it will close on its own </li></ul><ul><li>} </li></ul><ul><li>}) </li></ul><ul><li>.show(); </li></ul>
  55. 55. Containers <ul><li>To arrange widgets with some flexibility we have a the following set of “Container” layouts: </li></ul><ul><ul><li>FrameLayout: simplest type of layout object. It's basically a blank space on your screen that you can later fill with a single object — for example, a picture that you'll swap in and out. All child elements of the FrameLayout are pinned to the top left corner of the screen; you cannot specify a different location for a child view. Subsequent child views will simply be drawn over previous ones, partially or totally obscuring them. </li></ul></ul><ul><ul><li>LinearLayout </li></ul></ul><ul><ul><li>TableLayout </li></ul></ul><ul><ul><li>RelativeLayout </li></ul></ul><ul><ul><li>View Groups (all of the above plus a few more such us: spinner, SurfaceView, TabHost, etc.) </li></ul></ul>
  56. 56. Linear Layout <ul><li>Alinea todos los hijos en una sola dirección. </li></ul><ul><li>El atributo “orientation” determina si los objetos son alineado vertical o horizontalmente. </li></ul><ul><li>Respeta los márgenes entre los hijos el atributo “gravity” (right, center, or left) de cada uno de los hijos. </li></ul><ul><li>También tiene la habilidad de asignar pesos (weight) a cada hijo individual y usar este atributo para determinar como el conjunto se expandirá y usara el espacio proporcionado por el contenedor. </li></ul><ul><li>Example linear_layout_8.xml from ApiDemos </li></ul><ul><li><FrameLayout xmlns:android= &quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;fill_parent&quot; </li></ul><ul><li>android:padding= &quot;30dip&quot; > </li></ul><ul><li><LinearLayout </li></ul><ul><li>android:id= &quot;@+id/layout&quot; </li></ul><ul><li>android:orientation= &quot;vertical&quot; </li></ul><ul><li>android:background= &quot;@drawable/blue&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;fill_parent&quot; </li></ul><ul><li>android:padding= &quot;30dip&quot; > </li></ul><ul><li><TextView </li></ul><ul><li>android:background= &quot;@drawable/box&quot; </li></ul><ul><li>android:layout_width= &quot;wrap_content&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:text= &quot;@string/linear_layout_8_c&quot; /> </li></ul><ul><li><TextView </li></ul><ul><li>android:background= &quot;@drawable/box&quot; </li></ul><ul><li>android:layout_width= &quot;wrap_content&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:text= &quot;@string/linear_layout_8_b&quot; /> </li></ul><ul><li><TextView </li></ul><ul><li>android:background= &quot;@drawable/box&quot; </li></ul><ul><li>android:layout_width= &quot;wrap_content&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:text= &quot;@string/linear_layout_8_c&quot; /> </li></ul><ul><li></LinearLayout> </li></ul><ul><li></FrameLayout> </li></ul>
  57. 57. Conceptos importantes para LinearLayout <ul><li>Orientation: Determina si el layout es una columna o una fila. </li></ul><ul><li>Fill Model: Si las dimensiones del conjunto de elementos dentro de los diferentes elementos del LinearLayout son dispares, necesitamos un comportamiento para determinar el relleno dándole un valos a layout_width and layout_height. Estas propiedades tienen las siguientes opciones: </li></ul><ul><ul><li>Tamaño específico </li></ul></ul><ul><ul><li>fill_parent. </li></ul></ul><ul><ul><li>wrap_content. </li></ul></ul><ul><li>Weight: Permite que uno o más elementos del layout se lleven el espacio “restante” siguiendo un criterio de pesos. El peso por defecto es zero. Si queremos que un elemento ocupe el doble que otro, le damos peso 2 y al otro peso 1. </li></ul><ul><li>Gravity: Por defecto todo es “left and top” aligned, de manera que si creamos una columna, los hijos se alinearan a la izquierda. Pero tenemos las siguientes opciones para columnas: left, right, center-horizontal. Y para una fila podemos variar el base line para hacerlos center-vertical. </li></ul><ul><li>Padding: android:padding nos permite añadir un margen de manera consistente alrededor del widget. Si queremos hacerlo de manera dispar podemoa usar android:paddingLeft, android:paddingRight, android:paddingTop y android:paddingBottom </li></ul>
  58. 58. Table Layout <ul><li>TableLayout posicionas sus hijos en filas y columnas. </li></ul><ul><li>No dibuja bordes entre las filas y columnas o celdas (es posicionamiento) </li></ul><ul><li>La tabla tendrá tantas columnas como la fila con más celdas. </li></ul><ul><li>Una tabla puede dejar celdas vacías, pero celdas no puede “span” múltiples columnas. Pero si puedes tener un hijo que expanda múltiples columnas. </li></ul><ul><li>Los objetos TableRow son Views hijas de TableLayout ( cada TableRow define una sola fila en la tabla). </li></ul><ul><li>Cada Row tiene cero o mas celdas, cada una está definida por cualquier tipo de vista. De esta manera, las celdas de una fila se componen de una variedad de objetos de tipo View, como ImageView or TextView objects. </li></ul><ul><li>Una celda puede ser compuesta también de un objeto ViewGroup (por ejemplo, una celda puede anidar un TableLayout). </li></ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> </li></ul><ul><li><TableLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;fill_parent&quot; android:stretchColumns=&quot;1&quot;> </li></ul><ul><li><TableRow> </li></ul><ul><li><TextView android:text=&quot;@string/table_layout_4_open&quot; android:padding=&quot;3dip&quot; /> <TextView android:text=&quot;@string/table_layout_4_open_shortcut&quot; android:gravity=&quot;right&quot; android:padding=&quot;3dip&quot; /> </li></ul><ul><li></TableRow> </li></ul><ul><li><TableRow> </li></ul><ul><li><TextView android:text=&quot;@string/table_layout_4_save&quot; android:padding=&quot;3dip&quot; /> <TextView android:text=&quot;@string/table_layout_4_save_shortcut&quot; android:gravity=&quot;right&quot; android:padding=&quot;3dip&quot; /> </li></ul><ul><li></TableRow> </li></ul><ul><li></TableLayout> </li></ul>
  59. 59. Conceptos importantes para TableLayout <ul><li>Podemos intercalar TableRow con otros tipos de views. Cuando hacemos esto estos elementos tenderán a ocupar el mismo ancho que la columna más ancha. </li></ul><ul><li>También disponemos de las propiedades android:stretchColumns, android:shrinkColumns, android:collapseColumns, que aceptan uno o más valores. </li></ul>
  60. 60. Relative Layout <ul><li>Permite a las vistas hijas definir su posición relativa a su padre o entre ellas, especificado el ID de las mismas. </li></ul><ul><li>Los parámetros definibles son: width, height, below, alignTop, toLeft, padding [Bottom|Left|Right|Top], and margin [Bottom|Left|Right|Top]. </li></ul><ul><li>De todos los layouts RelativeLayout es posiblemente el más flexible y el más capaz de escalar. </li></ul><ul><li><RelativeLayout xmlns:android= &quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;fill_parent&quot; > </li></ul><ul><li><!-- view1 goes on top --> </li></ul><ul><li><TextView </li></ul><ul><li>android:id= &quot;@+id/view1&quot; </li></ul><ul><li>android:background= &quot;@drawable/red&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:layout_alignParentTop= &quot;true&quot; </li></ul><ul><li>android:text= &quot;@string/relative_layout_1_top&quot; /> </li></ul><ul><li><!-- view2 goes on the bottom --> </li></ul><ul><li><TextView </li></ul><ul><li>android:id= &quot;@+id/view2&quot; </li></ul><ul><li>android:background= &quot;@drawable/green&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:layout_alignParentBottom= &quot;true&quot; </li></ul><ul><li>android:text= &quot;@string/relative_layout_1_bottom&quot; /> </li></ul><ul><li><!-- view3 stretches betweeen view1 and view2 --> </li></ul><ul><li><TextView </li></ul><ul><li>android:id= &quot;@+id/view3&quot; </li></ul><ul><li>android:background= &quot;@drawable/yellow&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;0dip&quot; </li></ul><ul><li>android:layout_above= &quot;@id/view2&quot; </li></ul><ul><li>android:layout_below= &quot;@id/view1&quot; </li></ul><ul><li>android:text= &quot;@string/relative_layout_1_center&quot; /> </li></ul><ul><li></RelativeLayout> </li></ul>
  61. 61. Conceptos Importantes para RelativeLayout <ul><li>Propiedades para “relative to container”. </li></ul><ul><li>Propiedades para definir “relative to other widgets”. </li></ul><ul><li>Orden de evaluación: a partir de 1.6 android hace dos pasadas, de manera que podemos referir a widgets todavía no definidos. </li></ul>
  62. 62. ScrollView <ul><li>Es un contenedor que provee de un mecanismo de scrolling para el contenido de cualquier layout. </li></ul><ul><li>Simplemente envolvemos el layout que necesita scrolling </li></ul><ul><li>ScrollView determina por si solo si tiene que activarse. </li></ul>
  63. 63. ViewGroup, etc <ul><li>Si lo anterior no resulta suficientemente flexible se puede crear una clase que herede de ViewGroup (o otros tipos de views) y “overriding” onMeasure, onLayout, podemos de manera programática crear cualquier distribución arbitraria. </li></ul><ul><li>A partir de este mismo concepto nos encontramos con montones de widgets compuestos en la plataforma como: spinner, TabHost, etc. </li></ul><ul><li>Además, fuera del alcance de estos días existe surfaceView. SurfaceView provee de una superficie embebida y dedicada interna a la jerarquía de la clase view. Hay controles para el formato, tamaño, etc. La idea es de proveer de un lienzo (buffer de altas prestaciones) que permita conectar el hardware con las capas más altas y permitir salida de vídeo, captura de imágenes desde la cámara, 3D optimizado y acelerado por el hardware, etc. </li></ul><ul><li>Otros elementos que nos dejamos en el tintero (por ahora?): Selection Widget (y Adapter Array), SelectionSpinner, GridLayout, ListView, AutoCompleteTextView, Gallery, ImageSwitcher, etc. </li></ul>
  64. 64. Adapter View <ul><li>La clase AdapterView es una subclase de ViewGroup cuyas vistas hijas son decididas por un Adaptador que enlaza los datos de algún tipo predefinido (Strings, ViewImages, etc). </li></ul><ul><li>Tienen dos responsabilidades: </li></ul><ul><ul><li>Llenar el layout con la información </li></ul></ul><ul><ul><li>Gestionar la selección del usuario </li></ul></ul><ul><li>Útil cuando es necesario mostra información almacenada o descargada (frente a mostrar recursos o drawablesUseful whenever you need to display stored data en el layout. </li></ul><ul><li>Gallery, ListView, Spinner, son ejemplos de subclases del Adapter View </li></ul><ul><li>http://developer.android.com/guide/topics/ui/binding.html for more info. </li></ul><ul><li>Vamos a montar un ejemplo… </li></ul>
  65. 65. Usando un ArrayAdapter <ul><li>Array Adapter tiene tres parámetros: </li></ul><ul><ul><li>El contexto (típicamente la instancia de </li></ul></ul><ul><ul><li>nuestra actividad) </li></ul></ul><ul><ul><li>El ID del recurso o vista a usar (ListView </li></ul></ul><ul><ul><li>en el caso de la derecha) </li></ul></ul><ul><ul><li>El Array a usar como opciones. </li></ul></ul><ul><li>Otros controles disponibles y muy útiles a cubrir más tarde: </li></ul><ul><ul><li>CursorAdapter, convierte datos de un </li></ul></ul><ul><ul><li>content providers </li></ul></ul><ul><ul><li>SimpleAdapter, convierte datos de un </li></ul></ul><ul><ul><li>recurso de XML </li></ul></ul><ul><li>//List Activity Layout Definition </li></ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> </li></ul><ul><li><LinearLayout </li></ul><ul><li>xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:orientation=&quot;vertical&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;fill_parent&quot; > </li></ul><ul><li><TextView </li></ul><ul><li>android:id=&quot;@+id/selection&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot;/> </li></ul><ul><li><ListView </li></ul><ul><li>android:id=&quot;@android:id/list&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;fill_parent&quot; </li></ul><ul><li>android:drawSelectorOnTop=&quot;false&quot;/> </li></ul><ul><li></LinearLayout> </li></ul><ul><li>//ListActivity Code </li></ul><ul><li>public class ListViewDemo extends ListActivity { </li></ul><ul><li>TextView selection; </li></ul><ul><li>String[] items={&quot;lorem&quot;, &quot;ipsum&quot;, &quot;dolor&quot;, &quot;sit&quot;, &quot;amet&quot;, &quot;consectetuer&quot;, &quot;adipiscing&quot;, </li></ul><ul><li>&quot;elit&quot;, &quot;morbi&quot;, &quot;vel&quot;, &quot;ligula&quot;, &quot;vitae&quot;, &quot;arcu&quot;, &quot;aliquet&quot;, &quot;mollis&quot;, &quot;etiam&quot;, &quot;vel&quot;, </li></ul><ul><li>&quot;erat&quot;, &quot;placerat&quot;, &quot;ante&quot;, &quot;porttitor&quot;, &quot;sodales&quot;, &quot;pellentesque&quot;, &quot;augue&quot;, &quot;purus&quot;}; </li></ul><ul><li>@Override </li></ul><ul><li>public void onCreate(Bundle icicle) { </li></ul><ul><li>super.onCreate(icicle); </li></ul><ul><li>setContentView(R.layout.main); </li></ul><ul><li>setListAdapter(new ArrayAdapter<String>(this, </li></ul><ul><li>android.R.layout.simple_list_item_1, items)); </li></ul><ul><li>selection=(TextView)findViewById(R.id.selection); </li></ul><ul><li>} </li></ul><ul><li>public void onListItemClick(ListView parent, View v, int position, </li></ul><ul><li>long id) { </li></ul><ul><li>selection.setText(items[position]); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  66. 66. Creando un menu de contexto <ul><li>// Igual que el ejemplo de antes </li></ul><ul><li>@Override </li></ul><ul><li>public void onCreate(Bundle icicle) { </li></ul><ul><li>... </li></ul><ul><li>setListAdapter(new ArrayAdapter<String>(this, </li></ul><ul><li>android.R.layout.simple_list_item_1, items)); </li></ul><ul><li>selection=(TextView)findViewById(R.id.selection); </li></ul><ul><li>ListView list = (ListView)findViewById(R.id.listOfItems); </li></ul><ul><li>registerForContextMenu(getListView()); </li></ul><ul><li>} </li></ul><ul><li>public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){ </li></ul><ul><li>if (v.getId()==getListView().getId()) { </li></ul><ul><li>AdapterView.AdapterContextMenuInfo info = </li></ul><ul><li>(AdapterView.AdapterContextMenuInfo)menuInfo; </li></ul><ul><li>menu.setHeaderTitle(items[info.position] + &quot; opciones&quot;); </li></ul><ul><li>String[] menuItems = getResources().getStringArray(R.array.menu); </li></ul><ul><li>for (int i = 0; i<menuItems.length; i++) { </li></ul><ul><li>menu.add(Menu.NONE, i, i, menuItems[i]); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>public boolean onContextItemSelected(MenuItem item) { </li></ul><ul><li>AdapterView.AdapterContextMenuInfo info = </li></ul><ul><li>(AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); </li></ul><ul><li>int menuItemIndex = item.getItemId(); </li></ul><ul><li>String[] menuItems = getResources().getStringArray(R.array.menu); </li></ul><ul><li>String menuItemName = menuItems[menuItemIndex]; </li></ul><ul><li>String listItemName = items[info.position]; </li></ul><ul><li>selection.setText(String.format(&quot;Seleccionado %s para elemento %s&quot;, menuItemName, listItemName)); </li></ul><ul><li>return true; </li></ul><ul><li>} </li></ul><ul><li>Crear un context menu es tán sencillo como: </li></ul><ul><li>Registrar nuestro listView en el método onCreate </li></ul><ul><li>Override el método y onCreateContextMenu, a cargo de dibujar el menú </li></ul><ul><li>Override el método onContextItemSelected, a cargo de responder a la selección. </li></ul><ul><li>Como estamos utilizando una actividad especial (ListActivity) tenemos que utilizar getListView() para obtener una referencia </li></ul>
  67. 67. Q&A
  68. 68. A propósito de recursos <ul><li>Los siguientes recursos están disponibles para la inclusión de elementos estáticos en nuestra aplicación: </li></ul><ul><ul><li>Images (res/drawable): Fotos e Iconos estáticos </li></ul></ul><ul><ul><li>Raw (res/raw): Para incluir ficheros arbitrarios que tienen sentido en el contexto de la aplicación, pero no necesariamente al framework de Android. </li></ul></ul><ul><ul><li>Strins, colors, arrays, y dimensions (res/values/), para provee de constantes symbolicas y mantenerlas separadas del código (util para internacionalización y localización). </li></ul></ul><ul><ul><li>XML (res/xml), para la inclusión estática de estructuras de datos definidas en XML </li></ul></ul>
  69. 69. Strings <ul><li>Strings pueden almacenar todos los datos textuales de nuestra aplicación (etiquetas, mensages, etc.) </li></ul><ul><li>Una idea excelente por la flexibilidad que otorga a la hora de localizar. </li></ul><ul><li>Siempre una buena idea para centralizar los recursos que de otra manera típicamente acabarían definidos dentro del código. </li></ul><ul><li>Además, podemos aplicar estilos y formatear nuestros recursos. </li></ul>
  70. 70. Intents – Cual es tu “Intentción”
  71. 71. Intro. <ul><li>Intents son mensajes de sistema que notifican aplicaciones de vaios eventos: </li></ul><ul><li>Activity events: lanzamiento de la aplicación, etc. </li></ul><ul><li>Cambios del estado de ciertas partes del hardware (pantalla, botón físico apretado, etc). </li></ul><ul><li>Es posible crear tu propios Intents para lanzar aplicaciones de manera expresa o implícita. </li></ul>
  72. 72. Intents – Descripción <ul><li>Actividades, servicios, broadcast receiver todos usan intents para empezar (ser disparados). Cada uno con su mecanismo de resolución. </li></ul><ul><li>Intents son estructuras de datos pasivas capaces de mantener una descripción abstracta de una operación (cuando un broadcast de un evento es lanzado). </li></ul><ul><li>Es un mecanismo que permite “late run-time binding” para componentes en la misma o diferentes aplicaciones (via intent-filters). </li></ul>
  73. 73. Intent – El objeto <ul><li>Component name: Quien gestiona el Intent? Es el nombre de una clase (FullyQualified class name, tipo: “com.example.project.app.ActivityName”) </li></ul><ul><li>Action: Un String nombrando la acción a realizar. (Mirar Intent class description para obtener una lista de constantes predefinidas para acciones genéricas) </li></ul><ul><ul><li>http://developer.android.com/reference/android/content/Intent.html </li></ul></ul><ul><li>Data: Los datos para ser usados en la acción. (Si la acción es uns llamada, los datos serían un URI con el número de teléfono) </li></ul><ul><li>Categoría: String que contienen cualquier información sobre el tipo de componente que debería gestionar el evento. </li></ul><ul><li>Extras: Pares de Llave-valor conteniendo información adicional. </li></ul><ul><li>Flags: Flags predefinidos (por la clase Intent) que proveen de lógica adicional. </li></ul>
  74. 74. Intent Filter <ul><li>Expone la funcionalidad de un componente </li></ul><ul><li>Usado durante la instalación y arranque. </li></ul><ul><li>Define tests para intent implicitos </li></ul><ul><li>Multiples filtros para un componente, son OR </li></ul>
  75. 75. Filter II <ul><li>Action Test </li></ul><ul><ul><li>TAKE_PICTURE </li></ul></ul><ul><ul><li>Intent sin acción siempre aceptado </li></ul></ul><ul><li>Data/Mime-type test </li></ul><ul><ul><li>content://contacts/people/1 </li></ul></ul><ul><ul><li>geo:0,0?q=pizza </li></ul></ul><ul><ul><li>image/jpeg o text/html </li></ul></ul><ul><ul><li>Filtros con wildcards aceptan todo lo especificado </li></ul></ul>
  76. 76. Filter III <ul><li>Category test: </li></ul><ul><ul><li>CATEGORY_BROWSABLE </li></ul></ul><ul><ul><li>Todas las categorías tienen que cohincidir </li></ul></ul><ul><ul><li>Intents para actividade siempre incluyen CATEGORY_DEFAULT </li></ul></ul><ul><li>Usuario puede escoger si hay más de un target. </li></ul><ul><li>Excepción si el Target no aparece </li></ul>
  77. 77. Intent Resolution <ul><li>Dos tipos de Intents: </li></ul><ul><ul><li>Intents Explicitos: nombran el componente a ejecutar. Se usan normalmente para componentes internos. </li></ul></ul><ul><ul><li>Implicit intents: no especifican un objetivo, el campo </li></ul></ul>
  78. 78. Lanzando un Intent <ul><li>4 maneras: </li></ul><ul><ul><li>startActivity() </li></ul></ul><ul><ul><li>startActivityForResult() </li></ul></ul><ul><ul><li>sendBroadcast() </li></ul></ul><ul><ul><li>sendOrderedBroadcast() </li></ul></ul><ul><li>El más común es el startActivity type </li></ul><ul><li>Broadcast esta orientado a eventos y pasar mensajes. </li></ul>public Button.OnClickListener mBrowse = new Button.OnClickListener() { public void onClick(View v) { Uri uri = Uri.parse(&quot;http://developer.android.com&quot;); startActivity(new Intent(Intent.ACTION_VIEW,uri)); } }; public Button.OnClickListener mScan = new Button.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(&quot;com.google.zxing.client.android.SCAN&quot;); intent.putExtra(&quot;SCAN_MODE&quot;, &quot;PRODUCT_MODE&quot;); startActivityForResult(intent, 0); } }; // Making a call: String toDial=&quot;tel:&quot;+number.getText().toString(); startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(toDial)));
  79. 79. Q&A
  80. 80. The Manifest <ul><li>La función principal es la de actuar como nexo entre el sistema de Android y tu Aplicación: </li></ul><ul><ul><li>Declara los permisos que la aplicación necesitará (uses-permission) </li></ul></ul><ul><ul><li>Declara los permisos que la actividades o servicios necesitará (permission) </li></ul></ul><ul><ul><li>Provee de instrumentación de elementos (instrumentation) </li></ul></ul><ul><ul><li>Define el corazón y las tuberías de la aplicación </li></ul></ul><ul><ul><li>Provee de los enlaces que conectan componentes opcionales como mapping, etc. (uses-library) </li></ul></ul><ul><ul><li>Determina el SDK target y mínimo para nuestra aplicación. </li></ul></ul><ul><li><manifest xmlns:android=&quot; http://schemas.android.com/apk/res/android &quot; </li></ul><ul><li>package=&quot;com.materiales.android&quot; </li></ul><ul><li>android:versionCode=&quot;1&quot; </li></ul><ul><li>android:versionName=&quot;1.0&quot;> </li></ul><ul><li><uses-permission </li></ul><ul><li>android:name=&quot;android.permission.ACCESS_LOCATION&quot; /> </li></ul><ul><li><uses-permission </li></ul><ul><li>android:name=&quot;android.permission.ACCESS_GPS&quot; /> </li></ul><ul><li><uses-permission </li></ul><ul><li>android:name=&quot;android.permission.ACCESS_ASSISTED_GPS&quot; /> </li></ul><ul><li><uses-permission </li></ul><ul><li>android:name=&quot;android.permission.ACCESS_CELL_ID&quot; /> </li></ul><ul><li><application> </li></ul><ul><li><activity android:name=&quot;.Now&quot; android:label=&quot;Now&quot;> </li></ul><ul><li><intent-filter> </li></ul><ul><li><action android:name=&quot;android.intent.action.MAIN&quot; /> </li></ul><ul><li><category android:name=&quot;android.intent.category.LAUNCHER&quot; /> </li></ul><ul><li></intent-filter> </li></ul><ul><li></activity> </li></ul><ul><li></application> </li></ul><ul><li><uses-sdk </li></ul><ul><li>android:minSdkVersion=&quot;3&quot; </li></ul><ul><li>android:targetSdkVersion=&quot;7&quot; </li></ul><ul><li>/> </li></ul><ul><li></manifest> </li></ul>
  81. 81. Application – el corazón del Manifest, el corazón de la App. <ul><li>Intent-Filter define los tipos de acciones que nuestra App recivirá </li></ul><ul><li>Activity define las actividades que nuestra app contiene </li></ul><ul><li>Service define los servicios. </li></ul><ul><li>También tenemos content providers, declarados con el tag provider. </li></ul><ul><li><application> </li></ul><ul><li><activity android:name=&quot;.CameraView&quot; </li></ul><ul><li> android:label=&quot;@string/app_name&quot; </li></ul><ul><li>android:configChanges=&quot;keyboardHidden|orientation&quot; </li></ul><ul><li>android:screenOrientation=&quot;landscape&quot; </li></ul><ul><li>android:theme=&quot;@android:style/Theme.NoTitleBar.Fullscreen&quot;> </li></ul><ul><li><intent-filter> </li></ul><ul><li><action android:name=&quot;android.intent.action.MAIN&quot; /> </li></ul><ul><li><category android:name=&quot;android.intent.category.LAUNCHER&quot; /> </li></ul><ul><li></intent-filter> </li></ul><ul><li><intent-filter> </li></ul><ul><li><action android:name=&quot;android.intent.action.SEND&quot; /> </li></ul><ul><li><category android:name=&quot;android.intent.category.DEFAULT&quot; /> </li></ul><ul><li><data android:mimeType=&quot;image/*&quot; /> </li></ul><ul><li></intent-filter> </li></ul><ul><li></activity> </li></ul><ul><li><activity </li></ul><ul><li>android:name=&quot;FotoRideManager&quot; </li></ul><ul><li>android:label=&quot;@string/manager_title&quot; </li></ul><ul><li>android:configChanges=&quot;orientation&quot; </li></ul><ul><li>android:screenOrientation=&quot;landscape&quot;> </li></ul><ul><li></activity> </li></ul><ul><li><activity </li></ul><ul><li>android:name=&quot;FotoRidePreferences&quot; </li></ul><ul><li>android:label=&quot;@string/pref_fotoride_title&quot;> </li></ul><ul><li></activity> </li></ul><ul><li><service android:name=&quot;.FotoRideService&quot; /> </li></ul><ul><li></application> </li></ul>
  82. 82. BroadcastReceiver <ul><li>La respuesta a SendBroadcast. </li></ul><ul><li>Clase muy sencilla con un método onRecive(Context, Intent). </li></ul><ul><li>Más detalles: </li></ul><ul><ul><li>http://developer.android.com/reference/android/content/BroadcastReceiver.html </li></ul></ul><ul><li>Lista de todos los Intents de la plataforma: </li></ul><ul><ul><li>http://developer.android.com/reference/android/content/Intent.html </li></ul></ul><application> .. Activities, Services, etc .. <receiver android:name=&quot;.OnWiFiChangeReceiver&quot;> <intent-filter> <action android:name=&quot;android.net.wifi.WIFI_STATE_CHANGED&quot; /> </intent-filter> </receiver> <receiver android:name=&quot;.OnBootReceiver&quot;> <intent-filter> <action android:name=&quot;android.intent.action.BOOT_COMPLETED&quot; /> </intent-filter> </receiver> <receiver android:name=&quot;.OnAlarmReceiver&quot;> </receiver> </application>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×