Está en la página 1de 39

Android: Fundamentos de la Creaci on de Aplicaciones

Redes, Aplicaciones y Servicios en Internet (RASI) Departamento de Sistemas Telem aticos y Computaci on (GSyC)

Octubre de 2009

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

c 2009 Grupo de Sistemas y Comunicaciones. Algunos derechos reservados. Este trabajo se distribuye bajo la licencia Creative Commons Attribution Share-Alike disponible en http://creativecommons.org/licenses/by-sa/2.1/es

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones El Maniesto de una Aplicaci on Android 3

GSyC - 2009

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones 4

GSyC - 2009

El Maniesto de una Aplicaci on Android

Componentes de las Aplicaciones Android


Actividades (Activities): Cada pantalla de una aplicaci on. Utilizan Vistas (Views) como componentes que muestran informaci on y responden a las acciones del usuario Servicios (Services): Componentes de la aplicaci on que se ejecutan de forma invisible, actualizando los datos y las Actividades, y disparando Noticaciones. Realizan el procesamiento normal de la aplicaci on que debe continuar incluso cuando las Actividades de la aplicaci on no est an visibles. Proveedores de Contenidos (Content Providers): Almacenes de datos compartidos. Gestionan las Bases de Datos para las aplicaciones. Intenciones (Intents): Mecanismo que permite el paso de mensajes destinados a ciertas Actividades o Servicios, o a todo el sistema (Intenciones de broadcast). Exponen la intenci on de que se haga algo. El sistema determinar a el destinatario que lo efectuar a. Receptores de Broadcast (Broadcast Receivers): Los crean las aplicaciones como consumidores de las Intenciones de broadcast que cumplan ciertos criterios. Noticaciones (Notications): Mecanismo que permite a las aplicaciones se nalar algo a los usuarios sin interrumpir la Actividad en primer plano.
GSyC - 2009 El Maniesto de una Aplicaci on Android Android: Fundamentos de la Creaci on de Aplicaciones 5

El Maniesto de una Aplicaci on (I)


Cada Aplicaci on incluye un chero de Maniesto, AndroidManifest.xml. Dene la estructura de la aplicaci on y sus componentes. Incluye un nodo ra z y un nodo para cada uno de sus tipos de componentes. A trav es de ltros de intenciones y permisos determina c omo interactuar a con otras aplicaciones. Nodo ra z manifest: incluye el nombre del paquete de la aplicaci on:
1 3 < m a n i f e s t x m l n s : a n d r o i d=h t t p : // s ch e ma s . a n d r o i d . com/ apk / r e s / a n d r o i d p a c k a g e=com . my domain . my app > [ . . . m a n i f e s t nodes . . . ] </ m a n i f e s t>

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

El Maniesto de una Aplicaci on Android

El Maniesto de una Aplicaci on (II)


Nodo application:
Indica metadatos de la aplicaci on (t tulo, icono, tema) Contiene los nodos de actividades, servicios, proveedores de contenidos y receptores de broadcast.

2 4 6 8 10 12 14 16 18 20

< a p p l i c a t i o n a n d r o i d : i c o n= @ d r a w a b l e / i c o n a n d r o i d : t h e m e= @ s t y l e / my theme > < a c t i v i t y a n d r o i d : n a m e= . M y A c t i v i t y a n d r o i d : l a b e l= @ s t r i n g / app name > <i n t e n t f i l t e r> < a c t i o n a n d r o i d : n a m e= a n d r o i d . i n t e n t . a c t i o n . MAIN /> < c a t e g o r y a n d r o i d : n a m e= a n d r o i d . i n t e n t . c a t e g o r y . LAUNCHER /> </ i n t e n t f i l t e r > </ a c t i v i t y> <a c t i v i t y . . . > ... </ a c t i v i t y> <s e r v i c e . . . > ... </ s e r v i c e> ... </ a p p l i c a t i o n>

GSyC - 2009 El Maniesto de una Aplicaci on Android

Android: Fundamentos de la Creaci on de Aplicaciones

El Maniesto de una Aplicaci on (III)


Nodo uses-permission:
Declara los permisos que la aplicaci on necesita para operar. Ser an presentados al usuario durante la instalaci on para que los acepte o deniegue. Se requieren permisos para utilizar muchos de los servicios nativos Android (enviar SMS, hacer llamadas, usar servicios de localizaci on. . . ) Permisos m as habituales: INTERNET, READ_CONTACTS, WRITE_CONTACTS, RECEIVE_SMS, SEND_SMS, ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION
<u s e s p e r m i s s i o n a n d r o i d : n a m e= a n d r o i d . p e r m i s s i o n . ACCESS FINE LOCATION> </ u s e s p e r m i s s i o n>

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

El Maniesto de una Aplicaci on Android

El Maniesto de una Aplicaci on (IV)

Nodo permission:
Dene un permiso que se requiere para que otras aplicaciones puedan acceder a partes restringidas de la aplicaci on Las otras aplicaciones necesitar an poner un uses-permission en su Maniesto para utilizar este permiso
< p e r m i s s i o n a n d r o i d : n a m e=com . r a s i . DETONATE DEVICE a n d r o i d : p r o t e c t i o n L e v e l= d a n g e r o u s a n d r o i d : l a b e l= S e l f D e s t r u c t a n d r o i d : d e s c r i p t i o n= @ s t r i n g / d e t o n a t e d e s c r i p t i o n > </ p e r m i s s i o n>

2 4

GSyC - 2009 El Maniesto de una Aplicaci on Android

Android: Fundamentos de la Creaci on de Aplicaciones

El Maniesto de una Aplicaci on (V)

Nodo instrumentation:
Permite denir tests de ejecuci on para las Actividades y Servicios.
1 3 < i n s t r u m e n t a t i o n a n d r o i d : l a b e l=My T e s t a n d r o i d : n a m e= . M y T e s t C l a s s a n d r o i d : t a r g e t P a c k a g e=com . r a s i . aP ac ka ge > </ i n s t r u m e n t a t i o n >

M as informaci on sobre el maniesto en:


http://code.google.com/android/devel/bblocks-manifest.html

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

10

Creaci on y destrucci on de Aplicaciones y Actividades

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones 11

GSyC - 2009 Creaci on y destrucci on de Aplicaciones y Actividades

Chapter 3: Creating Applications and Activities

The Activity Life Cycle Aplicaciones, Actividades y Pila de Actividades


A good understanding of the Activity life cycle is vital to ensure that your application provides a seamless user experience and properly manages its resources. As explained earlier, Android applications do not control their own process lifetimes; the Android run

Las time Aplicaciones Android no son iguales athat las aplicaciones en los sistemas manages the process of each application, and by extension of each Activity within it. operativos tradicionales: s o lo hay una en primer plano que normalmente While the run time handles the termination and management of an Activitys process, the Activitys state helps determine the priority of its parent application. The application priority, in turn, inuences ocupa toda la pantalla. the likelihood that the run time will terminate it and the Activities running within it. Las Aplicaciones est an formadas por Actividades (pantallas). Activity Stacks Al arrancar una nueva aplicaci on, pasa a primer plano situando una The state of each Activity is determined by its position on the Activity stack, a last-inrst-out collection of all the currently running Activities. When a new Activity starts, the current foreground screen is Actividad encima de la que hubiera, form andose as una Pila de moved to the top of the stack. If the user navigates back using the Back button, or the foreground Activity is closed, the next Activity on the stack moves up and becomes active. This process is illustrated in Actividades. Figure 3-7. El bot on Back ( ) cierra la Actividad en primer plano y recupera la de la As described previously in this chapter, an applications priority is inuenced by its highest-priority cima de la Pila (cerrando la uses aplicaci oto n determine en su the caso). Activity. The Android memory manager this stack priority of applications based
on their Activities when deciding which application to terminate to free resources.
New Activity New Activity started Active Activity Back button pushed or activity closed

Last Active Activity Removed to free resources Previous Activities Activity Stack

Figure 3-7

GSyC - 2009

Activity States

Android: Fundamentos de la Creaci on de Aplicaciones

12

As activities are created and destroyed, they move in and out of the stack shown in Figure 3-7. As they do so, they transition through four possible states:

Creaci on y destrucci on de Aplicaciones y Actividades

Aplicaciones y procesos
Las aplicaciones Android no tienen control sobre su propio ciclo de vida:
deben estar pendientes de posibles cambios en su estado y reaccionar como corresponda en particular, deben estar preparadas para que su terminaci on en cualquier momento

En general, cada aplicaci on Android se ejecuta en un proceso que ejecuta una instancia de Dalvik. Android mata sin previo aviso los procesos que considera necesarios cuando lo considera necesario para mantener el sistema responsivo. El runtime de Android gestiona el proceso de cada aplicaci on, y por extensi on de cada Actividad que contenga.

GSyC - 2009 Creaci on y destrucci on de Aplicaciones y Actividades

Android: Fundamentos de la Creaci on de Aplicaciones

13

Aplicaciones, Actividades, Vistas, Dise nos


Una Actividad representa una pantalla que una aplicaci on muestra a sus usuarios (equivalente al concepto de Form en aplicaciones de escritorio convencionales). La mayor a de las Actividades ocupan toda la pantalla del dispositivo, pero pueden crearse actividades semi-transparentes, otantes o que utilizan cajas de di alogo. Para crear una nueva Actividad en una aplicaci on se hereda de la clase Activity. Las Interfaz de Usuario de una Actividad se crea mediante Vistas (Views) (equivalentes al concepto de Widgets en aplicaciones de escritorio convencionales). Las Vistas se agrupan en Dise nos (Layouts) que mostrar a la aplicaci on.
GSyC - 2009 Android: Fundamentos de la Creaci on de Aplicaciones 14

Creaci on y destrucci on de Aplicaciones y Actividades

Creaci on de una Actividad


src/com.rasi.myapplication/MyActivity.java package com . r a s i . m y a p p l i c a t i o n ; i m p o r t a n d r o i d . app . A c t i v i t y ; import a n d r o i d . os . Bundle ; p u b l i c c l a s s MyActivity extends A c t i v i t y { / C a l l e d when t h e a c t i v i t y i s f i r s t c r e a t e d . / @Override p u b l i c void onCreate ( Bundle s a v e d I n s t a n c e S t a t e ) { super . onCreate ( savedInstanceState ) ; s e t C o n t e n t V i e w (R . l a y o u t . main ) ; } } 2 4 6 8 10 12

Para usar una Actividad en una Aplicaci on, hay que registrarla en el Maniesto, incluyendo las Intenciones a las que responder a:
AndroidManifest.xml 1 <a c t i v i t y a n 3: d r o iCreating d : l a b e l= @Applications s t r i n g / app name Chapter and Activities

a n d r o i d : n a m e= . M y A c t i v i t y > <i n t e n t f i l t e r > to free resources for higher-priority generally those interacting < a c t i o n applications a n d r o i d : n a m e= androi d . i n that t e n tare . ac t i o n . MAIN /> with the user at the time. The process is discussed section. 5 <prioritization category an droid:n am e= a n d rin o i the d . i next nten t . c a t e g o r y . LAUNCHER /> </ i n t e n t f i l t e r > 7 </ a c t i v i t y > 3

standing Application Priority GSyC - 2009 rocess States

Android: Fundamentos de la Creaci on de Aplicaciones

15

Creaci o n reclaim y destrucci on de Aplicaciones y Actividades in which processes are killed to resources is determined by the priority of the hosted ns. An applications priority is equal to its highest-priority component.

o applications have the same priority, the process that has been at a lower priority longest led rst. Process priority is also affected by interprocess dependencies; if an application has a El ordensupplied en que los procesos se van matando para liberar recursos lo determina las cy on a Service or Content Provider by a second application, the secondary applicahave at least as high a priority as the application it supports. prioridades de la aplicaciones que alojan.

Procesos y prioridades
Arbol de prioridades:

ndroid applications will remain running and in memory until the system needs its resources for applications.

Prioridad Cr tica:

Procesos activos: Los que est an interactuando con el 3 shows the priority tree used to determine the order of application termination.
Critical Priority

usuario). Hay muy pocos y se les mata s olo como u ltimo recurso. Procesos visibles: Visibles, pero no activos (p.ej, parcialmente tapados por otra actividad). Hay muy pocos y se les mata s olo en circunstancias extremas. Procesos de servicios arrancados: Procesamiento que debe continuar aunque no tenga interfaz visible. Se les mata s olo en circunstancias extremas.

1. Active Process

Prioridad Alta:

2. Visible Process

High Priority

3. Started Service Process Low Priority

4. Background Process

Prioridad Baja:
Procesos de fondo: Alojan actividades que no caen en las categor as anteriores. Hay muchos. Se les mata cuando se necesitan recursos para el resto de procesos. Procesos vac os: Android mantiene en memoria las aplicaciones que han terminado, por si son relanzadas. Se les mata rutinariamente.

5. Empty Process

Figure 3-3

tant to structure your application correctly to ensure that its priority is appropriate for the doing. If you dont, your application could be killed while its in the middle of something t. GSyC - 2009 Android: Fundamentos de la Creaci on de Aplicaciones

16

wing list details each of the application states shown in Figure 3-3, explaining how the state is ed by the application components comprising it:

Creaci on y destrucci on de Aplicaciones y Actividades

Estados de una Actividad (I)

I T S A LIVE !

37

Figure 2.3: Life cycle of an Android activity


GSyC - 2009 Creaci on y destrucci on de Aplicaciones y Actividades Android: Fundamentos de la Creaci on de Aplicaciones 17

its lifetime, each activity of an Android program can be in one of During Estados de una Actividad (II)

Life Cycles of the Rich and Famous

several states, as shown in Figure 2.3. You, the developer, do not have control over what state your program is in. Thats all managed by the system. However, you do get notied when the state is about Activo (Running) : La Actividad est a encima de to la change pila, es through the onXX () method calls.

visible, tiene el foco (recibe la entrada del usuario). Cuando You override these methods in your Activity class, and Android will call otra Actividad pase a estar activa, esta pasar a a estar pausada. them at the appropriate time: Pausado (Paused):: La esthe visible pero no tiene onCreate(Bundle) ThisActividad is called when activity rst starts up. el You can use iteste to perform one-time initialization such as creating foco. Se alcanza estado cuando pasa a activa otra the user interface. onCreate( ) takes one parameter that is either Actividad transparente o que no ocupa toda pantalla. null or some state information previously saved by la the onSaveInstanceState ( ) method. Cuando una Actividad es tapada por completo pasa a estar onStart( ): This indicates the activity is about to be displayed to the parada. Parado (Stopped): Cuando la Actividad no es visible. Permanece en memoria reteniendo su estado. Cuando una actividad entra en parada puede ser bueno que salve todos sus datos y el estado de la Interfaz de usuario. Destruido (Destroyed): Cuando la Actividad termina, o es matada por el runtime de Android. Sale de la Pila de Actividades. Necesita ser reiniciada para volver a estar activa.
GSyC - 2009 Android: Fundamentos de la Creaci on de Aplicaciones 18

Creaci on y destrucci on de Aplicaciones y Actividades

Estados de una Actividad (III)


En la clase Activity existen m etodos para ser redenidos (overrided) en sus clases derivadas para incluir el c odigo a ejecutar en las transiciones entre estados: OnCreate, onStart, onPause, onStop. . . . Los m etodos redenidos siempre deben llamar al m etodo de la superclase:
1 3 5 // C a l l e d a t t h e s t a r t o f t h e v i s i b l e l i f e t i m e . @Override p u b l i c void onStart (){ super . onStart ( ) ; // A p p l y any r e q u i r e d UI c h a n g e now t h a t t h e A c t i v i t y }

is

visible .

GSyC - 2009 Creaci on y destrucci on de Aplicaciones y Actividades

Android: Fundamentos de la Creaci on de Aplicaciones

19

M etodos de transici on entre estados (I)

onCreate(Bundle):
Se invoca cuando la Actividad se arranca por primera vez. Se utiliza para tareas de inicializaci on a realizar una sola vez, como crear la interfaz de usuario de la Actividad. Su par ametro es null o informaci on de estado guardada previamente por onSaveInstanceState().

onStart():
Se invoca cuando la Actividad va a ser mostrada al usuario.

onResume():
Se invoca cuando la Actividad va a empezar a interactuar con el usuario.

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

20

Creaci on y destrucci on de Aplicaciones y Actividades

M etodos de transici on entre estados (II)


onPause():
Se invoca cuando la actividad va a pasar al fondo porque otra actividad ha sido lanzada para ponerse delante. Se utiliza para guardar el estado persistente de la Actividad

onStop():
Se invoca cuando la actividad va a dejar de ser visible y no se necesitar a durante un tiempo. Si hay escasez de recursos en el sistema, este m etodo podr a no llegar a ser invocado y la Actividad ser destruida directamente.

onRestart():
Se invoca cuando la Actividad va a salir del estado de parada para volver a estar activa.

onDestroy():
Se invoca cuando la Actividad va a ser destruida. Si hay escasez de recursos en el sistema, este m etodo podr a no llegar a ser invocado y la Actividad ser destruida directamente.
GSyC - 2009 Creaci on y destrucci on de Aplicaciones y Actividades Android: Fundamentos de la Creaci on de Aplicaciones 21

M etodos de transici on entre estados (III)

onSaveInstanceState(Bundle):
Se invoca para permitir a la actividad guardar su estado, p.ej: la posici on del cursor en una caja de texto. Normalmente no necesita ser redenido porque la implementaci on de la clase Activity ya guarda todo el estado de todos los componentes de la Interfaz de Usuario.

onRestoreInstanceState(Bundle):
Se invoca para recuperar el estado guardado por onSaveInstanceState(). Normalmente no necesita ser redenido porque la implementaci on de la clase Activity ya recupera todo el estado de todos los componentes de la Interfaz de Usuario.

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

22

Recursos de las Aplicaciones Android

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones Recursos de las Aplicaciones Android 23

GSyC - 2009

Tipos de recursos

Hay distintos tipos de recursos, que se denen en cheros XML alojados en una cierta subcarpeta de res:
Valores simples (carpeta values): Strings, colores y dimensiones. Recursos dibujables (carpeta drawable): cheros con im agenes, incluyendo el icono de la aplicaci on Animaciones (carpeta anim) Men us (carpeta menu) Dise nos (carpeta layout) Estilos (carpeta values) Varios (carpeta xml)

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

24

Recursos de las Aplicaciones Android

Valores simples
Denen Strings, colores o dimensiones Se denen como un elemento:
< c o l o r name= o p a q u e r e d > #f 0 0</ c o l o r>

Las dimensiones pueden tener distintas unidades: px, in, mm, pt, dp, sp
dp: Density-independent pixels (tambi en dip), pixels independientes de los dpi (puntos por pulgada) del dispositivo. Son un valor relativo a un dispositivo de 160dpi. sp: Scale-independent pixels, igual que los dp, pero tambi en escalados al tama no de font elegido por el usuario.
1 <dimen name= s i x t e e n s p >16 s p</ dimen>

Un chero XML contiene la denici on de uno o m as de estos elementos. Todos estos recursos se identican con el valor de su atributo name.
GSyC - 2009 Recursos de las Aplicaciones Android Android: Fundamentos de la Creaci on de Aplicaciones 25

Drawables

Para cheros de bitmaps o de im agenes estirables (.9.png) Tambi en puede denirse uno de estos recursos como un recuadro de color:
1 <d r a w a b l e name= s o l i d b l u e >#0000 f f</ d r a w a b l e>

(un chero XML puede contener uno o m as recuadros de color) Los cheros se identican con su nombre de chero, y los recuadros de color con el valor de su atributo name.

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

26

Recursos de las Aplicaciones Android

Animaciones

Para realizar animaciones sencillas sobre uno o varios gr acos: rotaciones, fading, movimiento y estiramiento. Cada animaci on se dene en un chero XML Estos recursos se identican con su nombre de chero.

GSyC - 2009 Recursos de las Aplicaciones Android

Android: Fundamentos de la Creaci on de Aplicaciones

27

Men us

Existen tres tipos de men us: Men u de opciones, men u contextual y submen u Un men u de opciones o contextual se dene en un chero XML. Un submen u se dene dentro de otro men u. Un men u de opciones o contextual se identica con su nombre de chero. Un submen u se identica con el valor de su atributo id. Un elemento de un men u tambi en puede ser identicado con el valor de su atributo id.

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

28

Recursos de las Aplicaciones Android

Layouts

Un layout se dene en un chero XML. Dentro de un layout se denen los elementos que lo componen: Views, ViewGroups Un layout se identica con su nombre de chero. Un elemento de un layout tambi en puede ser identicado con el valor de su atributo id.

GSyC - 2009 Recursos de las Aplicaciones Android

Android: Fundamentos de la Creaci on de Aplicaciones

29

Estilos

Un estilo es uno o m as atributos que se aplican a un elemento. Un tema es uno o m as atributos que se aplican a todo lo que hay en pantalla. Un tema se asigna como atributo a una Actividad en su Maniesto. Se denen dentro en un elemento <style> que contiene strings, colores, o referencias a otros recursos. Un estilo entero se referencia con el valor de su atributo name. Un elemento dentro de un estilo tambi en puede ser referenciado de la manera adecuada seg un el tipo de recurso.

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

30

Recursos de las Aplicaciones Android

Recursos para diferentes idiomas y diferente hardware


Pueden especicarse recursos alternativos para diferentes idiomas o diferente hardware con subcarpetas con el mismo nombre que la original m as un sujo o conjunto de sujos. Ejemplos:
Valores simples para idioma espa nol: values-es Layouts para terminal girado: layout-land Layouts para teclado sobreimpresionado: layout-keysexposed

Pueden ponerse varios sujos encadenados Dentro de esas subcarpetas se colocar an cheros especializados con el mismo nombre que el que tienen en la carpeta b asica (ej: strings.xml) La aplicaci on al usar un recurso elegir a de entre los disponibles aquel en el encajen m as sujos.
GSyC - 2009 Recursos de las Aplicaciones Android Android: Fundamentos de la Creaci on de Aplicaciones 31

Cambios de conguraci on en tiempo de ejecuci on


Una aplicaci on puede responder a ciertos cambios de conguraci on mientras se ejecuta. Si lo hace, debe especicarse en el Maniesto de la aplicaci on:
1 3 < a c t i v i t y a n d r o i d : n a m e= . T o d o L i s t a n d r o i d : l a b e l= @ s t r i n g / app name a n d r o i d : t h e m e= @ s t y l e /TodoTheme a n d r o i d : c o n f i g C h a n g e s= o r i e n t a t i o n | k e y b o a r d H i d d e n />

Cuando se produzca el cambio se invocar a el m etodo onConfigurationChanged en la Actividad:


2 4 6 8 10 @Override p u b l i c void onConfigurationChanged ( C o n f i gu r a t i o n newConfig ) { super . onConfigurationChanged ( newConfig ) ; [ . . . Update any UI b a s e d on r e s o u r c e v a l u e s . . . ] i f ( n e w C o n f i g . o r i e n t a t i o n == C o n f i g u r a t i o n . ORIENTATION LANDSCAPE ) { [ . . . React to d i f f e r e n t o r i e n t a t i o n . . . ] } i f ( n e w C o n f i g . k e y b o a r d H i d d e n == C o n f i g u r a t i o n . KEYBOARDHIDDEN NO) { [ . . . React to changed keyboard v i s i b i l i t y . . . ] } }

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

32

Recursos de las Aplicaciones Android

Utilizaci on de recursos en el c odigo (I)


Se accede a los recursos de una aplicaci on a trav es de la clase est atica R, regenerada a partir de los cheros XML cada vez que se recompila el proyecto. La clase R incluye subclases est aticas para cada uno de los tipos de recursos para los que se ha denido al menos un recurso. Ej: R.string, R.drawable Cada subclase expone sus recursos asociados como variables, con nombre igual a los identicadores de los recursos. Ej: R.string.app_name, R.drawable.icon El valor de estas variables es una referencia al recurso, no una instancia del recurso. Cuando un constructor o un m etodo (como setContentView) acepta como par ametro un identicador de recurso, se le puede pasar una de estas variables:
1 3 5 // I n f l a t e a l a y o u t r e s o u r c e . s e t C o n t e n t V i e w (R . l a y o u t . main ) ; // D i s p l a y a t r a n s i e n t d i a l o g box t h a t d i s p l a y s t h e // e r r o r m e s s a g e s t r i n g r e s o u r c e . T o a s t . makeText ( t h i s , R . s t r i n g . a p p e r r o r , T o a s t . LENGTH LONG ) . show ( ) ;

GSyC - 2009 Recursos de las Aplicaciones Android

Android: Fundamentos de la Creaci on de Aplicaciones

33

Utilizaci on de recursos en el c odigo (II)


La tabla de recursos de una aplicaci on est a representada por una instancia de la clase Resources. Cuando se necesita una instancia del recurso se usan m etodos helper para extraerlos de la tabla de recursos. La clase Resources incluye getters para cada tipo de recursos disponible, a los que se pasa la variable (referencia) del recurso del que se quiere una instancia:
1 3 5 7 9 11 13 15 Resources myResources = g e t R e s o u r c e s ( ) ; C h a r S e q u e n c e s t y l e d T e x t = m y R e s o u r c e s . g e t T e x t (R . s t r i n g . s t o p m e s s a g e ) ; D r a w a b l e i c o n = m y R e s o u r c e s . g e t D r a w a b l e (R . d r a w a b l e . a p p i c o n ) ; i n t o p a q u e B l u e = m y R e s o u r c e s . g e t C o l o r (R . c o l o r . o p a q u e b l u e ) ; f l o a t b o r d e r W i d t h = m y R e s o u r c e s . g e t D i m e n s i o n (R . dimen . s t a n d a r d b o r d e r ) ; Animation tranOut ; t r a n O u t = A n i m a t i o n U t i l s . l o a d A n i m a t i o n ( t h i s , R . anim . s p i n s h r i n k f a d e ) ; String [ ] stringArray ; s t r i n g A r r a y = m y R e s o u r c e s . g e t S t r i n g A r r a y (R . a r r a y . s t r i n g a r r a y ) ; int [] i n t A r r a y = m y R e s o u r c e s . g e t I n t A r r a y (R . a r r a y . i n t e g e r a r r a y ) ; Android: Fundamentos de la Creaci on de Aplicaciones 34

GSyC - 2009

Recursos de las Aplicaciones Android

Referenciaci on de Recursos en otros Recursos


Para referenciar un recurso en otro recurso se utiliza la notaci on @:
1 a t r i b u t o=@ [ n o m b r e p a q u e t e : ] t i p o r e c u r s o / i d r e c u r s o

(el nombre de paquete puede omitirse si es del mismo paquete) Ejemplo:


1 3 5 7 9 11 13 15 <? xml v e r s i o n = 1 . 0 e n c o d i n g= u t f 8 ?> <L i n e a r L a y o u t x m l n s : a n d r o i d= h t t p : // sch emas . a n d r o i d . com/ apk / r e s / a n d r o i d a n d r o i d : o r i e n t a t i o n= v e r t i c a l a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= f i l l p a r e n t a n d r o i d : p a d d i n g= @dimen / s t a n d a r d b o r d e r > <E d i t T e x t a n d r o i d : i d=@+i d / m y E d i t T e x t a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= w r a p c o n t e n t a n d r o i d : t e x t= @ s t r i n g / s t o p m e s s a g e a n d r o i d : t e x t C o l o r= @ c o l o r / o p a q u e b l u e /> </ L i n e a r L a y o u t>

GSyC - 2009 Recursos de las Aplicaciones Android

Android: Fundamentos de la Creaci on de Aplicaciones

35

Referenciaci on de Recursos del Sistema


Las aplicaciones nativas de Android externalizan muchos de sus recursos para que sean accesibles desde otras aplicaciones. Para acceder a ellos en el c odigo Java se utiliza android.R en vez de R:
1 CharSequence h t t p E r r o r = g e t S t r i n g ( a n d r o i d . R . s t r i n g . h t t p E r r o r B a d U r l ) ;

Para acceder desde otros recursos, se utiliza Android como nombre de paquete:
1 3 5 7 <E d i t T e x t a n d r o i d : i d=@+i d / m y E d i t T e x t a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= w r a p c o n t e n t a n d r o i d : t e x t= @ a n d r o i d : s t r i n g / h t t p E r r o r B a d U r l a n d r o i d : t e x t C o l o r= @ a n d r o i d : c o l o r / d a r k e r g r a y />

Tambi en es posible acceder a recursos del tema actual (para mantener consistencia con el resto de aplicaciones), con ?:
1 a n d r o i d : t e x t C o l o r =? a n d r o i d : t e x t C o l o r

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

36

Creaci on de Interfaces de Usuario: Views

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones Creaci on de Interfaces de Usuario: Views 37

GSyC - 2009

Terminolog a

Vistas (Views): Clase b asica que representa a un elemento b asico de IU en Android. En otros tipo de aplicaciones se utiliza el nombre de controles o widgets. Todos los componentes visuales en Android descienden de la clase View. Grupos de Vistas (ViewGroups): Extensiones de la clase View para crear controles compuestos que contienen m ultiples Views hijas. Dise nos (Layouts): Extensiones de la clase ViewGroup para gestionar la disposici on de sus Views hijas.

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

38

Creaci on de Interfaces de Usuario: Views

Creaci on de la IU de una Actividad con Views

La forma habitual es establecer el Layout al principio del m etodo onCreate. Una vez establecido, pueden obtenerse referencias a las Views contenidas en el Layout llamando al m etodo findViewById:
1 3 5 7 @Override p u b l i c void onCreate ( Bundle s a v e d I n s t a n c e S t a t e ) { super . onCreate ( savedInstanceState ) ; s e t C o n t e n t V i e w (R . l a y o u t . main ) ; TextView myTextView = ( TextView ) f i n d V i e w B y I d (R . i d . myTextView ) ;

GSyC - 2009 Creaci on de Interfaces de Usuario: Views

Android: Fundamentos de la Creaci on de Aplicaciones

39

Views est andar habituales


TextView: Etiqueta de texto de solo lectura. EditText: Caja de texto editable, que acepta entradas multil nea. ListView: ViewGroup que gestiona un grupo de Views para mostrarlo en forma de lista, usando por defecto un TextView para cada elemento. Spinner: Control compuesto que muestra un TextView con una ListView asociada para elegir uno de sus elementos para ser mostrado en el TextView. Button: Bot on pulsable est andar. Checkbox: Bot on de dos estados representado por un caja marcada o desmarcada. RadioButton: Varios botones de dos estados, agrupados de forma que s olo uno del grupo puede estar activado.
GSyC - 2009 Android: Fundamentos de la Creaci on de Aplicaciones 40

Creaci on de Interfaces de Usuario: Layouts

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones Creaci on de Interfaces de Usuario: Layouts 41

GSyC - 2009

Layouts est andar habituales

FrameLayout: Coloca cada View en la esquina izquierda. Cada nueva View que se a nade tapa a la anterior. LinearLayout: Coloca cada View hija en l nea, de forma horizontal (una la de Views) o vertical (una columna de Views). TableLayout: Coloca las Views en forma de tabla RelativeLayout: Las posiciones de cada View hija es relativa a las otras y a los bordes de la pantalla AbsoluteLayout: Las posiciones de cada View hija se dene en coordenadas absolutas

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

42

Creaci on de Interfaces de Usuario: Layouts

Ejemplo:

1 3 5 7 9 11 13 15

<? xml v e r s i o n = 1 . 0 e n c o d i n g= u t f 8 ?> < L i n e a r L a y o u t x m l n s : a n d r o i d= h t t p : // s c h em a s . a n d r o i d . com/ apk / r e s / a n d r o i d a n d r o i d : o r i e n t a t i o n= v e r t i c a l a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= f i l l p a r e n t > <TextView a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= w r a p c o n t e n t a n d r o i d : t e x t= E n t e r Text Below /> <E d i t T e x t a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= w r a p c o n t e n t a n d r o i d : t e x t= Text Goes Here ! /> </ L i n e a r L a y o u t>

GSyC - 2009 Creaci on de Interfaces de Usuario: Creaci on de nuevas Views

Android: Fundamentos de la Creaci on de Aplicaciones

43

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones 44

GSyC - 2009

Creaci on de Interfaces de Usuario: Creaci on de nuevas Views

Creaci on de nuevas Views a partir de las existentes


Se extiende una View ya existente, redeniendo los m etodos que denen su apariencia y su comportamiento:
MyTextView.java p u b l i c c l a s s MyTextView e x t e n d s TextView { p u b l i c MyTextView ( C o n t e x t c o n t e x t , A t t r i b u t e S e t a t s , i n t d e f S t y l e ) { super ( context , ats , d e f S t y l e ) ; } p u b l i c MyTextView ( C o n t e x t c o n t e x t ) { super ( context ) ; p u b l i c MyTextView ( C o n t e x t c o n t e x t , A t t r i b u t e S e t a t t r s ) { super ( context , a t t r s ) ;

2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32

@Override p u b l i c v o i d onDraw ( Canvas c a n v a s ) { [ . . . Draw t h i n g s on t h e c a n v a s u n d e r t h e t e x t

...

// R e n d e r t h e t e x t a s u s u a l u s i n g t h e TextView b a s e c l a s s . s u p e r . onDraw ( c a n v a s ) ; } [ . . . Draw t h i n g s on t h e c a n v a s o v e r t h e t e x t ... ]

@Override p u b l i c b o o l e a n onKeyDown ( i n t keyCode , KeyEvent k e y E v e n t ) { [ . . . P e r f o r m some s p e c i a l p r o c e s s i n g . . . ] [ . . . b a s e d on a p a r t i c u l a r k e y p r e s s . . . ] // Use t h e e x i s t i n g f u n c t i o n a l i t y i m p l e m e n t e d by // t h e b a s e c l a s s t o r e s p o n d t o a k e y p r e s s e v e n t . r e t u r n s u p e r . onKeyDown ( keyCode , k e y E v e n t ) ;

GSyC - 2009 Creaci on de Interfaces de Usuario: Creaci on de nuevas Views

Android: Fundamentos de la Creaci on de Aplicaciones

45

Mejora del aspecto de la TodoList (I)


Creamos una nueva TodoListItemView extendiendo TextView:
src/com.rasi.todolist/TodoListItemView.java 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 } package com . r a s i . t o d o l i s t ; import android . content . Context ; import android . content . r e s . Resources ; i m p o r t a n d r o i d . g r a p h i c s . Canvas ; import android . g r a p h i c s . Paint ; import android . u t i l . A t t r i b u t e S e t ; i m p o r t a n d r o i d . w i d g e t . TextView ; p u b l i c c l a s s T o d o L i s t I t e m V i e w e x t e n d s TextView { p u b l i c TodoListItemView ( Context context , A t t r i b u t e S e t ats , i n t ds ) { super ( context , ats , ds ) ; init (); } p u b l i c TodoListItemView ( Context context ) { super ( context ) ; init (); } p u b l i c TodoListItemView ( Context context , A t t r i b u t e S e t a t t r s ) { super ( context , a t t r s ) ; init (); } private void i n i t () { } @Override p u b l i c v o i d onDraw ( Canvas c a n v a s ) { // Use t h e b a s e TextView t o r e n d e r t h e t e x t . s u p e r . onDraw ( c a n v a s ) ; }

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

46

Creaci on de Interfaces de Usuario: Creaci on de nuevas Views

Mejora del aspecto de la TodoList (II)


Creamos un nuevo colors.xml en res/values:
res/values/colors.xml <? xml v e r s i o n = 1 . 0 e n c o d i n g= u t f 8 ?> < r e s o u r c e s> < c o l o r name= n o t e p a d p a p e r > #AAFFFF99</ c o l o r> < c o l o r name= n o t e p a d l i n e s > #FF0000FF</ c o l o r> < c o l o r name= n o t e p a d m a r g i n >#90FF0000</ c o l o r> < c o l o r name= n o t e p a d t e x t > #AA0000FF</ c o l o r> </ r e s o u r c e s>

2 4 6

Creamos un nuevo dimens.xml en res/values:


res/values/dimens.xml 1 3 <? xml v e r s i o n = 1 . 0 e n c o d i n g= u t f 8 ?> < r e s o u r c e s> <dimen name= n o t e p a d m a r g i n >30 px</ dimen> </ r e s o u r c e s>

GSyC - 2009 Creaci on de Interfaces de Usuario: Creaci on de nuevas Views

Android: Fundamentos de la Creaci on de Aplicaciones

47

Mejora del aspecto de la TodoList (III)


Ahora podemos incluir el m etodo init en TodoListItemView:
src/com.rasi.todolist/TodoListItemView.java (fragmento) private private private private Paint marginPaint ; Paint l i n e P a i n t ; int paperColor ; f l o a t margin ;

2 4 6 8 10 12 14 16 18

private void i n i t () { // Get a r e f e r e n c e t o o u r r e s o u r c e t a b l e . Resources myResources = g e t R e s o u r c e s ( ) ; // C r e a t e t h e p a i n t b r u s h e s we w i l l u s e i n t h e onDraw method . m a r g i n P a i n t = new P a i n t ( P a i n t . ANTI ALIAS FLAG ) ; m a r g i n P a i n t . s e t C o l o r ( m y R e s o u r c e s . g e t C o l o r (R . c o l o r . n o t e p a d m a r g i n ) ) ; l i n e P a i n t = new P a i n t ( P a i n t . ANTI ALIAS FLAG ) ; l i n e P a i n t . s e t C o l o r ( m y R e s o u r c e s . g e t C o l o r (R . c o l o r . n o t e p a d l i n e s ) ) ; // Get t h e p a p e r b a c k g r o u n d c o l o r and t h e m a r g i n w i d t h . p a p e r C o l o r = m y R e s o u r c e s . g e t C o l o r (R . c o l o r . n o t e p a d p a p e r ) ; m a r g i n = m y R e s o u r c e s . g e t D i m e n s i o n (R . dimen . n o t e p a d m a r g i n ) ;

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

48

Creaci on de Interfaces de Usuario: Creaci on de nuevas Views

Mejora del aspecto de la TodoList (IV)


Renamos el m etodo onDraw utilizando las variables de instancia inicialidadas en init:
src/com.rasi.todolist/TodoListItemView.java (fragmento) 1 3 5 7 9 11 13 15 17 19 21 } @Override p u b l i c v o i d onDraw ( Canvas c a n v a s ) { // C o l o r a s p a p e r canvas . drawColor ( paperColor ) ; // Draw r u l e d l i n e s canvas . drawLine (0 , 0 , getMeasuredHeight ( ) , 0 , l i n e P a i n t ) ; canvas . drawLine (0 , getMeasuredHeight () , getMeasuredWidth ( ) , getMeasuredHeight ( ) , linePaint ); // Draw m a r g i n c a n v a s . d r a w L i n e ( margin , 0 , margin , g e t M e a s u r e d H e i g h t ( ) , m a r g i n P a i n t ) ; // Move t h e t e x t a c r o s s from t h e m a r g i n canvas . save ( ) ; c a n v a s . t r a n s l a t e ( margin , 0 ) ; // Use t h e b a s e TextView t o r e n d e r t h e t e x t . s u p e r . onDraw ( c a n v a s ) ; canvas . r e s t o r e ( ) ;

GSyC - 2009 Creaci on de Interfaces de Usuario: Creaci on de nuevas Views

Android: Fundamentos de la Creaci on de Aplicaciones

49

Mejora del aspecto de la TodoList (V)

Creamos un nuevo Layout para especicar c omo se dispondr an los elementos de la lista usando la nueva View:
res/layout/todolist item.xml <? xml v e r s i o n = 1 . 0 e n c o d i n g= u t f 8 ?> <com . r a s i . t o d o l i s t . T o d o L i s t I t e m V i e w x m l n s : a n d r o i d= h t t p : // sch em as . a n d r o i d . com/ apk / r e s / a n d r o i d a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= f i l l p a r e n t a n d r o i d : p a d d i n g= 10 dp a n d r o i d : s c r o l l b a r s = v e r t i c a l a n d r o i d : t e x t C o l o r= @ c o l o r / n o t e p a d t e x t a n d r o i d : f a d i n g E d g e= v e r t i c a l />

2 4 6 8 10

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

50

Creaci on de Interfaces de Usuario: Creaci on de nuevas Views

Mejora del aspecto de la TodoList (VI)


Ahora en el onCreate de ToDoList.java reemplazamos los par ametros pasados al ArrayAdapter para hacer uso del nuevo Layout. ANTES:
src/com.rasi.todolist/TodoListItemView.java (fragmento) f i n a l A r r a y L i s t <S t r i n g > t o d o I t e m s = new A r r a y L i s t <S t r i n g > (); f i n a l A r r a y A d a p t e r <S t r i n g > aa ; aa = new A r r a y A d a p t e r <S t r i n g >( t h i s , android .R. layout . s i m p l e l i s t i t e m 1 , todoItems ) ; m y L i s t V i e w . s e t A d a p t e r ( aa ) ;

2 4

AHORA:
src/com.rasi.todolist/TodoListItemView.java (fragmento) 1 3 5 f i n a l A r r a y L i s t <S t r i n g > t o d o I t e m s = new A r r a y L i s t <S t r i n g > (); int resID = R. layout . to d o l i s t i t e m ; f i n a l A r r a y A d a p t e r <S t r i n g > aa ; aa = new A r r a y A d a p t e r <S t r i n g >( t h i s , r e s I D , t o d o I t e m s ) ; m y L i s t V i e w . s e t A d a p t e r ( aa ) ;

GSyC - 2009 Creaci on de IU: Creaci on de Controles Compuestos

Android: Fundamentos de la Creaci on de Aplicaciones

51

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones 52

GSyC - 2009

Creaci on de IU: Creaci on de Controles Compuestos

Creaci on de controles compuestos (I)


Un Control Compuesto es aquel formado por m ultiples Views que trabajan juntos. Al crearlo se dene su disposici on, apariencia y la interaci on entre sus Views. Se crean extendiendo un ViewGroup (o m as bien un Layout):
MyCompoundView.java 1 3 5 7 p u b l i c c l a s s MyCompoundView e x t e n d s L i n e a r L a y o u t { p u b l i c MyCompoundView ( C o n t e x t c o n t e x t ) { super ( context ) ; } p u b l i c MyCompoundView ( C o n t e x t c o n t e x t , A t t r i b u t e S e t a t t r s ) { super ( context , a t t r s ) ; } }

GSyC - 2009 Creaci on de IU: Creaci on de Controles Compuestos

Android: Fundamentos de la Creaci on de Aplicaciones

53

Creaci on de controles compuestos (II)


Para dise nar su interfaz de usuario se utiliza un Layout:
clearable edit text.xml <? xml v e r s i o n = 1 . 0 e n c o d i n g= u t f 8 ?> < L i n e a r L a y o u t x m l n s : a n d r o i d= h t t p : // s c h e m a s . a n d r o i d . com/ apk / r e s / a n d r o i d a n d r o i d : o r i e n t a t i o n= v e r t i c a l a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= f i l l p a r e n t > <E d i t T e x t a n d r o i d : i d=@+i d / e d i t T e x t a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= w r a p c o n t e n t /> <B u t t o n a n d r o i d : i d=@+i d / c l e a r B u t t o n a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= w r a p c o n t e n t a n d r o i d : t e x t= C l e a r /> </ L i n e a r L a y o u t>

2 4 6 8 10 12 14 16

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

54

Creaci on de IU: Creaci on de Controles Compuestos

Creaci on de controles compuestos (III)


Para asignar el Layout al nuevo control compuesto hay que redenir su constructor:
MyCompoundView.java (fragmento) 1 3 5 7 9 11 13 15 17 19 } } EditText editText ; Button c l e a r B u t t o n ; p u b l i c C l e a r a b l e E d i t T e x t ( Context context ) { super ( context ) ; // I n f l a t e t h e v i e w from t h e l a y o u t r e s o u r c e . S t r i n g i n f S e r v i c e = C o n t e x t . LAYOUT INFLATER SERVICE ; LayoutInflater l i ; l i = ( L a y o u t I n f l a t e r ) getContext ( ) . getSystemService ( i n f S e r v i c e ) ; l i . i n f l a t e (R . l a y o u t . c l e a r a b l e e d i t t e x t , t h i s , t r u e ) ; // Get r e f e r e n c e s t o t h e c h i l d c o n t r o l s . e d i t T e x t = ( E d i t T e x t ) f i n d V i e w B y I d (R . i d . e d i t T e x t ) ; c l e a r B u t t o n = ( B u t t o n ) f i n d V i e w B y I d (R . i d . c l e a r B u t t o n ) ; // Hook up t h e f u n c t i o n a l i t y hookupButton ( ) ;

GSyC - 2009 Creaci on de Interfaces de Usuario: Men us

Android: Fundamentos de la Creaci on de Aplicaciones

55

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones 56

GSyC - 2009

Creaci on de Interfaces de Usuario: Men us

Tipos de Men u
Men u de Opciones: El que aparece cuando se pulsa el bot on Men u o M del terminal. Consta de un men u de iconos y, en su caso, de un men u expandido:
Men u de Iconos: Hasta 6 elementos con un icono y/o texto. En cada elemento puede ir un submen u. Si se denen m as de 6 elementos, aparece un elemento llamado M as que mostrar a el men u expandido. Men u Expandido: Lista desplazable de los elementos del men u de opciones que no entraban dentro del men u de iconos.

Men u Contextual: Men u que se despliega al pulsar el bot on central del terminal, o al tocar prolongadamente la pantalla t actil. Submen u: Men u otante que se despliega al seleccionar una entrada denida como submen u en alguno de los men us anteriores. Dentro de un submen u NO puede haber otro.
GSyC - 2009 Creaci on de Interfaces de Usuario: Men us Android: Fundamentos de la Creaci on de Aplicaciones 57

Creaci on de un Men u de Opciones para una Actividad


Hay que redenir el m etodo OnCreateOptionsMenu, que se invocar a la primera vez que se muestre el men u de opciones de la Actividad. En la implementaci on redenida es necesario llamar al m etodo de la clase Activity. Para a nadir entradas al men u se utiliza el m etodo add de la clase Menu, que requiere los siguientes par ametros:
un identicador de grupo para poder agrupar entradas un identicador de la entrada, que permitir a saber qu e entrada se ha pulsado cuando se invoque el manejador onOptionsItemSelected. Cada identicador de una entrada deber a declararse como atributo de clase de la Actividad. un n umero de orden para la colocaci on de la entrada en el men u el texto de la entrada
static final p r i v a t e i n t MENU ITEM = Menu . FIRST ;

2 4 6 8 10 12 14 16 18 20

@Override p u b l i c b o o l e a n o n C r e a t e O p t i o n s M e n u ( Menu menu ) { s u p e r . o n C r e a t e O p t i o n s M e n u ( menu ) ; // Group ID int groupId = 0; // U n i q u e menu i t e m i d e n t i f i e r . Used f o r e v e n t h a n d l i n g . i n t m e n u I t e m I d = MENU ITEM ; // The o r d e r p o s i t i o n o f t h e i t e m i n t menuItemOrder = Menu .NONE; // Text t o be d i s p l a y e d f o r t h i s menu i t e m . i n t menuItemText = R . s t r i n g . menu item ; // C r e a t e t h e menu i t e m and k e e p a r e f e r e n c e t o i t . MenuItem menuItem = menu . add ( g r o u p I d , menuItemId , menuItemOrder , menuItemText ) ; return true ;

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

58

Creaci on de Interfaces de Usuario: Men us

Elementos del Men u de Opciones

La clase MenuItem permite a nadir detalles adicionales a la entrada:


Checkboxes o Radio Buttons, s olo visibles en el men u expandido o en un submen u. Atajos de teclado T tulos abreviados Iconos (s olo visibles en el men u de iconos) Manejador a ejecutar cuando se seleccione este elemento (NO recomendado, es m as eciente usar onOptionsItemSelected) Intenciones, que ser an activadas cuando se seleccione este elemento.

GSyC - 2009 Creaci on de Interfaces de Usuario: Men us

Android: Fundamentos de la Creaci on de Aplicaciones

59

Modicaci on din amica del Men u de Opciones

Puede modicarse un men u cada vez que se muestra redeniendo el m etodo onPrepareOptionsMenu:
@Override p u b l i c b o o l e a n o n P r e p a r e O p t i o n s M e n u ( Menu menu ) { s u p e r . o n P r e p a r e O p t i o n s M e n u ( menu ) ; MenuItem menuItem = menu . f i n d I t e m (MENU ITEM ) ; [ } ... m o d i f y menu i t e m s ... ]

2 4 6 8 10

return true ;

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

60

Creaci on de Interfaces de Usuario: Men us

Manejar las selecciones del men u


A trav es del u nico manejador onOptionsItemSelected. El elemento seleccionado se recibe como par ametro MenuItem. Habr a que comparar su identicador con los establecidos al crear el men u:
p u b l i c b o o l e a n o n O p t i o n s I t e m S e l e c t e d ( MenuItem i t e m ) { super . onOptionsItemSelected ( item ) ; // F i n d w h i c h menu i t e m h a s b e e n s e l e c t e d switch ( item . getItemId ( ) ) { // Check f o r e a c h known menu i t e m c a s e (MENU ITEM ) : [ . . . P e r f o r m menu h a n d l e r a c t i o n s return true ;

2 4 6 8 10 12 14

...

// R e t u r n f a l s e return false ;

i f you h a v e n o t h a n d l e d t h e menu i t e m .

GSyC - 2009 Creaci on de Interfaces de Usuario: Men us

Android: Fundamentos de la Creaci on de Aplicaciones

61

Creaci on de un Submen u

A trav es de addSubMenu, que admite los mismos par ametros que add para a nadir elementos normales. Los elementos de dentro del submen u se gestionan igual que los del men u de opciones. Adicionalmente se puede a nadir un icono para el men u de opciones y para la cabecera del submen u cuando se muestre.
SubMenu s u b = menu . addSubMenu ( 0 , 0 , Menu . NONE, Submenu ) ; s u b . s e t H e a d e r I c o n (R . d r a w a b l e . i c o n ) ; s u b . s e t I c o n (R . d r a w a b l e . i c o n ) ; MenuItem submenuItem = s u b . add ( 0 , 0 , Menu . NONE, Submenu I t e m ) ;

2 4

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

62

Creaci on de Interfaces de Usuario: Men us

Men us Contextuales
Puede crearse un men u contextual para una Actividad redeniendo su m etodo onCreateContextMenu y registrando la View que lo usar a:
1 3 5 7 9 11 13 } @Override p u b l i c v o i d o n C r e a t e C o n t e x t M e n u ( ContextMenu menu , View v , ContextMenu . C o n t e x t M e n u I n f o m e n u I n f o ) { s u p e r . o n C r e a t e C o n t e x t M e n u ( menu , v , m e n u I n f o ) ; menu . s e t H e a d e r T i t l e ( C o n t e x t Menu ) ; menu . add ( 0 , menu . FIRST , Menu . NONE, I t e m 1 ) . s e t I c o n (R . d r a w a b l e . menu item ) ; menu . add ( 0 , menu . FIRST+1 , Menu . NONE, I t e m 2 ) . s e t C h e c k a b l e ( t r u e ) ; menu . add ( 0 , menu . FIRST+2 , Menu . NONE, I t e m 3 ) . s e t S h o r t c u t ( 3 , 3 ) ; SubMenu s u b = menu . addSubMenu ( Submenu ) ; s u b . add ( Submenu I t e m ) ;

Las selecciones de un men u contextual se manejan de forma similar a las del men u de opciones, redeniendo el m etodo onContextItemSelected de la Actividad:
1 3 5 7 } @Override p u b l i c b o o l e a n o n C o n t e x t I t e m S e l e c t e d ( MenuItem i t e m ) { super . onContextItemSelected ( item ) ; [ ... H a n d l e menu i t e m s e l e c t i o n ... ]

return false ;

GSyC - 2009 Creaci on de Interfaces de Usuario: Men us

Android: Fundamentos de la Creaci on de Aplicaciones

63

Men us para la TodoList (I)


Creamos dos cheros .png para iconos del men u: Uno con un signo + para a nadir una nueva tarea (add_new_item.png), y otro con un aspa para borrar una tarea (remove_item.png). Copiamos las im agenes a la carpeta res/drawable. Modicamos el chero res/values/strings.xml para denir los textos para los men us:
res/values/strings.xml <? xml v e r s i o n = 1 . 0 e n c o d i n g= u t f 8 ?> < r e s o u r c e s> < s t r i n g name= app name >To Do L i s t</ s t r i n g> < s t r i n g name= add new >Add New I t e m</ s t r i n g> < s t r i n g name= remove >Remove I t e m</ s t r i n g> < s t r i n g name= c a n c e l >C a n c e l</ s t r i n g> </ r e s o u r c e s>

2 4 6

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

64

Creaci on de Interfaces de Usuario: Men us

Men us para la TodoList (II)


Creamos un nuevo tema para la aplicaci on creando un nuevo chero res/values/styles.xml, basado en un tema est andar de Android y jando un tama no del texto:
res/values/styles.xml 1 3 5 <? xml v e r s i o n = 1 . 0 e n c o d i n g= u t f 8 ?> < r e s o u r c e s> < s t y l e name=ToDoTheme p a r e n t= @ a n d r o i d : s t y l e /Theme . B l a c k > <i t e m name= a n d r o i d : t e x t S i z e >12 s p</ i t e m> </ s t y l e> </ r e s o u r c e s>

Aplicamos el tema a la Aplicaci on en el maniesto:


AndroidManifest.xml < a c t i v i t y a n d r o i d : n a m e= . T o D o L i s t a n d r o i d : l a b e l= @ s t r i n g / app name a n d r o i d : t h e m e= @ s t y l e /ToDoTheme>

GSyC - 2009 Creaci on de Interfaces de Usuario: Men us

Android: Fundamentos de la Creaci on de Aplicaciones

65

Men us para la TodoList (III)

A nadimos constantes para denir los identicadores de los elementos del men u:
src/com.rasi.todolist/TodoList.java (fragmento) 1 static static final final p r i v a t e i n t ADD NEW TODO = Menu . FIRST ; p r i v a t e i n t REMOVE TODO = Menu . FIRST + 1 ;

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

66

Creaci on de Interfaces de Usuario: Men us

Men us para la TodoList (IV)


Redenimos onCreateOptionsMenu para a nadir los elementos del men u de opciones:
src/com.rasi.todolist/TodoList.java (fragmento) @Override p u b l i c b o o l e a n o n C r e a t e O p t i o n s M e n u ( Menu menu ) { s u p e r . o n C r e a t e O p t i o n s M e n u ( menu ) ; // C r e a t e and add new menu i t e m s . MenuItem itemAdd = menu . add ( 0 , ADD NEW TODO, Menu . NONE, R . s t r i n g . add new ) ; MenuItem itemRem = menu . add ( 0 , REMOVE TODO, Menu . NONE, R . s t r i n g . remove ) ; // A s s i g n i c o n s itemAdd . s e t I c o n (R . d r a w a b l e . a d d n e w i t e m ) ; itemRem . s e t I c o n (R . d r a w a b l e . r e m o v e i t e m ) ; // A l l o c a t e s h o r t c u t s t o e a c h o f them . itemAdd . s e t S h o r t c u t ( 0 , a ) ; itemRem . s e t S h o r t c u t ( 1 , r ) ; return true ;

2 4 6 8 10 12 14 16 18

GSyC - 2009 Creaci on de Interfaces de Usuario: Men us

Android: Fundamentos de la Creaci on de Aplicaciones

67

Men us para la TodoList (V)


Para crear un men u contextual primero modicamos onCreate para indicar que la ListView tendr a dicho men u:
src/com.rasi.todolist/TodoList.java (fragmento) 1 3 5 7 } Override p u b l i c void onCreate ( Bundle o n S a v e I n s t a n c e S t a t e ) { [ ... e x i s t i n g o n C r e a t e method . . . ]

registerForContextMenu ( myListView ) ;

Ahora redenimos onCreateContextMenu:


src/com.rasi.todolist/TodoList.java (fragmento) 1 3 5 7 9 } @Override p u b l i c v o i d o n C r e a t e C o n t e x t M e n u ( ContextMenu menu , View v , ContextMenu . C o n t e x t M e n u I n f o m e n u I n f o ) { s u p e r . o n C r e a t e C o n t e x t M e n u ( menu , v , m e n u I n f o ) ; menu . s e t H e a d e r T i t l e ( S e l e c t e d To Do I t e m ) ; menu . add ( 0 , REMOVE TODO, Menu . NONE, R . s t r i n g . remove ) ;

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

68

Creaci on de Interfaces de Usuario: Men us

Men us para la TodoList (VI)


En el m etodo onCreate necesitamos que la lista de items, el ArrayAdapter y los controles tengan visibilidad en otros m etodos, as que los convertimos en atributos:
src/com.rasi.todolist/TodoList.java (fragmento) 1 3 5 7 9 11 13 15 17 19 21 } private private private private A r r a y L i s t <S t r i n g > t o d o I t e m s ; ListView myListView ; EditText myEditText ; A r r a y A d a p t e r <S t r i n g > aa ;

@Override p u b l i c void onCreate ( Bundle s a v e d I n s t a n c e S t a t e ) { super . onCreate ( savedInstanceState ) ; // I n f l a t e y o u r v i e w s e t C o n t e n t V i e w (R . l a y o u t . main ) ; // Get r e f e r e n c e s t o UI w i d g e t s m y L i s t V i e w = ( L i s t V i e w ) f i n d V i e w B y I d (R . i d . m y L i s t V i e w ) ; m y E d i t T e x t = ( E d i t T e x t ) f i n d V i e w B y I d (R . i d . m y E d i t T e x t ) ; t o d o I t e m s = new A r r a y L i s t <S t r i n g > (); [ ... r e s t o f e x i s t i n g o n C r e a t e method . . . ]

GSyC - 2009 Creaci on de Interfaces de Usuario: Men us

Android: Fundamentos de la Creaci on de Aplicaciones

69

Men us para la TodoList (VII)


Redenimos onPrepareOptionsMenu para que muestre Cancel en vez de Delete mientras se est a a nadiendo una entrada:
src/com.rasi.todolist/TodoList.java (fragmento) 1 3 5 7 9 11 13 15 17 } p r i v a t e b o o l e a n addingNew = f a l s e ; @Override p u b l i c b o o l e a n o n P r e p a r e O p t i o n s M e n u ( Menu menu ) { s u p e r . o n P r e p a r e O p t i o n s M e n u ( menu ) ; i n t i d x = myListView . g e t S e l e c t e d I t e m P o s i t i o n ( ) ; S t r i n g r e m o v e T i t l e = g e t S t r i n g ( addingNew ? R . s t r i n g . c a n c e l : R . s t r i n g . remove ) ; MenuItem r e m o v e I t e m = menu . f i n d I t e m (REMOVE TODO ) ; removeItem . s e t T i t l e ( r e m o v e T i t l e ) ; r e m o v e I t e m . s e t V i s i b l e ( addingNew | | i d x > 1); return true ;

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

70

Creaci on de Interfaces de Usuario: Men us

Men us para la TodoList (VIII)


Redenimos onOptionsItemSelected en funci on de los m etodos cancelAdd, addNewItem y removeItem que deniremos luego:
src/com.rasi.todolist/TodoList.java (fragmento) 1 3 5 7 9 11 13 15 17 19 21 23 } @Override p u b l i c b o o l e a n o n O p t i o n s I t e m S e l e c t e d ( MenuItem i t e m ) { super . onOptionsItemSelected ( item ) ; i n t index = myListView . g e t S e l e c t e d I t e m P o s i t i o n ( ) ; switch ( item . getItemId ( ) ) { c a s e (REMOVE TODO ) : { i f ( addingNew ) { cancelAdd ( ) ; } else { removeItem ( i n d e x ) ; } return true ; } c a s e (ADD NEW TODO ) : { addNewItem ( ) ; return true ; } } return false ;

GSyC - 2009 Creaci on de Interfaces de Usuario: Men us

Android: Fundamentos de la Creaci on de Aplicaciones

71

Men us para la TodoList (IX)


Redenimos onContextItemSelected:
src/com.rasi.todolist/TodoList.java (fragmento) @Override p u b l i c b o o l e a n o n C o n t e x t I t e m S e l e c t e d ( MenuItem i t e m ) { super . onContextItemSelected ( item ) ; switch ( item . getItemId ( ) ) { c a s e (REMOVE TODO ) : { AdapterView . AdapterContextMenuInfo menuInfo ; m e n u I n f o =( A d a p t e r V i e w . A d a p t e r C o n t e x t M e n u I n f o ) i t e m . g e t M e n u I n f o ( ) ; i n t i n d e x = menuInfo . p o s i t i o n ; removeItem ( i n d e x ) ; return true ;

2 4 6 8 10 12 14 16

} } return false ;

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

72

Creaci on de Interfaces de Usuario: Men us

Men us para la TodoList (X)


Denimos los m etodos de apoyo cancelAdd, addNewItem y removeItem:
src/com.rasi.todolist/TodoList.java (fragmento) 1 3 5 7 9 11 13 15 p r i v a t e void cancelAdd () { addingNew = f a l s e ; m y E d i t T e x t . s e t V i s i b i l i t y ( View . GONE ) ; } p r i v a t e v o i d addNewItem ( ) { addingNew = t r u e ; m y E d i t T e x t . s e t V i s i b i l i t y ( View . VISIBLE ) ; myEditText . r e q u e s t F o c u s ( ) ; } index ) { p r i v a t e void removeItem ( i n t t o d o I t e m s . remove ( i n d e x ) ; aa . n o t i f y D a t a S e t C h a n g e d ( ) ; }

GSyC - 2009 Creaci on de Interfaces de Usuario: Men us

Android: Fundamentos de la Creaci on de Aplicaciones

73

Men us para la TodoList (XI)


Dentro de onCreate, modicamos onKeyListener para incluir una llamada a cancelAdd despu es de a nadir un item:
src/com.rasi.todolist/TodoList.java (fragmento) 1 3 5 7 9 11 13 m y E d i t T e x t . s e t O n K e y L i s t e n e r ( new O n K e y L i s t e n e r ( ) { p u b l i c b o o l e a n onKey ( View v , i n t keyCode , KeyEvent e v e n t ) { i f ( e v e n t . g e t A c t i o n ( ) == KeyEvent . ACTION DOWN) i f ( keyCode == KeyEvent . KEYCODE DPAD CENTER) { t o d o I t e m s . add ( 0 , m y E d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ; myEditText . s e t T e x t ( ) ; aa . n o t i f y D a t a S e t C h a n g e d ( ) ; cancelAdd ( ) ; return true ; } return false ; } });

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

74

Creaci on de Interfaces de Usuario: Men us

Men us para la TodoList (XII)

Modicamos el layout res/layout/main.xml para que la caja de texto est e oculta hasta que se elija la opci on de a nadir un nuevo elemento.
res/layout/main.xml (fragmento) <E d i t T e x t a n d r o i d : i d=@+i d / m y E d i t T e x t a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= w r a p c o n t e n t a n d r o i d : t e x t= a n d r o i d : v i s i b i l i t y = gone />

2 4 6

GSyC - 2009 Bibliograf a

Android: Fundamentos de la Creaci on de Aplicaciones

75

Contenidos
1 2 3 4 5 6 7 8 9

El Maniesto de una Aplicaci on Android Creaci on y destrucci on de Aplicaciones y Actividades Recursos de las Aplicaciones Android Creaci on de Interfaces de Usuario: Views Creaci on de Interfaces de Usuario: Layouts Creaci on de Interfaces de Usuario: Creaci on de nuevas Views Creaci on de Interfaces de Usuario: Creaci on de Controles Compuestos Creaci on de Interfaces de Usuario: Men us Bibliograf a
Android: Fundamentos de la Creaci on de Aplicaciones 76

GSyC - 2009

Bibliograf a

Bibliograf a

Cap tulos 3 y 4 de Professional Android Application Development. Reto Meier. Ed. Wrox, 2009. Cap tulos 2 y 3 de Hello, Android. Introducing Googles Mobile Development Platform. Ed Burnette. Ed. The Pragmatic Bookshelf, 2009. Documentaci on del Android SDK: en la carpeta docs del directorio del SDK, o en http://developer.android.com/guide/index.html Documentaci on sobre Android (tutoriales, v deos,...): http://developer.android.com

GSyC - 2009

Android: Fundamentos de la Creaci on de Aplicaciones

77

También podría gustarte