Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2 Appbasics
2 Appbasics
Octubre de 2009
GSyC - 2009
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
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
GSyC - 2009
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
GSyC - 2009
Nodo permission:
Define un permiso que se requiere para que otras aplicaciones
puedan acceder a partes restringidas de la aplicacion
Las otras aplicaciones necesitaran poner un uses-permission
en su Manifiesto para utilizar este permiso
2
4
GSyC - 2009
Nodo instrumentation:
Permite definir tests de ejecucion 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>
Mas informaci
on sobre el manifiesto en:
http://code.google.com/android/devel/bblocks-manifest.html
GSyC - 2009
10
Creaci
on y destrucci
on de Aplicaciones y Actividades
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
11
Creaci
on y destrucci
on de Aplicaciones y Actividades
Las time
Aplicaciones
Android
no son
lasof each
aplicaciones
en los sistemas
manages the process
of each application,
andiguales
by extensionathat
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, influences
ocupa
toda la pantalla.
the likelihood that the run time will terminate it and the Activities running within it.
Las Aplicaciones estan formadas por Actividades (pantallas).
Activity Stacks
Al arrancar
una nueva aplicacion, pasa a primer plano situando una
The state of each Activity is determined by its position on the Activity stack, a last-infirst-out collection
of all the currently running Activities. When a new Activity starts, the current foreground screen is
Actividad
encima
de la que hubiera, formandose 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 influenced by its highest-priority
cimaActivity.
de laThePila
(cerrando
la uses
aplicaci
oton determine
en su the
caso).
Android
memory manager
this stack
priority of applications based
on their Activities when deciding which application to terminate to free resources.
New Activity
Active Activity
New Activity
started
Back button
pushed or
activity closed
Removed to
free resources
Previous Activities
Activity Stack
Figure 3-7
GSyC - 2009
Activity States
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:
12
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 terminacion
en cualquier momento
GSyC - 2009
13
Creaci
on y destrucci
on de Aplicaciones y Actividades
14
Creaci
on y destrucci
on de Aplicaciones y Actividades
2
4
6
8
10
12
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 ) ;
}
}
a n 3:
d r o iCreating
d : l a b e l= @Applications
s t r i n g / app name and Activities
Chapter
<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 >
<i n t e n t f i l t e r >
to free resources for higher-priority
generally
<a c t i o n applications
a n d r o i d : n a
m e=
a n d r o ithose
d . i n that
t e n tare
. a cinteracting
t i o n . MAIN />
with the user at the time.
The<c
prioritization
discussed
5
a t e g o r y a nprocess
d r o i d : nisa m
e= a n d rin
o i the
d . i next
n t e nsection.
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
15
Creaci
oton reclaim
y destrucci
on de Aplicaciones
y Actividades
in which processes are killed
resources
is determined
by the priority of the hosted
ns. An applications priority is equal to its highest-priority component.
Procesos y prioridades
o applications have the same priority, the process that has been at a lower priority longest
led first. Process priority is also affected by interprocess dependencies; if an application has a
El ordensupplied
en que los
se van matando
para liberar
recursos lo determina las
cy on a Service or Content Provider
by aprocesos
second application,
the secondary
applicahave at least as high a priority
as
the
application
it
supports.
prioridades de la aplicaciones que alojan.
Arbol
de prioridades:
ndroid applications will remain running and in memory until the system needs its resources for
applications.
Prioridad Crtica:
1. Active Process
2. Visible Process
Critical Priority
High Priority
4. Background Process
5. Empty Process
Figure 3-3
Low Priority
Prioridad Alta:
Procesos visibles: Visibles, pero no activos (p.ej,
parcialmente tapados por otra actividad). Hay muy pocos
y se les mata solo en circunstancias extremas.
Procesos de servicios arrancados: Procesamiento que
debe continuar aunque no tenga interfaz visible. Se les
mata solo en circunstancias extremas.
Prioridad Baja:
Procesos de fondo: Alojan actividades que no caen en
las categoras anteriores. Hay muchos. Se les mata
cuando se necesitan recursos para el resto de procesos.
Procesos vacos: Android mantiene en memoria las
aplicaciones que han terminado, por si son relanzadas. Se
les mata rutinariamente.
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
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:
16
Creaci
on y destrucci
on de Aplicaciones y Actividades
I T S A LIVE !
37
17
Creaci
on y destrucci
on de Aplicaciones y Actividades
its lifetime,
each activity(II)
of an Android program can be in one of
During
Estados de
una
Actividad
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, youLa
do get
notified when
the
state is about
Activo
(Running):
Actividad
est
a encima
de to
la change
pila, es
through the onXX () method calls.
18
Creaci
on y destrucci
on de Aplicaciones y Actividades
// 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
}
GSyC - 2009
is
visible .
19
Creaci
on y destrucci
on de Aplicaciones y Actividades
onCreate(Bundle):
Se invoca cuando la Actividad se arranca por primera vez.
Se utiliza para tareas de inicializacion a realizar una sola vez,
como crear la interfaz de usuario de la Actividad.
Su parametro es null o informacion 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
20
Creaci
on y destrucci
on de Aplicaciones y Actividades
onStop():
Se invoca cuando la actividad va a dejar de ser visible y no se
necesitara durante un tiempo.
Si hay escasez de recursos en el sistema, este metodo podra 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 metodo podra no
llegar a ser invocado y la Actividad ser destruida directamente.
GSyC - 2009
21
Creaci
on y destrucci
on de Aplicaciones y Actividades
onSaveInstanceState(Bundle):
Se invoca para permitir a la actividad guardar su estado, p.ej:
la posicion del cursor en una caja de texto.
Normalmente no necesita ser redefinido 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 redefinido porque la
implementaci
on de la clase Activity ya recupera todo el
estado de todos los componentes de la Interfaz de Usuario.
GSyC - 2009
22
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
23
Tipos de recursos
GSyC - 2009
24
Valores simples
Definen Strings, colores o dimensiones
Se definen 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>
25
Drawables
GSyC - 2009
26
Animaciones
GSyC - 2009
27
Menus
GSyC - 2009
28
Layouts
GSyC - 2009
29
Estilos
GSyC - 2009
30
31
<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 />
@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
32
// 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
33
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 ) ;
11
13
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 ) ;
15
int []
GSyC - 2009
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
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
GSyC - 2009
35
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 ) ;
<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
/>
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
36
Creaci
on de Interfaces de Usuario: Views
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
37
Creaci
on de Interfaces de Usuario: Views
Terminologa
GSyC - 2009
38
Creaci
on de Interfaces de Usuario: Views
@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 ) ;
GSyC - 2009
39
Creaci
on de Interfaces de Usuario: Views
40
Creaci
on de Interfaces de Usuario: Layouts
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
41
Creaci
on de Interfaces de Usuario: Layouts
GSyC - 2009
42
Creaci
on de Interfaces de Usuario: Layouts
Ejemplo:
1
3
5
7
9
11
13
15
GSyC - 2009
43
Creaci
on de Interfaces de Usuario: Creaci
on de nuevas Views
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
44
Creaci
on de Interfaces de Usuario: Creaci
on de nuevas Views
2
4
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 ) ;
10
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 ) ;
12
14
@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
16
18
...
// 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 ) ;
20
. . . 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
...
22
24
@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 . . . ]
26
28
30
32
// 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
45
Creaci
on de Interfaces de Usuario: Creaci
on de nuevas Views
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 ();
}
15
17
19
21
23
25
27
29
31
@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
46
Creaci
on de Interfaces de Usuario: Creaci
on de nuevas Views
2
4
6
GSyC - 2009
47
Creaci
on de Interfaces de Usuario: Creaci
on de nuevas Views
2
4
6
8
private
private
private
private
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 ( ) ;
10
// 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 ) ) ;
12
14
16
18
Paint marginPaint ;
Paint l i n e P a i n t ;
int paperColor ;
f l o a t margin ;
// 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
48
Creaci
on de Interfaces de Usuario: Creaci
on de nuevas Views
@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 );
7
9
11
// 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 ) ;
13
15
// 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 ) ;
17
19
21
// 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
49
Creaci
on de Interfaces de Usuario: Creaci
on de nuevas Views
2
4
6
8
10
GSyC - 2009
50
Creaci
on de Interfaces de Usuario: Creaci
on de nuevas Views
2
4
AHORA:
src/com.rasi.todolist/TodoListItemView.java (fragmento)
1
3
5
GSyC - 2009
51
Creaci
on de IU: Creaci
on de Controles Compuestos
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
52
Creaci
on de IU: Creaci
on de Controles Compuestos
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
53
Creaci
on de IU: Creaci
on de Controles Compuestos
2
4
6
8
10
12
14
16
GSyC - 2009
54
Creaci
on de IU: Creaci
on de Controles Compuestos
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 ) ;
9
11
13
// 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 ) ;
15
17
19
// Hook up t h e f u n c t i o n a l i t y
hookupButton ( ) ;
GSyC - 2009
55
Creaci
on de Interfaces de Usuario: Men
us
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
56
Creaci
on de Interfaces de Usuario: Men
us
Tipos de Menu
Men
u de Opciones: El que aparece cuando se pulsa el boton
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 definen mas de 6
elementos, aparece un elemento llamado Mas que
mostrara 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 boton
central del terminal, o al tocar prolongadamente la pantalla
tactil.
Submen
u: Men
u flotante que se despliega al seleccionar una
entrada definida como submen
u en alguno de los men
us
anteriores. Dentro de un submen
u NO puede haber otro.
GSyC - 2009
57
Creaci
on de Interfaces de Usuario: Men
us
2
4
6
static
@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 ;
8
10
12
14
16
18
20
final
// 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
58
Creaci
on de Interfaces de Usuario: Men
us
GSyC - 2009
59
Creaci
on de Interfaces de Usuario: Men
us
2
4
@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 ) ;
8
10
...
m o d i f y menu i t e m s
...
return true ;
GSyC - 2009
60
Creaci
on de Interfaces de Usuario: Men
us
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 ( ) ) {
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
61
Creaci
on de Interfaces de Usuario: Men
us
Creacion de un Submenu
2
4
GSyC - 2009
62
Creaci
on de Interfaces de Usuario: Men
us
Menus Contextuales
Puede crearse un men
u contextual para una Actividad redefiniendo su metodo
onCreateContextMenu y registrando la View que lo usara:
1
3
5
@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 ) ;
7
9
11
13
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 ) ;
@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 ) ;
return false ;
...
H a n d l e menu i t e m s e l e c t i o n
...
GSyC - 2009
63
Creaci
on de Interfaces de Usuario: Men
us
2
4
6
GSyC - 2009
64
Creaci
on de Interfaces de Usuario: Men
us
<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
65
Creaci
on de Interfaces de Usuario: Men
us
A
nadimos constantes para definir los identificadores de los
elementos del men
u:
src/com.rasi.todolist/TodoList.java (fragmento)
1
static
static
GSyC - 2009
final
final
66
Creaci
on de Interfaces de Usuario: Men
us
2
4
@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 ) ;
6
8
10
// 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 ) ;
12
14
16
18
// 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 ;
GSyC - 2009
67
Creaci
on de Interfaces de Usuario: Men
us
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 ) {
5
7
...
e x i s t i n g o n C r e a t e method . . .
registerForContextMenu ( myListView ) ;
@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 ) ;
7
9
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
68
Creaci
on de Interfaces de Usuario: Men
us
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 ) ;
11
13
15
// 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 ) ;
17
19
21
...
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
69
Creaci
on de Interfaces de Usuario: Men
us
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 ) ;
5
7
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 ) ;
11
13
15
17
return true ;
GSyC - 2009
70
Creaci
on de Interfaces de Usuario: Men
us
@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 ( ) ;
9
11
13
15
17
19
21
23
return false ;
GSyC - 2009
71
Creaci
on de Interfaces de Usuario: Men
us
2
4
6
8
@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 ;
10
removeItem ( i n d e x ) ;
return true ;
12
14
16
}
}
return false ;
GSyC - 2009
72
Creaci
on de Interfaces de Usuario: Men
us
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
73
Creaci
on de Interfaces de Usuario: Men
us
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
74
Creaci
on de Interfaces de Usuario: Men
us
2
4
6
<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
/>
GSyC - 2009
75
Bibliografa
Contenidos
1
Creaci
on y destrucci
on de Aplicaciones y Actividades
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
Bibliografa
GSyC - 2009
76
Bibliografa
Bibliografa
GSyC - 2009
77