Développement Mobile sur Android
Master CCI
1 2 . 1
Organisation de l'enseignement
Objec fs :
Connaître les différents composants d'une applica on Android
Savoir organiser une applica on
Savoir u liser une documenta on
Progresser en Java
Évalua on :
Seuls les TP seront évalués
Il est important de venir à tous les TP
Les notes sont individuelles
Vous devez donc travailler seul
Le projet
Un réveil :
2 . 3
Démo du projet
Les fonctionnalités du projet
Ajout d'une alarme
Modifica on de l'heure des alarmes
Ac va on/Désac va on d'une alarme
Suppression d'une alarme
No fica on de l'u lisa on
Sonnerie de l'alarme
Réveil de l'écran en cas de sonnerie
Possibilité d'arrêter l'alarme
2 . 5
Les outils pour développer sur Android
Nous devons u liser le SDK d'Android qui fournit :
les librairies Java d'Android
un émulateur pour tester vos applica ons
des images du système Android
Nous devons u liser Java donc il faut :
Maîtriser les concepts de la programma on objet
Savoir lire une documenta on Java
Nous devons u liser un IDE adapté, c'est‐à‐dire, Android Studio :
Première étape du TP, la configura on de l'IDE
Il est basé sur IntelliJ IDEA de Jet Brains
2 . 7
2 . 9
Émulateur
Installation
2 . 11
Création d'une machine virtuelle
2 . 13
Les composants d'une application
Ac vités : les différents écrans de l'applica on
Services : un composant qui s'exécute en tâche de fond
Fournisseur de contenu : ges on et partage des données
Receveur de broadcasts : recep on de no fica ons
AlarmActivity
FireActivity
AlarmProvider
FireService
Sécurité dans le système Android
Chaque applica on est exécutée dans une sandbox (bac à sable) :
Android est système Linux mul ‐u lisateur
Chaque applica on est un u lisateur différent
Chaque fichier de l'applica on n'est accessible que par elle
Par défaut, chaque processus possède sa machine virtuelle
Chaque applica on a son propre processus Linux
2 . 15
Communication entre composants
Les ac vités, les services et les receveurs de broadcasts sont
ac vés par des messages asynchrones : les intents
I n t e n t i n t e n t = n e w I n t e n t ( c o n t e x t , F i r e S e r v i c e . c l a s s ) i n t e n t . s e t A c t i o n ( F i r e S e r v i c e . A C T I O N _ F I R E ) ;Les fournisseurs de contenu sont ac vés par des requêtes
effectuées à l'aide d'un résolveur de contenu.
Une requête est composée :
d'une URI de la forme
content://authority/path
d'une ac on
query
,
delete
,
update
ou
insert
U r i u r i = U r i . p a r s e ( " c o n t e n t : / / f r . u n i v _ a m u . c c i . a l a r m / a l a r m s " ) ; r e s o l v e r . i n s e r t ( u r i , v a l u e s ) ;
Quelques classes d'Android
Activity
Intent
ContentProvider
Service
BroadcastReceiver
ContentResolver
View
Cursor
2 . 17
Structure d'un projet
Manifeste
Code Java
Ressources
Manifeste d'une application
< 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 c h e m a s . a n d r o i d . c o m / a p k / r e s / a n d r o i d " p a c k a g e = " c o m . u n i v _ a m u . c c i . c o m . a l a r m " > < 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 . R E C E I V E _ B O O T _ C O M P L E T E D " / > < a p p l i c a t i o n a n d r o i d : i c o n = " @ m i p m a p / i c _ l a u n c h e r " a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e " > < a c t i v i t y a n d r o i d : n a m e = " c o m . u n i v _ a m u . c c i . a l a r m . v i e w s . A l a r m A c t i v i t y " > < 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 . M A I N " / > < 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 . L A U N C H E R " / > < / i n t e n t - f i l t e r > < / a c t i v i t y > < p r o v i d e r a n d r o i d : a u t h o r i t i e s = " c o m . u n i v _ a m u . c c i . a l a r m " a n d r o i d : n a m e = " c o m . u n i v _ a m u . c c i . a l a r m . m o d e l . A l a r m P r o v i d e r " / > < s e r v i c e a n d r o i d : n a m e = " c o m . u n i v _ a m u . c c i . a l a r m . s e r v i c e . F i r e S e r v i c e " / > < r e c e i v e r a n d r o i d : n a m e = " c o m . u n i v _ a m u . c c i . a l a r m . s e r v i c e . U p d a t e B r o a d c a s t R e c e i v e r " > < 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 . B O O T _ C O M P L E T E D " / > < / i n t e n t - f i l t e r > < / r e c e i v e r > < / a p p l i c a t i o n > < / m a n i f e s t >Une activité :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; R e l a t i v e L a y o u t l a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ; T e x t V i e w t e x t = n e w T e x t V i e w ( t h i s ) ; t e x t . s e t T e x t ( " H e l l o W o r l d ! " ) ; l a y o u t . a d d V i e w ( t e x t ) ; s e t C o n t e n t V i e w ( l a y o u t ) ; } }3 . 2
Déclaration de l'activité dans le manifeste
< 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 c h e m a s . a n d r o i d . c o m / a p k / r e s / a n d r o i d " p a c k a g e = " c o m . c c i . c a l c u l a t o r " > < a p p l i c a t i o n a n d r o i d : a l l o w B a c k u p = " t r u e " a n d r o i d : i c o n = " @ d r a w a b l e / i c _ l a u n c h e r " a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e " a n d r o i d : t h e m e = " @ s t y l e / A p p T h e m e " > < a c t i v i t y a n d r o i d : n a m e = " . M a i n 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 / a p p _ n a m e " > < 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 . M A I N " / > < 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 . L A U N C H E R " / > < / i n t e n t - f i l t e r > < / a c t i v i t y > < / a p p l i c a t i o n > < / m a n i f e s t >
3 . 4
Cycle de vie d'une activité :
Aucune méthode
main
dans un programme Android
Android exécute le code d'une ac vité en appelant des callbacks
Ces callbacks correspondent aux phrases de la vie d'une ac vité
Il n'est pas nécessaire d'implémenter toutes les callbacks
États durables d'une activité
Resumed
L'ac vité est au premier plan et l'u lisateur peut interagir avec elle
On dit aussi qu'elle est en train d'être exécutée
Paused
L'ac vité est par ellement recouverte par une autre ac vité qui se
trouve au premier plan
L'ac vité en pause ne peut pas recevoir d'ac on de l'u lisateur
Stopped
L'ac vité est totalement cachée et ne peut plus exécutée de code
Toutes ses informa ons sont conservées
3 . 6
États transitoires d'une activité
Created
L'ac vité vient d'être créée.
Started
L'ac vité vient de devenir visible.
Les
callbacks
p u b l i c c l a s s E x a m p l e A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p u b l i c v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { / * . . . * / } @ O v e r r i d e p r o t e c t e d v o i d o n S t a r t ( ) { / * . . . * / } @ O v e r r i d e p r o t e c t e d v o i d o n R e s u m e ( ) { / * . . . * / } @ O v e r r i d e p r o t e c t e d v o i d o n P a u s e ( ) { / * . . . . * / } @ O v e r r i d e p r o t e c t e d v o i d o n S t o p ( ) { / * . . . * / } @ O v e r r i d e p r o t e c t e d v o i d o n D e s t r o y ( ) { / * . . . * / } }3 . 8
Cycle de vie des activités
Mise en pause et reprise de l'activité
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n R e s u m e ( ) { s u p e r . o n R e s u m e ( ) ; o p e n C a m e r a ( ) ; } @ O v e r r i d e p r o t e c t e d v o i d o n P a u s e ( ) { s u p e r . o n P a u s e ( ) ; r e a l e a s e C a m e r a ( ) ; } }3 . 10
Sauvegarde de l'état de l'application
L'applica on est détruite dans les états
rouges
:
Sauvegarde de l'état de l'application
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p r i v a t e i n t v a l u e = 0 ; p r i v a t e B u t t o n b u t t o n ; @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; L i n e a r L a y o u t l a y o u t = n e w L i n e a r L a y o u t ( t h i s ) ; b u t t o n = n e w B u t t o n ( t h i s ) ; b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w O n C l i c k L i s t e n e r ( ) ) ; u p d a t e B u t t o n L a b e l ( ) ; l a y o u t . a d d V i e w ( b u t t o n ) ; s e t C o n t e n t V i e w ( l a y o u t ) ; } p u b l i c v o i d u p d a t e B u t t o n L a b e l ( ) { b u t t o n . s e t T e x t ( " " + v a l u e ) ; } p r i v a t e c l a s s O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { v a l u e + + ; u p d a t e B u t t o n L a b e l ( ) ; } } }3 . 12
Sauvegarde de l'état de l'application
Sauvegarde de l'état de l'application
3 . 14
Sauvegarde de l'état de l'application
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { / * . . . * / @ O v e r r i d e p r o t e c t e d v o i d o n R e s t o r e I n s t a n c e S t a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n R e s t o r e I n s t a n c e S t a t e ( s a v e d I n s t a n c e S t a t e ) ; v a l u e = s a v e d I n s t a n c e S t a t e . g e t I n t ( " v a l u e " ) ; u p d a t e B u t t o n L a b e l ( ) ; } @ O v e r r i d e p r o t e c t e d v o i d o n S a v e I n s t a n c e S t a t e ( B u n d l e o u t S t a t e ) { s u p e r . o n S a v e I n s t a n c e S t a t e ( o u t S t a t e ) ; o u t S t a t e . p u t I n t ( " v a l u e " , v a l u e ) ; } }
Les Bundles
Les Bundles peuvent associer des chaînes de caractères à des :
des types simples : en ers, flo ants, caractères...
des chaînes de caractères
des tableaux et des listes
des objets Parcelable
Quelques remarques :
Un Bundle est Parcelable
Un objet Parcelable peut être écrit dans un objet Parcel
Un Parcel est un conteneur pour un message
3 . 16
Quelques méthodes de la classe Bundle
putInt(String key, int value)
int getInt(String key)
putDouble(String key, double value)
double getDouble(String key)
putString(String key, String value)
String getString(String key)
putStringArrayList(String key, ArrayList<String> list)
ArrayList<String> getStringArrayList(String key)
putCharArray(String key, char[] array)
char[] getCharArray(String key)
Les vues
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; R e l a t i v e L a y o u t l a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ; T e x t V i e w t e x t = n e w T e x t V i e w ( t h i s ) ; t e x t . s e t T e x t ( " H e l l o W o r l d ! " ) ; l a y o u t . a d d V i e w ( t e x t ) ; s e t C o n t e n t V i e w ( l a y o u t ) ; } }Les classes View et ViewGroup
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; R e l a t i v e L a y o u t l a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ; T e x t V i e w t e x t = n e w T e x t V i e w ( t h i s ) ; t e x t . s e t T e x t ( " H e l l o W o r l d ! " ) ; l a y o u t . a d d V i e w ( t e x t ) ; s e t C o n t e n t V i e w ( l a y o u t ) ; } }Dans ce e exemple :
RelativeLayout
étend
ViewGroup
ViewGroup
étend
View
4 . 3
Les classes View et ViewGroup
Une vue est une classe qui étend
View
Une vue peut être dessinée à l'écran
Un groupe de vue étend
ViewGroup
et donc
View
Un groupe de vues peut contenir d'autres vues
Un groupe de vues organise l'affichage des vues qu'il con ent
4 . 5
Construction d'une vue en Java
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; R e l a t i v e L a y o u t r e l a t i v e L a y o u t = c r e a t e R e l a t i v e L a y o u t ( ) ; s e t C o n t e n t V i e w ( r e l a t i v e L a y o u t ) ; } p r i v a t e R e l a t i v e L a y o u t c r e a t e R e l a t i v e L a y o u t ( ) { R e l a t i v e L a y o u t r e l a t i v e L a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ; r e l a t i v e L a y o u t . s e t P a d d i n g ( 1 6 , 1 6 , 1 6 , 1 6 ) ; r e l a t i v e L a y o u t . a d d V i e w ( c r e a t e V e r t i c a l L a y o u t ( ) ) ; r e t u r n r e l a t i v e L a y o u t ; } p r i v a t e L i n e a r L a y o u t c r e a t e V e r t i c a l L a y o u t ( ) { L i n e a r L a y o u t v e r t i c a l L a y o u t = n e w L i n e a r L a y o u t ( t h i s ) ; v e r t i c a l L a y o u t . s e t O r i e n t a t i o n ( L i n e a r L a y o u t . V E R T I C A L ) ; v e r t i c a l L a y o u t . s e t L a y o u t P a r a m s ( n e w R e l a t i v e L a y o u t . L a y o u t P a r a m s ( V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T , V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T ) ) ; v e r t i c a l L a y o u t . a d d V i e w ( c r e a t e T e x t V i e w ( ) ) ; v e r t i c a l L a y o u t . a d d V i e w ( c r e a t e H o r i z o n t a l L a y o u t ( ) ) ; r e t u r n v e r t i c a l L a y o u t ; } }
Construction d'une vue en Java
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { / * . . . * / p r i v a t e T e x t V i e w c r e a t e T e x t V i e w ( ) { T e x t V i e w t e x t V i e w = n e w T e x t V i e w ( t h i s ) ; t e x t V i e w . s e t L a y o u t P a r a m s ( n e w L i n e a r L a y o u t . L a y o u t P a r a m s ( V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T , 0 , 1 . 0 f ) ) ; t e x t V i e w . s e t G r a v i t y ( G r a v i t y . C E N T E R ) ; t e x t V i e w . s e t T e x t S i z e ( 5 0 ) ; t e x t V i e w . s e t T e x t ( " T e x t V i e w " ) ; r e t u r n t e x t V i e w ; } p r i v a t e L i n e a r L a y o u t c r e a t e H o r i z o n t a l L a y o u t ( ) { L i n e a r L a y o u t h o r i z o n t a l L a y o u t = n e w L i n e a r L a y o u t ( t h i s ) ; h o r i z o n t a l L a y o u t . s e t O r i e n t a t i o n ( L i n e a r L a y o u t . H O R I Z O N T A L ) ; h o r i z o n t a l L a y o u t . s e t L a y o u t P a r a m s ( n e w L i n e a r L a y o u t . L a y o u t P a r a m s ( V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T , 0 , 1 . 0 f ) ) ; h o r i z o n t a l L a y o u t . a d d V i e w ( c r e a t e B u t t o n ( ) ) ; h o r i z o n t a l L a y o u t . a d d V i e w ( c r e a t e B u t t o n ( ) ) ; r e t u r n h o r i z o n t a l L a y o u t ; }4 . 7
Construction d'une vue en Java
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { / * . . . * / p r i v a t e B u t t o n c r e a t e B u t t o n ( ) { B u t t o n b u t t o n = n e w B u t t o n ( t h i s ) ; b u t t o n . s e t L a y o u t P a r a m s ( n e w L i n e a r L a y o u t . L a y o u t P a r a m s ( 0 , V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T , 1 . 0 f ) ) ; b u t t o n . s e t T e x t ( " B u t t o n " ) ; r e t u r n b u t t o n ; } }
Les évènements
On ajoute des écouteurs aux vues pour écouter les évènements :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p u b l i c i n t c o u n t = 0 ; @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; B u t t o n b u t t o n = n e w B u t t o n ( t h i s ) ; b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w M y O n C l i c k L i s t e n e r ( t h i s ) ) ; s e t C o n t e n t V i e w ( b u t t o n ) ; } }4 . 9
Les écouteurs
La méthode
setOnClickListener
prend en paramètre un objet qui
implémente l'interface
View.OnClickListener
:
p u b l i c i n t e r f a c e O n C l i c k L i s t e n e r { v o i d o n C l i c k ( V i e w v i e w ) ; }Une interface est associée à chaque type d'évènements
On observe les évènements en connectant des listeners
Pour cela, on u lise les méthodes
setOn*Listener
Ensuite, un évènement entraîne l'appel d'une méthode de
l'interface sur l'objet que vous avez connecté à la vue
Implémentation avec une classe classique
c l a s s M y O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r { p r i v a t e M a i n A c t i v i t y m a i n A c t i v i t y ; p u b l i c M y O n C l i c k L i s t e n e r ( M a i n A c t i v i t y m a i n A c t i v i t y ) { t h i s . m a i n A c t i v i t y = m a i n A c t i v i t y ; } @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { m a i n A c t i v i t y . c o u n t + + ; } }4 . 11
Implémentation avec une classe interne
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p u b l i c i n t c o u n t = 0 ; @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { / * . . . * / b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w M y O n C l i c k L i s t e n e r ( ) ) ; / * . . . * / } c l a s s M y O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { c o u n t + + ; } } }
Implémentation avec une classe anonyme
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p u b l i c i n t c o u n t = 0 ; @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; B u t t o n b u t t o n = n e w B u t t o n ( t h i s ) ; b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w V i e w . O n C l i c k L i s t e n e r ( ) { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { c o u n t + + ; } } ) ; s e t C o n t e n t V i e w ( b u t t o n ) ; } }5 . 1
Les ressources
elles sont en dehors du code et con ennent
les images
les chaînes de caractères
les modèles d'interfaces u lisateur
les anima ons...
elles sont choisies en fonc on de la configura on :
taille de l'écran
orienta on de l'écran
langue...
5 . 3
La classe R
Elle est génèrée automa quement par Android
Elle permet de désigner les ressources dans le code Java
Les layouts
La méthode
setContentView
peut prendre l'iden fiant d'un layout :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; } }
Le contenu du fichier
activity_main.xml
:
< R e l a t i v e L a y o u t x m l n 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 = " m a t c h _ 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 = " m a t c h _ p a r e n t " > < T e x t V i e w a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t 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 i z e = " 1 0 0 d p " a n d r o i d : t e x t = " H e l l o W o r l d ! " / > < / R e l a t i v e L a y o u t >Les layouts
Le contenu du fichier
activity_main.xml
:
< R e l a t i v e L a y o u t x m l n 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 = " m a t c h _ 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 = " m a t c h _ p a r e n t " > < T e x t V i e w a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t 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 i z e = " 1 0 0 d p " a n d r o i d : t e x t = " H e l l o W o r l d ! " / > < / R e l a t i v e L a y o u t >5 . 6
Les chaînes de caractères
Pour faciliter la traduc on des applica ons, il est préférable d'u liser
des références à des chaînes de caractères dans les programmes ou
les layouts :
< R e l a t i v e L a y o u t x m l n 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 = " m a t c h _ 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 = " m a t c h _ p a r e n t " > < T e x t V i e w a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t 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 / h e l l o _ w o r l d " / > < / R e l a t i v e L a y o u t >Les chaînes de caractères
Elles se trouvent dans le fichier
strings.xml
:
< r e s o u r c e s > < s t r i n g n a m e = " h e l l o _ w o r l d " > H e l l o w o r l d ! < / s t r i n g > < / r e s o u r c e s >Pour accéder aux chaînes de caractères en XML :
< R e l a t i v e L a y o u t . . . > < T e x t V i e w . . . a n d r o i d : t e x t = " @ s t r i n g / h e l l o _ w o r l d " / > < / R e l a t i v e L a y o u t >5 . 8
Les chaînes de caractères
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; R e l a t i v e L a y o u t l a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ; T e x t V i e w t e x t = n e w T e x t V i e w ( t h i s ) ; C o n t e x t c o n t e x t = t h i s ; t e x t . s e t T e x t ( R . s t r i n g . h e l l o _ w o r l d ) ; / * S t r i n g h e l l o W o r l d = c o n t e x t . g e t R e s o u r c e s ( ) . g e t T e x t ( R . s t r i n g . h e l l o _ w o r l d ) ; t e x t . s e t T e x t ( h e l l o W o r l d ) ; * / l a y o u t . a d d V i e w ( t e x t ) ; s e t C o n t e n t V i e w ( l a y o u t ) ; } }
Les références
Syntaxe pour désigner une ressource dans un document XML
@ [ < p a c k a g e _ n a m e > : ] < r e s o u r c e _ t y p e > / < r e s o u r c e _ n a m e >où
<package_name>
est le nom du paquet
<resource_type>
est le type de la ressource
<resource_name>
est
le nom du fichier qui con ent la ressource
ou la valeur de l'a ribut
android:name
d'un élément XML
< I m a g e V i e w
a n d r o i d : c o n t e n t D e s c r i p t i o n = " @ a n d r o i d : s t r i n g / o k "
5 . 10
Les dimensions
< R e l a t i v e L a y o u t x m l n s : a n d r o i d = " . . . " x m l n s : t o o l s = " h t t p : / / s c h e m a s . a n d r o i d . c o m / t o o l s " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " a n d r o i d : p a d d i n g L e f t = " @ d i m e n / a c t i v i t y _ h o r i z o n t a l _ m a r g i n " a n d r o i d : p a d d i n g R i g h t = " @ d i m e n / a c t i v i t y _ h o r i z o n t a l _ m a r g i n " a n d r o i d : p a d d i n g T o p = " @ d i m e n / a c t i v i t y _ v e r t i c a l _ m a r g i n " a n d r o i d : p a d d i n g B o t t o m = " @ d i m e n / a c t i v i t y _ v e r t i c a l _ m a r g i n " > < / R e l a t i v e L a y o u t >Les dimensions sont définies dans le fichier
dimens.xml
:
< r e s o u r c e s > < d i m e n n a m e = " a c t i v i t y _ h o r i z o n t a l _ m a r g i n " > 1 6 d p < / d i m e n > < d i m e n n a m e = " a c t i v i t y _ v e r t i c a l _ m a r g i n " > 1 6 d p < / d i m e n > < / r e s o u r c e s >Il est également possible d'accéder aux dimensions en Java :
f l o a t d i m e n s i o n = g e t R e s o u r c e s ( ) . g e t D i m e n s i o n ( R . d i m e n . a c t i v i t y _ h o r i z o n t a l _ m a r g i n ) ;Prise en charge des différentes configurations
Il est possible de définir des ressources en fonc on de :
l'orienta on du terminal
la résolu on
la taille de l'écran
la version de l'API
de la langue, etc.
Par exemple :
values/dimens.xml
: dimensions par défaut
values-w820dp/dimens.xml
: dim. pour des écrans de 820p
layout
: les layouts par défaut
layout-land
: les versions paysage des layouts
values-fr/strings.xml
: chaînes en français
5 . 12
Les images
Il est possible de stocker des images dans les ressources
Les images peuvent être stockées sous différentes résolu ons
La résolu on est choisie en fonc on du terminal de l'u lisateur
Les images
Avec un
ic_launcher.png
dans les sous‐répertoires
drawable-*
:
< I m a g e V i e w a n d r o i d : c o n t e n t D e s c r i p t i o n = " @ s t r i n g / h e l l o _ w o r l d " a n d r o i d : s r c = " @ d r a w a b l e / i c _ l a u n c h e r " a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t 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 " / > < I m a g e B u t t o n a n d r o i d : i d = " @ + i d / b u t t o n " a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t 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 : c o n t e n t D e s c r i p t i o n = " @ s t r i n g / c o u n t " a n d r o i d : s r c = " @ d r a w a b l e / i c _ l a u n c h e r " a n d r o i d : o n C l i c k = " c o u n t " / >
5 . 14
Les images
On désigne une image par son iden fiant :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; g e t W i n d o w ( ) . s e t B a c k g r o u n d D r a w a b l e R e s o u r c e ( R . d r a w a b l e . i c _ l a u n c h e r ) ; I m a g e V i e w i m a g e = ( I m a g e V i e w ) f i n d V i e w B y I d ( R . i d . i m a g e ) ; i m a g e . s e t I m a g e R e s o u r c e ( R . d r a w a b l e . i c _ l a u n c h e r ) ; } }Les images
un Drawable décrit par un fichier XML :
< r i p p l e x m l n s : a n d r o i d = " . . . " a n d r o i d : c o l o r = " ? a n d r o i d : c o l o r C o n t r o l H i g h l i g h t " > < i t e m > < s h a p e a n d r o i d : s h a p e = " o v a l " > < s o l i d a n d r o i d : c o l o r = " ? a n d r o i d : c o l o r A c c e n t " / > < / s h a p e > < / i t e m > < / r i p p l e >qui change avec l'état de l'élément sur lequel il est u lisé :
< s e l e c t o r x m l n s : a n d r o i d = " . . . " > < i t e m a n d r o i d : s t a t e _ s e l e c t e d = " t r u e " a n d r o i d : d r a w a b l e = " @ d r a w a b l e / s e l e c t e d _ n o t e _ b a c k g r o u n d " / > < i t e m a n d r o i d : d r a w a b l e = " @ d r a w a b l e / n o r m a l _ n o t e _ b a c k g r o u n d " / > < / s e l e c t o r >5 . 16
Les couleurs
Contenu du fichier
res/color/button_text.xml
:
< s e l e c t o r x m l n s : a n d r o i d = " . . . " > < i t e m a n d r o i d : s t a t e _ p r e s s e d = " t r u e " a n d r o i d : c o l o r = " # f f f f 0 0 0 0 " / > < ! - - p r e s s e d - - > < i t e m a n d r o i d : s t a t e _ f o c u s e d = " t r u e " a n d r o i d : c o l o r = " # f f 0 0 0 0 f f " / > < ! - - f o c u s e d - - > < i t e m a n d r o i d : c o l o r = " # f f 0 0 0 0 0 0 " / > < ! - - d e f a u l t - - > < / s e l e c t o r >Exemple d'u lisa on :
< B u t t o na 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 / b u t t o n _ t e x t "
Les animations
< s e l e c t o r 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 . c o m / a p k / r e s / a n d r o i d " > < i t e m a n d r o i d : s t a t e _ p r e s s e d = " t r u e " > < o b j e c t A n i m a t o r a n d r o i d : p r o p e r t y N a m e = " t r a n s l a t i o n Z " a n d r o i d : d u r a t i o n = " @ a n d r o i d : i n t e g e r / c o n f i g _ s h o r t A n i m T i m e " a n d r o i d : v a l u e F r o m = " @ d i m e n / e l e v a t i o n _ l o w " a n d r o i d : v a l u e T o = " @ d i m e n / e l e v a t i o n _ h i g h " a n d r o i d : v a l u e T y p e = " f l o a t T y p e " / > < / i t e m > < i t e m > < o b j e c t A n i m a t o r a n d r o i d : p r o p e r t y N a m e = " t r a n s l a t i o n Z " a n d r o i d : d u r a t i o n = " @ a n d r o i d : i n t e g e r / c o n f i g _ s h o r t A n i m T i m e " a n d r o i d : v a l u e F r o m = " @ d i m e n / e l e v a t i o n _ h i g h " a n d r o i d : v a l u e T o = " @ d i m e n / e l e v a t i o n _ l o w " a n d r o i d : v a l u e T y p e = " f l o a t T y p e " / > < / i t e m > < / s e l e c t o r >5 . 18
Les styles
Défini on d'un style à par r d'un autre style :
< r e s o u r c e s > < s t y l e n a m e = " A p p T h e m e " p a r e n t = " a n d r o i d : T h e m e . M a t e r i a l . L i g h t . D a r k A c t i o n B a r " > < i t e m n a m e = " a n d r o i d : c o l o r P r i m a r y " > @ a n d r o i d : c o l o r / h o l o _ b l u e _ l i g h t < / i t e m > < i t e m n a m e = " a n d r o i d : c o l o r P r i m a r y D a r k " > @ a n d r o i d : c o l o r / h o l o _ b l u e _ d a r k < / i t e m > < i t e m n a m e = " 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 / b l a c k < / i t e m > < ! - - . . . - - > < / s t y l e > < / r e s o u r c e s >Les styles
U lisa on du style dans le manifeste de l'applica on :
< 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 c h e m a s . a n d r o i d . c o m / a p k / r e s / a n d r o i d " p a c k a g e = " c o m . u n i v _ a m u . c c i . n o t e s " > < a p p l i c a t i o n a n d r o i d : a l l o w B a c k u p = " t r u e " a n d r o i d : i c o n = " @ d r a w a b l e / i c _ l a u n c h e r " a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e " a n d r o i d : t h e m e = " @ s t y l e / A p p T h e m e " > < a c t i v i t y a n d r o i d : n a m e = " . M a i n 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 / a p p _ n a m e " > < 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 . M A I N " / > < 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 . L A U N C H E R " / > < / i n t e n t - f i l t e r > < / a c t i v i t y > < / a p p l i c a t i o n > < / m a n i f e s t >
5 . 20
Les identifiants
Associa on des iden fiants aux membres d'un layout :
< R e l a t i v e 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 . c o m / a p k / 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 = " m a t c h _ 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 = " m a t c h _ p a r e n t " > < T e x t V i e w a n d r o i d : i d = " @ + i d / t e x t " a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t 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 / h e l l o _ w o r l d " / > < / R e l a t i v e L a y o u t >
Accès aux éléments d'un layout avec son iden fiant :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; T e x t V i e w t e x t = ( T e x t V i e w ) f i n d V i e w B y I d ( R . i d . t e x t ) ; t e x t . s e t T e x t ( R . s t r i n g . h e l l o _ w o r l d ) ; } }Les fragments
Un fragment :
représente une por on d'interface u lisateur
peut être inséré dans une ac vité
peut être u lisé dans plusieurs ac vités
possède son propre cycle de vie, layout, etc.
Une ac vité :
peut afficher plusieurs fragments
6 . 2
Une application avec deux fragments
Premier layout : le formulaire
Le layout correspondant au formulaire du premier écran :
< L i n e a r L a y o u t x m l n s : a n d r o i d = " . . . " > < 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 1 " a n d r o i d : i n p u t T y p e = " n u m b e r " / > < T e x t V i e w a n d r o i d : t e x t = " @ s t r i n g / p l u s " / > < 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 2 " a n d r o i d : i n p u t T y p e = " n u m b e r " / > < B u t t o n a n d r o i d : i d = " @ + i d / b u t t o n " a n d r o i d : t e x t = " @ s t r i n g / e q u a l s " / > < / L i n e a r L a y o u t >Deuxième layout : le resultat
< T e x t V i e w x m l n s : a n d r o i d = " . . . " x m l n s : t o o l s = " . . . " a n d r o i d : i d = " @ + i d / t e x t V i e w " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " a n d r o i d : g r a v i t y = " c e n t e r " a n d r o i d : t e x t S i z e = " 1 0 0 d p " a n d r o i d : t e x t = " + " / >Le layout de l'activité principale
Le layout de l'ac vité principale :
< F r a m e L a y o u t x m l n s : a n d r o i d = " . . . " x m l n s : t o o l s = " . . . " a n d r o i d : i d = " @ + i d / c o n t a i n e r " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " / >Le code de l'ac vité principale :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; i f ( s a v e d I n s t a n c e S t a t e = = n u l l ) { g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) . a d d ( R . i d . c o n t a i n e r , n e w F o r m F r a g m e n t ( ) ) . c o m m i t ( ) ; } } }6 . 6
Création de la vue dans le premier fragment
p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t { @ O v e r r i d e p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r , V i e w G r o u p c o n t a i n e r , B u n d l e s a v e d I n s t a n c e S t a t e ) { V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . f r a g m e n t _ f o r m , c o n t a i n e r , f a l s e ) ; r e t u r n v i e w ; } }
6 . 8
Notification entre le fragment et l'activité
FormFragment
doit no fier l'ac vité de la valida on du formulaire
Interface pour rendre le fragment réu lisable :
p u b l i c i n t e r f a c e F o r m F r a g m e n t L i s t e n e r {
v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) ; }
L'ac vité va implémenter ce e interface
Lors de l'exécu on de la méthode
onAttach
du fragment, nous
Notification entre le fragment et l'activité
Nous conservons la référence de l'ac vité :
p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t { p r i v a t e F o r m F r a g m e n t L i s t e n e r l i s t e n e r ; @ O v e r r i d e p u b l i c v o i d o n A t t a c h ( A c t i v i t y a c t i v i t y ) { s u p e r . o n A t t a c h ( a c t i v i t y ) ; t r y { l i s t e n e r = ( F o r m F r a g m e n t L i s t e n e r ) a c t i v i t y ; } c a t c h ( C l a s s C a s t E x c e p t i o n e ) { t h r o w n e w C l a s s C a s t E x c e p t i o n ( a c t i v i t y . t o S t r i n g ( ) + " m u s t i m p l e m e n t F o r m F r a g m e n t L i s t e n e r " ) ; } } }6 . 10
Notification entre le fragment et l'activité
Nous faisons en sorte d'écouter les clics sur le bouton :
p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t { p r i v a t e E d i t T e x t e d i t T e x t 1 , e d i t T e x t 2 ; p r i v a t e F o r m F r a g m e n t L i s t e n e r l i s t e n e r ; @ O v e r r i d e p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r , V i e w G r o u p c o n t a i n e r , B u n d l e s a v e d I n s t a n c e S t a t e ) { V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . f r a g m e n t _ f o r m , c o n t a i n e r , f a l s e ) ; e d i t T e x t 1 = ( E d i t T e x t ) v i e w . f i n d V i e w B y I d ( R . i d . e d i t T e x t 1 ) ; e d i t T e x t 2 = ( E d i t T e x t ) v i e w . f i n d V i e w B y I d ( R . i d . e d i t T e x t 2 ) ; B u t t o n b u t t o n = ( B u t t o n ) v i e w . f i n d V i e w B y I d ( R . i d . b u t t o n ) ; b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w O n C l i c k L i s t e n e r ( ) ) ; r e t u r n v i e w ; } }Notification entre le fragment et l'activité
Nous no fions l'ac vité si un clic se produit :
p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t { p r i v a t e E d i t T e x t e d i t T e x t 1 , e d i t T e x t 2 ; p r i v a t e F o r m F r a g m e n t L i s t e n e r l i s t e n e r ; p r i v a t e c l a s s O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { d o u b l e v a l u e 1 = D o u b l e . p a r s e D o u b l e ( e d i t T e x t 1 . g e t T e x t ( ) . t o S t r i n g ( ) ) ; d o u b l e v a l u e 2 = D o u b l e . p a r s e D o u b l e ( e d i t T e x t 2 . g e t T e x t ( ) . t o S t r i n g ( ) ) ; l i s t e n e r . o n E q u a l s ( v a l u e 1 , v a l u e 2 ) ; } } }6 . 12
Notification entre le fragment et l'activité
Récep on de la no fica on par l'ac vité :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y i m p l e m e n t s F o r m F r a g m e n t L i s t e n e r { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; i f ( s a v e d I n s t a n c e S t a t e = = n u l l ) { g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) . a d d ( R . i d . c o n t a i n e r , n e w F o r m F r a g m e n t ( ) ) . c o m m i t ( ) ; } } @ O v e r r i d e p u b l i c v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) { / * T O D O : a f f i c h e r l e r é s u l t a t * / } }
Le deuxième fragment
p u b l i c c l a s s R e s u l t F r a g m e n t e x t e n d s F r a g m e n t { p u b l i c s t a t i c R e s u l t F r a g m e n t g e t I n s t a n c e ( d o u b l e v a l u e ) { R e s u l t F r a g m e n t f r a g m e n t = n e w R e s u l t F r a g m e n t ( ) ; B u n d l e b u n d l e = n e w B u n d l e ( ) ; b u n d l e . p u t D o u b l e ( " v a l u e " , v a l u e ) ; f r a g m e n t . s e t A r g u m e n t s ( b u n d l e ) ; r e t u r n f r a g m e n t ; } @ O v e r r i d e p u b l i c V i e w o n C r e a t e V i e w ( L a y o u t I n f l a t e r i n f l a t e r , V i e w G r o u p c o n t a i n e r , B u n d l e s a v e d I n s t a n c e S t a t e ) { V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . f r a g m e n t _ r e s u l t , c o n t a i n e r , f a l s e ) ; T e x t V i e w t e x t V i e w = ( T e x t V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . t e x t V i e w ) ; t e x t V i e w . s e t T e x t ( " " + v a l u e ( ) ) ; r e t u r n v i e w ; } p u b l i c d o u b l e v a l u e ( ) { r e t u r n g e t A r g u m e n t s ( ) . g e t D o u b l e ( " v a l u e " ) ; }6 . 14
Affichage du deuxième fragment par l'activité
p u b l i c c l a s s R e s u l t F r a g m e n t e x t e n d s F r a g m e n t i m p l e m e n t s F o r m F r a g m e n t L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) { d o u b l e v a l u e = v a l u e 1 + v a l u e 2 ; g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) . r e p l a c e ( R . i d . c o n t a i n e r , R e s u l t F r a g m e n t . g e t I n s t a n c e ( v a l u e ) ) . a d d T o B a c k S t a c k ( " r e s u l t " ) . c o m m i t ( ) ; } }
Affichage de deux fragments par l'activité
6 . 16
Affichage de deux fragments par l'activité
Le layout de l'ac vité par défaut :
< L i n e a r L a y o u t x m l n 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 = " m a t c h _ 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 = " m a t c h _ p a r e n t " > < f r a g m e n t c l a s s = " c o m . u n i v _ a m u . c c i . m y a p p l i c a t i o n . F o r m F r a g m e n t " a n d r o i d : i d = " @ + i d / f o r m " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 " / > < F r a m e L a y o u t a n d r o i d : i d = " @ + i d / c o n t a i n e r " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 : b a c k g r o u n d = " ? a n d r o i d : a t t r / d e t a i l s E l e m e n t B a c k g r o u n d " / > < / L i n e a r L a y o u t >Affichage de deux fragments par l'activité
Le layout de l'ac vité en mode paysage (répertoire
layout-land
) :
< L i n e a r L a y o u t x m l n 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 = " h o r i z o n t a l " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ 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 = " m a t c h _ p a r e n t " > < f r a g m e n t c l a s s = " c o m . u n i v _ a m u . c c i . m y a p p l i c a t i o n . F o r m F r a g m e n t " a n d r o i d : i d = " @ + i d / f o r m " a n d r o i d : l a y o u t _ w e i g h t = " 1 " a n d r o i d : l a y o u t _ w i d t h = " 0 p x " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " / > < F r a m e L a y o u t a n d r o i d : i d = " @ + i d / c o n t a i n e r " a n d r o i d : l a y o u t _ w e i g h t = " 1 " a n d r o i d : l a y o u t _ w i d t h = " 0 p x " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " a n d r o i d : b a c k g r o u n d = " ? a n d r o i d : a t t r / d e t a i l s E l e m e n t B a c k g r o u n d " / > < / L i n e a r L a y o u t >
6 . 18
Affichage de deux fragments par l'activité
Le code de l'ac vité :
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y i m p l e m e n t s F o r m F r a g m e n t L i s t e n e r { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; } @ O v e r r i d e p u b l i c v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) { d o u b l e v a l u e = v a l u e 1 + v a l u e 2 ; g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) . r e p l a c e ( R . i d . c o n t a i n e r , R e s u l t F r a g m e n t . g e t I n s t a n c e ( v a l u e ) ) . a d d T o B a c k S t a c k ( " r e s u l t " ) . c o m m i t ( ) ; } }Les boites de dialogue
6 . 20
Les boites de dialogue
Les boites de dialogue sont des fragments :
p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t { p r i v a t e E d i t T e x t e d i t T e x t ; @ O v e r r i d e p u b l i c D i a l o g o n C r e a t e D i a l o g ( B u n d l e s a v e d I n s t a n c e S t a t e ) { A l e r t D i a l o g . B u i l d e r b u i l d e r = n e w A l e r t D i a l o g . B u i l d e r ( g e t A c t i v i t y ( ) ) ; L a y o u t I n f l a t e r i n f l a t e r = g e t A c t i v i t y ( ) . g e t L a y o u t I n f l a t e r ( ) ; V i e w v i e w = i n f l a t e r . i n f l a t e ( R . l a y o u t . d i a l o g , n u l l ) ; e d i t T e x t = ( E d i t T e x t ) v i e w . f i n d V i e w B y I d ( R . i d . e d i t T e x t ) ; b u i l d e r . s e t V i e w ( v i e w ) . s e t P o s i t i v e B u t t o n ( a n d r o i d . R . s t r i n g . o k , n e w O n P o s i t i v e B u t t o n C l i c k L i s t e n e r ( ) ) . s e t N e g a t i v e B u t t o n ( a n d r o i d . R . s t r i n g . c a n c e l , n e w O n N e g a t i v e B u t t o n C l i c k L i s t e n e r ( ) ) ; r e t u r n b u i l d e r . c r e a t e ( ) ; } }Les boites de dialogue
L'inferface de communica on :
p u b l i c i n t e r f a c e D i a l o g F r a g m e n t L i s t e n e r { v o i d o n C h a n g e T e x t ( S t r i n g t e x t ) ; }On redéfinit ensuite la méthode
onAttach
:
p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t { p r i v a t e D i a l o g F r a g m e n t L i s t e n e r l i s t e n e r ; @ O v e r r i d e p u b l i c v o i d o n A t t a c h ( A c t i v i t y a c t i v i t y ) { s u p e r . o n A t t a c h ( a c t i v i t y ) ; t r y { l i s t e n e r = ( D i a l o g F r a g m e n t L i s t e n e r ) a c t i v i t y ; } c a t c h ( C l a s s C a s t E x c e p t i o n e ) { t h r o w n e w C l a s s C a s t E x c e p t i o n ( a c t i v i t y . t o S t r i n g ( ) + " m u s t i m p l e m e n t D i a l o g F r a g m e n t L i s t e n e r " ) ; } } }6 . 22
Les boites de dialogue
Les écouteurs des événements :
p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t { p r i v a t e c l a s s O n P o s i t i v e B u t t o n C l i c k L i s t e n e r i m p l e m e n t s D i a l o g I n t e r f a c e . O n C l i c k L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , i n t i d ) { l i s t e n e r . o n C h a n g e T e x t ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ; D i a l o g F r a g m e n t . t h i s . g e t D i a l o g ( ) . d i s m i s s ( ) ; } } p r i v a t e c l a s s O n N e g a t i v e B u t t o n C l i c k L i s t e n e r i m p l e m e n t s D i a l o g I n t e r f a c e . O n C l i c k L i s t e n e r { p u b l i c v o i d o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , i n t i d ) { D i a l o g F r a g m e n t . t h i s . g e t D i a l o g ( ) . c a n c e l ( ) ; } } }Les boites de dialogue
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y i m p l e m e n t s D i a l o g F r a g m e n t L i s t e n e r { p r i v a t e T e x t V i e w t e x t V i e w ; @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; t e x t V i e w = ( T e x t V i e w ) f i n d V i e w B y I d ( R . i d . t e x t V i e w ) ; t e x t V i e w . s e t O n C l i c k L i s t e n e r ( n e w O n C l i c k L i s t e n e r ( ) ) ; } @ O v e r r i d e p u b l i c v o i d o n C h a n g e T e x t ( S t r i n g t e x t ) { t e x t V i e w . s e t T e x t ( t e x t ) ; } p r i v a t e c l a s s O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { D i a l o g F r a g m e n t n e w F r a g m e n t = n e w D i a l o g F r a g m e n t ( ) ; n e w F r a g m e n t . s h o w ( g e t F r a g m e n t M a n a g e r ( ) , " d i a l o g " ) ; } } }Les menus
< m e n u x m l n s : a n d r o i d = " . . . . " > < i t e m a n d r o i d : i d = " @ + i d / a c t i o n _ d e c r e m e n t " a n d r o i d : t i t l e = " @ s t r i n g / i n c r e m e n t " a n d r o i d : i c o n = " @ d r a w a b l e / p r e v i o u s " a n d r o i d : s h o w A s A c t i o n = " i f R o o m " / > < i t e m a n d r o i d : i d = " @ + i d / a c t i o n _ i n c r e m e n t " a n d r o i d : t i t l e = " @ s t r i n g / d e c r e m e n t " a n d r o i d : i c o n = " @ d r a w a b l e / n e x t " a n d r o i d : s h o w A s A c t i o n = " i f R o o m " / > < / m e n u >7 . 2
Chargement et traitement des actions du menu
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e 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 ( M e n u m e n u ) { g e t M e n u I n f l a t e r ( ) . i n f l a t e ( R . m e n u . m a i n , m e n u ) ; r e t u r n t r u e ; } @ O v e r r i d e 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 ( M e n u I t e m i t e m ) { s w i t c h ( i t e m . g e t I t e m I d ( ) ) { c a s e R . i d . a c t i o n _ d e c r e m e n t : d e c r e m e n t ( ) ; r e t u r n t r u e ; c a s e R . i d . a c t i o n _ i n c r e m e n t : i n c r e m e n t ( ) ; r e t u r n t r u e ; d e f a u l t : r e t u r n s u p e r . o n O p t i o n s I t e m S e l e c t e d ( i t e m ) ; } } / * l e s m é t h o d e s d e c r e m e n t , i n c r e m e n t e t o n C r e a t e * / }
Chargement et traitement des actions du menu
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { / * . . . * / p r i v a t e T e x t V i e w c o u n t e r T e x t V i e w ; p r i v a t e i n t c o u n t e r = 0 ; @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; c o u n t e r T e x t V i e w = ( T e x t V i e w ) f i n d V i e w B y I d ( R . i d . c o u n t e r ) ; u p d a t e T e x t V i e w ( ) ; } p r i v a t e v o i d u p d a t e T e x t V i e w ( ) { c o u n t e r T e x t V i e w . s e t T e x t ( " " + c o u n t e r ) ; } p r i v a t e v o i d i n c r e m e n t ( ) { c o u n t e r + + ; u p d a t e T e x t V i e w ( ) ; } p r i v a t e v o i d d e c r e m e n t ( ) { c o u n t e r - - ; u p d a t e T e x t V i e w ( ) ; } }7 . 4
Sauvegarde de l'état de l'activité
p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { / * . . . * / @ O v e r r i d e p r o t e c t e d v o i d o n S a v e I n s t a n c e S t a t e ( B u n d l e o u t S t a t e ) { s u p e r . o n S a v e I n s t a n c e S t a t e ( o u t S t a t e ) ; o u t S t a t e . p u t I n t ( " c o u n t e r " , c o u n t e r ) ; } @ O v e r r i d e p r o t e c t e d v o i d o n R e s t o r e I n s t a n c e S t a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n R e s t o r e I n s t a n c e S t a t e ( s a v e d I n s t a n c e S t a t e ) ; c o u n t e r = s a v e d I n s t a n c e S t a t e . g e t I n t ( " c o u n t e r " ) ; u p d a t e T e x t V i e w ( ) ; } }