Vous êtes sur la page 1sur 283

Développement Mobile sur Android

Master CCI
Bertrand Estellon - DII - Aix-Marseille Université
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

2.1
Le projet
Un réveil :

     

2.2
Démo du projet

2:16

2.3
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.4
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.5
Android Studio

2.6
Android SDK

2.7
AVD Manager

2.8
Émulateur

2.9
Installation

5:20

2 . 10
Création d'une machine virtuelle

1:13

2 . 11
Création d'un projet

1:51

2 . 12
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

FireActivity
AlarmActivity

AlarmProvider
FireService
UpdateBroadcastReceiver

2 . 13
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 . 14
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 ) ;
c u r s o r = r e s o l v e r . q u e r y ( u r i , n u l l , n u l l , n u l l , n u l l ) ;

2 . 15
Quelques classes d'Android
Cursor

Intent
Activity

ContentProvider

Service
BroadcastReceiver

ContentResolver
View

2 . 16
Structure d'un projet
Manifeste

Code Java

Ressources

Scripts de compilation

2 . 17
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 >

2 . 18
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.1
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.2
Le résultat :

3.3
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

Work created and shared by the Android Open Source Project and used according to terms described in the Crea ve Commons 2.5 A ribu on License

3.4
É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.5
États transitoires d'une activité
Created
L'ac vité vient d'être créée.
Started
L'ac vité vient de devenir visible.

Work created and shared by the Android Open Source Project and used according to terms described in the Crea ve Commons 2.5 A ribu on License

3.6
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.7
Cycle de vie des activités

Work created and shared by the Android Open Source Project and used according to terms described in the Crea ve Commons 2.5 A ribu on License

3.8
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.9
Sauvegarde de l'état de l'application
L'applica on est détruite dans les états rouges :

Work created and shared by the Android Open Source Project and used according to terms described in the Crea ve Commons 2.5 A ribu on License


3 . 10
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 . 11
Sauvegarde de l'état de l'application

   

3 . 12
Sauvegarde de l'état de l'application

Work created and shared by the Android Open Source Project and used according to terms described in the Crea ve Commons 2.5 A ribu on License

3 . 13
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 ) ;
}
}

3 . 14
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 . 15
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)


3 . 16
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 ) ;
}
}
4.1
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

TextView étend  View

4.2
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
setContentView de  Activity pour préciser la vue à afficher

4.3
Hiérarchie des vues

4.4
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
s ( V i e L a y o u t . L a y o u t P a r a m 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 ;
}
}

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 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.6
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 ;
}

4.7
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.8
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

4.9
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 . 10
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 + + ; }
}
}

4 . 11
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 ) ;
}
}

4 . 12
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...
de maintenir ces éléments sans connaître Java.
5.1
Les ressources

Elles sont dans les sous‐répertoires du répertoire  res
5.2
La classe R
Elle est génèrée automa quement par Android
Elle permet de désigner les ressources dans le code Java
Par exemple,  activity_main.xml =  R.layout.activity_main

5.3
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 >

5.4
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.5
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 >

5.6
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.7
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 ) ;
}
}

5.8
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 >


<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 "
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 " / >

5.9
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 ) ;

5 . 10
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 . 11
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

5 . 12
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 . 13
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 ) ;
}

5 . 14
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 >
< sh 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 . 15
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 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 = " @ s t r i n g / b u t t o n _ t e x t "
a n d r o i d : t e x t C o l o r = " @ c o l o r / b u t t o n _ t e x t " / >

5 . 16
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 . 17
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 >

5 . 18
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 . 19
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 ) ;
}
}
5 . 20
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
peut u liser une pile pour gérer la naviga on entre fragments

6.1
Une application avec deux fragments

6.2
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 >
6.3
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 = " + " / >
6.4
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.5
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.6
Cycle de vie d'un fragment

6.7
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
allons conserver une référence afin de pouvoir no fier l'ac vité.

6.8
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.9
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 ;
}
}

6 . 10
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 . 11
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 * /
}
}

6 . 12
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 . 13
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 ( ) ;
}

6 . 14
Affichage de deux fragments par l'activité

6 . 15
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 >

6 . 16
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 . 17
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 ( ) ;
}
}

6 . 18
Les boites de dialogue

6 . 19
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
t t o n ( a s i t i v e B u 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 ( ) ;
}
}

6 . 20
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 . 21
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 ( ) ;
}
}
}

6 . 22
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 " ) ;
}
}
}

6 . 23
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.1
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 * /
}

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 {
/ * . . . * /

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.3
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 ( ) ;
}

7.4
Menus et fragments
< 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 : 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 : o r i e n t a t i o n = " v e r t i c a l " >
< f r a g m e n t
a n d r o i d : i d = " @ + i d / c o u n t e r F r a g m e n t "
a n d r o i d : n a m e = " . C o u n t e r F r a g m e n t "
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 = " 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 = " 0 d p " / >
< f r a g m e n t
a n d r o i d : i d = " @ + i d / c o l o r F r a g m e n t "
a n d r o i d : n a m e = " . C o l o r F r a g m e n t "
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 = " 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 = " 0 d p " / >
< / L i n e a r L a y o u t >
7.5
Menus et fragments
7.6
Menus et fragments
p u b l i c c l a s s C o u n t e r 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 T e x t V i e w c o u n t e r T e x t V i e w ;

@ 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 _ c o u n t e r , c o n t a i n e r , f a l s e ) ;
c o u n t e r 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 . c o u n t e r ) ;
u p d a t e T e x t V i e w ( ) ;
r e t u r n v i e w ;
}

@ 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 ) {
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 H a s O p t i o n s M e n u ( t r u e ) ;
}

@ 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 O p t i o n s M e n u ( M e n u m e n u , M e n u I n f l a t e r i n f l a t e r ) {
s u p e r . o n C r e a t e O p t i o n s M e n u ( m e n u , i n f l a t e r ) ;
i n f l a t e r . i n f l a t e ( R . m e n u . m e n u _ c o u n t e r , m e n u ) ;
}
/ * . . . * /
}

7.7
Menus et fragments

< m e n u 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 : 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 = " @ a n d r o i d : d r a w a b l e / i c _ m e d i a _ 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 = " a l w a y s " / >
< 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 = " @ a n d r o i d : d r a w a b l e / i c _ m e d i a _ n e x t "
a n d r o i d : s h o w A s A c t i o n = " a l w a y s " / >
< / m e n u >

7.8
Menus et fragments
p u b l i c c l a s s C o u n t e r 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 i n t c o u n t e r = 0 ;

/ * . . . * /

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 ) ; }

@ 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 ) ;
}
}

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 ( ) ; }
}

Tous les fragments peuvent recevoir les no fica ons


Le premier qui retourne  true arrête la propaga on

7.9
Menus et fragments

p u b l i c c l a s s C o l o r 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 I m a g e V i e w i m a g e V i e w ;
p r i v a t e i n t c o l o r = C o l o r . R E D ;

@ 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 _ c o l o r ,
c o n t a i n e r , f a l s e ) ;
i m a g e V i e w = ( I m a g e V i e w ) v i e w . f i n d V i e w B y I d ( R . i d . c o l o r ) ;
u p d a t e I m a g e V i e w ( ) ;
r e t u r n v i e w ;
}

p r i v a t e v o i d u p d a t e I m a g e V i e w ( ) { i m a g e V i e w . s e t B a c k g r o u n d C o l o r ( c o l o r ) ; }
}

7 . 10
Menus et fragments

< m e n u 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 : i d = " @ + i d / a c t i o n _ r e d "
a n d r o i d : t i t l e = " @ s t r i n g / r e d "
a n d r o i d : i c o n = " @ d r a w a b l e / i c _ r e d "
a n d r o i d : s h o w A s A c t i o n = " a l w a y s " / >
< i t e m a n d r o i d : i d = " @ + i d / a c t i o n _ b l u e "
a n d r o i d : t i t l e = " @ s t r i n g / b l u e "
a n d r o i d : i c o n = " @ d r a w a b l e / i c _ b l u e "
a n d r o i d : s h o w A s A c t i o n = " a l w a y s " / >
< / m e n u >

7 . 11
Menus et fragments

p u b l i c c l a s s C o l o r 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 I m a g e V i e w i m a g e V i e w ;
p r i v a t e i n t c o l o r = C o l o r . R E D ;

/ * . . . * /

@ 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 ) {
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 H a s O p t i o n s M e n u ( t r u e ) ;
}

@ 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 O p t i o n s M e n u ( M e n u m e n u ,
M e n u I n f l a t e r i n f l a t e r ) {
s u p e r . o n C r e a t e O p t i o n s M e n u ( m e n u , i n f l a t e r ) ;
i n f l a t e r . i n f l a t e ( R . m e n u . m e n u _ c o l o r , m e n u ) ;
}
}

7 . 12
Menus et fragments

p u b l i c c l a s s C o l o r 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 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 _ r e d :
c h a n g e C o l o r ( C o l o r . R E D ) ; r e t u r n t r u e ;
c a s e R . i d . a c t i o n _ b l u e :
c h a n g e C o l o r ( C o l o r . B L U E ) ; 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 ) ;
}
}

p r i v a t e v o i d c h a n g e C o l o r ( i n t c o l o r ) {
t h i s . c o l o r = c o l o r ; u p d a t e I m a g e V i e w ( ) ;
}
}

7 . 13
Les listes
Dans le cours et les TP, nous allons u liser des  RecyclerView :
   
8.1
Il est également possible d'u liser l'ancienne classe  ListView.
Les listes

Un  RecyclerView permet l'affichage d'un grand nombre de vues
Un  LayoutManager permet de gérer la posi on des éléments
Un  Adapter va adapter les données aux vues

RecyclerView

LayoutManager Adapter Dataset

8.2
Le layout principal de l'application
< a n d r o i d . s u p p o r t . v 7 . w i d g e t . R e c y c l e r V i e w
x m l n s : a n d r o i d = " . . . "
a n d r o i d : i d = " @ + i d / r e c y c l e r 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 "
/ >

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 t e m A d a p t e r a d a p t e r ;
p r i v a t e A r r a y L i s t < S t r i n g > d a t a s e t ;

@ 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 ) ;
R e c y c l e r V i e w r e c y c l e r V i e w = ( R e c y c l e r V i e w ) f i n d V i e w B y I d ( R . i d . r e c y c l e r V i e w ) ;
R e c y c l e r V i e w . L a y o u t M a n a g e r l a y o u t M a n a g e r = n e w G r i d L a y o u t M a n a g e r ( t h i s , 2 ) ;
r e c y c l e r V i e w . s e t L a y o u t M a n a g e r ( l a y o u t M a n a g e r ) ;
d a t a s e t = n e w A r r a y L i s t < > ( ) ;
a d a p t e r = n e w I t e m A d a p t e r ( d a t a s e t ) ;
r e c y c l e r V i e w . s e t A d a p t e r ( a d a p t e r ) ;
}
}

8.3
Code de l'adaptateur
p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
p r i v a t e f i n a l L i s t < S t r i n g > d a t a s e t ;

p u b l i c I t e m A d a p t e r ( L i s t < S t r i n g > d a t a s e t ) { t h i s . d a t a s e t = d a t a s e t ; }

@ O v e r r i d e
p u b l i c V i e w H o l d e r o n C r e a t e V i e w H o l d e r ( V i e w G r o u p g r o u p , i n t t y p e V i e w ) {
V i e w v i e w = L a y o u t I n f l a t e r . f r o m ( g r o u p . g e t C o n t e x t ( ) )
. i n f l a t e ( a n d r o i d . R . l a y o u t . s i m p l e _ l i s t _ i t e m _ 1 , g r o u p , f a l s e ) ;
V i e w H o l d e r v i e w H o l d e r = n e w V i e w H o l d e r ( v i e w ) ;
r e t u r n v i e w H o l d e r ;
}

p u b l i c c l a s s V i e w H o l d e r e x t e n d s R e c y c l e r V i e w . V i e w H o l d e r {
f i n a l T e x t V i e w t e x t V i e w ;

p u b l i c V i e w H o l d e r ( V i e w i t e m V i e w ) {
s u p e r ( i t e m V i e w ) ;
t e x t V i e w = ( T e x t V i e w ) i t e m V i e w . f i n d V i e w B y I d ( a n d r o i d . R . i d . t e x t 1 ) ;
}

p u b l i c v o i d b i n d ( i n t i n d e x ) { t e x t V i e w . s e t T e x t ( d a t a s e t . g e t ( i n d e x ) ) ; }
}
}

8.4
Code de l'adaptateur

p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
/ * . . . * /

@ O v e r r i d e
p u b l i c v o i d o n B i n d V i e w H o l d e r ( V i e w H o l d e r v i e w H o l d e r , i n t i n d e x ) {
v i e w H o l d e r . b i n d ( i n d e x ) ;
}

@ O v e r r i d e
p u b l i c i n t g e t I t e m C o u n t ( ) { r e t u r n d a t a s e t . s i z e ( ) ; }

8.5
Mise en place du dialogue d'ajout d'un item

Interface 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 A d d I t e m ( S t r i n g t e x t ) ;
}

L'ac vité implémente ce e interface :


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 {

@ O v e r r i d e
p u b l i c v o i d o n A d d I t e m ( S t r i n g t e x t ) {
/ * T O D O * /
}
}

8.6
Notification de l'adaptateur de la modification du modèle

Modifica on des données et no fica on de l'adaptateur :


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 I t e m A d a p t e r a d a p t e r ;
p r i v a t e A r r a y L i s t < S t r i n g > d a t a s e t ;

@ O v e r r i d e
p u b l i c v o i d o n A d d I t e m ( S t r i n g t e x t ) {
d a t a s e t . a d d ( t e x t ) ;
a d a p t e r . n o t i f y D a t a S e t C h a n g e d ( ) ;
}
}

Il est possible de no fier l'adaptateur plus finement avec les
méthodes  notifyItemChanged,  notifyItemInserted,
notifyItemMoved,  notifyItemRangeChanged, etc.

8.7
Ajout d'un menu à 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
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 {
@ 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 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 ) {
i f ( i t e m . g e t I t e m I d ( ) = = R . i d . a c t i o n _ a d d ) {
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 " ) ;
r e t u r n t r u e ;
}
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 ) ;
}
}

8.8
Code de la boite de dialogue

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
u t t o n ( ae B 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 ( ) ;
}
}

8.9
Code de la boite de dialogue

< 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 "
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 "
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 " >
< 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 = " 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 : e m s = " 1 0 " / >
< / R e l a t i v e L a y o u t >

8 . 10
Code de la boite de dialogue

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 ;
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 " ) ;
}
}
}

8 . 11
Code de la boite de dialogue

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 A d d I t e m ( 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 ( ) ;
}
}
}

8 . 12
Sélection des éléments
Sélection des éléments

No fica on de l'ac vité lorsque l'u lisateur clique sur un élément :


p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
p r i v a t e L i s t < O n I t e m C l i c k > l i s t e n e r s = n e w A r r a y L i s t < > ( ) ;

p u b l i c i n t e r f a c e O n I t e m C l i c k { v o i d o n C l i c k ( i n t i n d e x ) ; }

p u b l i c v o i d s e t O n I t e m C l i c k ( O n I t e m C l i c k l i s t e n e r ) {
l i s t e n e r s . a d d ( l i s t e n e r ) ;
}

p u b l i c v o i d n o t i f y O n I t e m C l i c k ( i n t i n d e x ) {
f o r ( O n I t e m C l i c k l i s t e n e r : l i s t e n e r s )
l i s t e n e r . o n C l i c k ( i n d e x ) ;
}
}

8 . 14
13
Sélection des éléments

No fica on de l'ac vité lorsque l'u lisateur clique sur un élément :


p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
p u b l i c c l a s s V i e w H o l d e r e x t e n d s R e c y c l e r V i e w . V i e w H o l d e r {
i n t i n d e x ;

p u b l i c V i e w H o l d e r ( V i e w i t e m V i e w ) {
/ * . . . * / i t e m 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 ( ) ) ;
}

p u b l i c v o i d b i n d ( i n t i n d e x ) { t h i s . i n d e x = i n d e x ; / * . . . * / }

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 i e w ) { n o t i f y O n I t e m C l i c k ( i n d e x ) ; }
}
}
}

8 . 15
Sélection des éléments

Récep on des no fica ons 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 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 I t e m A d a p t e r a d a p 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 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 ) {
/ * . . . * /
a d a p t e r = n e w I t e m A d a p t e r ( d a t a s e t , s e l e c t e d I t e m s ) ;
a d a p t e r . s e t O n I t e m C l i c k ( n e w O n I t e m C l i c k ( ) ) ;
}

p r i v a t e c l a s s O n I t e m C l i c k i m p l e m e n t s I t e m A d a p t e r . O n I t e m C l i c k {
@ 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 ( i n t i n d e x ) { / * T O D O * / }
}
}

8 . 16
Sélection des éléments

Méthodes pour gérer les sélec ons :
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 S p a r s e B o o l e a n A r r a y s e l e c t e d I t e m s = n e w S p a r s e B o o l e a n A r r a y ( ) ;
p r i v a t e i n t n u m b e r O f S e l e c t e d I t e m s ;

p r i v a t e v o i d s w a p I t e m S e l e c t i o n ( i n t i n d e x ) {
s e l e c t e d I t e m s . p u t ( i n d e x , ! s e l e c t e d I t e m s . g e t ( i n d e x ) ) ;
a d a p t e r . n o t i f y D a t a S e t C h a n g e d ( ) ;
n u m b e r O f S e l e c t e d I t e m s + = s e l e c t e d I t e m s . g e t ( i n d e x ) ? 1 : - 1 ;
}

p r i v a t e v o i d c l e a r S e l e c t i o n ( ) {
s e l e c t e d I t e m s . c l e a r ( ) ;
n u m b e r O f S e l e c t e d I t e m s = 0 ;
a d a p t e r . n o t i f y D a t a S e t C h a n g e d ( ) ;
}
}

8 . 17
Sélection des éléments

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 I t e m A d a p t e r a d a p 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 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 ) {
/ * . . . * /
a d a p t e r = n e w I t e m A d a p t e r ( d a t a s e t , s e l e c t e d I t e m s ) ;
a d a p t e r . s e t O n I t e m C l i c k ( n e w O n I t e m C l i c k ( ) ) ;
}

p r i v a t e c l a s s O n I t e m C l i c k i m p l e m e n t s I t e m A d a p t e r . O n I t e m C l i c k {
@ 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 ( i n t i n d e x ) { s w a p I t e m S e l e c t i o n ( i n d e x ) ; }
}
}

8 . 18
Sélection des éléments

item_background.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 _ 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 _ i t e m _ 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 _ i t e m _ b a c k g r o u n d " / >
< / s e l e c t o r >

selected_item_background.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 M u l t i S e l e c t H i g h l i g h t " >
< i t e m a n d r o i d : i d = " @ a n d r o i d : i d / m a s k "
a n d r o i d : d r a w a b l e = " @ a n d r o i d : c o l o r / w h i t e " / >
< / r i p p l e >

8 . 19
Sélection des éléments

normal_item_background.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 / w h i t e " >
< i t e m a n d r o i d : d r a w a b l e = " ? a n d r o i d : c o l o r M u l t i S e l e c t H i g h l i g h t " / >
< / r i p p l e >

layout_item.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 = " 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 : b a c k g r o u n d = " @ d r a w a b l e / i t e m _ b a c k g r o u n d " >
< 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 = " 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 " / >
< / R e l a t i v e L a y o u t >

8 . 20
Sélection des éléments
Communica on des éléments sélec onnés à l'adaptateur :
p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
p r i v a t e f i n a l L i s t < S t r i n g > d a t a s e t ;
p r i v a t e f i n a l S p a r s e B o o l e a n A r r a y s e l e c t e d I t e m s ;

p u b l i c I t e m A d a p t e r ( L i s t < S t r i n g > d a t a s e t ,
S p a r s e B o o l e a n A r r a y s e l e c t e d I t e m s ) {
t h i s . d a t a s e t = d a t a s e t ; t h i s . s e l e c t e d I t e m s = s e l e c t e d I t e m s ;
}
}

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 {
@ 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 ) {
/ * . . . * / a d a p t e r = n e w I t e m A d a p t e r ( d a t a s e t , s e l e c t e d I t e m s ) ; / * . . . * /
}
}

8 . 21
Sélection des éléments

Mise en place du nouveau layout :
p u b l i c c l a s s I t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {

@ O v e r r i d e
p u b l i c V i e w H o l d e r o n C r e a t e V i e w H o l d e r ( V i e w G r o u p v i e w G r o u p ,
i n t i n d e x ) {
V i e w v i e w = L a y o u t I n f l a t e r . f r o m ( v i e w G r o u p . g e t C o n t e x t ( ) )
. i n f l a t e ( R . l a y o u t . l a y o u t _ i t e m , v i e w G r o u p , f a l s e ) ;
V i e w H o l d e r v i e w H o l d e r = n e w V i e w H o l d e r ( v i e w ) ;
v i e w H o l d e r . b i n d ( i n d e x ) ;
r e t u r n v i e w H o l d e r ;
}

8 . 22
Sélection des éléments

Modifica on de la vue en fonc on de la sélec on de l'élément :


p u b l i c c l a s sI t e m A d a p t e r
e x t e n d s R e c y c l e r V i e w . A d a p t e r < I t e m A d a p t e r . V i e w H o l d e r > {
p r i v a t e f i n a l S p a r s e B o o l e a n A r r a y s e l e c t e d I t e m s ;

p u b l i c c l a s s V i e w H o l d e r e x t e n d s R e c y c l e r V i e w . V i e w H o l d e r {
i n t i n d e x ;

p u b l i c v o i d b i n d ( i n t i n d e x ) {
/ * . . . * /
i t e m V i e w . s e t S e l e c t e d ( s e l e c t e d I t e m s . g e t ( i n d e x ) ) ;
}

/ * . . . * /
}
}

8 . 23
Le mode "action"
Nous souhaitons pouvoir supprimer les éléments sélec onnés :

   
8 . 24
Le mode "action"
< 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 l e t e "
a n d r o i d : t i t l e = " @ s t r i n g / d e l e t e "
a n d r o i d : i c o n = " @ a n d r o i d : d r a w a b l e / i c _ m e n u _ d e l e t e "
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 >

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 v o i d s w a p I t e m S e l e c t i o n ( i n t i n d e x ) {
/ * . . . * / u p d a t e A c t i o n M o d e ( ) ;
}

p r i v a t e v o i d u p d a t e A c t i o n M o d e ( ) {
b o o l e a n o l d S e l e c t i o n M o d e A c t i v a t e d = a c t i o n M o d e ! = n u l l ;
b o o l e a n s e l e c t i o n M o d e A c t i v a t e d = n u m b e r O f S e l e c t e d I t e m s > 0 ;
i f ( s e l e c t i o n M o d e A c t i v a t e d = = o l d S e l e c t i o n M o d e A c t i v a t e d ) r e t u r n ;
i f ( s e l e c t i o n M o d e A c t i v a t e d ) {
a c t i o n M o d e = s t a r t A c t i o n M o d e ( a c t i o n M o d e C a l l b a c k ) ;
r e t u r n ;
} e l s e a c t i o n M o d e . f i n i s h ( ) ;
}
}

8 . 25
Le mode "action"

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 A c t i o n M o d e . C a l l b a c k a c t i o n M o d e C a l l b a c k
= n e w A c t i o n M o d e C a l l b a c k ( ) ;

p r i v a t e c l a s s A c t i o n M o d e C a l l b a c k i m p l e m e n t s A c t i o n M o d e . C a l l b a c k {
@ 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 A c t i o n M o d e ( A c t i o n M o d e m o d e , M e n u m e n u ) {
M e n u I n f l a t e r i n f l a t e r = m o d e . g e t M e n u I n f l a t e r ( ) ;
i n f l a t e r . i n f l a t e ( R . m e n u . m e n u _ a c t i o n m o d e , m e n u ) ;
r e t u r n t r u e ;
}

/ * . . . * /
}
}

8 . 26
Le mode "action"

Ges on des événements du menu du mode ``ac on'' :


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 c l a s s A c t i o n M o d e C a l l b a c k i m p l e m e n t s A c t i o n M o d e . C a l l b a c k {
/ * . . . * /
@ O v e r r i d e
p u b l i c b o o l e a n o n A c t i o n I t e m C l i c k e d ( A c t i o n M o d e m o d e , 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 l e t e : d e l e t e S e l e c t e d I t e m s ( ) ; r e t u r n t r u e ;
d e f a u l t : r e t u r n f a l s e ;
}
}
/ * . . . * /
}
}

8 . 27
Le mode "action"

Ges on de la destruc on du mode ``ac on'' :


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 c l a s s A c t i o n M o d e C a l l b a c k i m p l e m e n t s A c t i o n M o d e . C a l l b a c k {
/ * . . . * /

@ O v e r r i d e
p u b l i c b o o l e a n o n P r e p a r e A c t i o n M o d e ( A c t i o n M o d e m o d e , M e n u m e n u ) {
r e t u r n f a l s e ;
}

@ O v e r r i d e
p u b l i c v o i d o n D e s t r o y A c t i o n M o d e ( A c t i o n M o d e m o d e ) {
c l e a r S e l e c t i o n ( ) ;
a c t i o n M o d e = n u l l ;
}
}
}

8 . 28
Le mode "action"

Suppression des éléments du modèle :
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 v o i d d e l e t e S e l e c t e d I t e m s ( ) {
f o r ( i n t i n d e x = s e l e c t e d I t e m s . s i z e ( ) - 1 ; i n d e x > = 0 ; i n d e x - - )
i f ( s e l e c t e d I t e m s . v a l u e A t ( i n d e x ) )
d a t a s e t . r e m o v e ( s e l e c t e d I t e m s . k e y A t ( i n d e x ) ) ;
c l e a r S e l e c t i o n ( ) ;
u p d a t e A c t i o n M o d e ( ) ;
a d a p t e r . n o t i f y D a t a S e t C h a n g e d ( ) ;
}
}

8 . 29
Exemple d'utilisation des préférences
   
9.1
Exemple d'utilisation des préférences
   
9.2
Exemple d'utilisation des préférences
  9.3
Structure des préférences
Un fichier XML décrit la structure des péférences :
< P r e f e r e n c e S c r e e n x m l n s : a n d r o i d = " . . . " >
< C h e c k B o x P r e f e r e n c e
a n d r o i d : k e y = " p r e f _ c h e c k b o x "
a n d r o i d : t i t l e = " @ s t r i n g / c h e c k b o x _ t i t l e "
a n d r o i d : d e f a u l t V a l u e = " t r u e " / >
< E d i t T e x t P r e f e r e n c e
a n d r o i d : k e y = " p r e f _ t e x t "
a n d r o i d : d e p e n d e n c y = " p r e f _ c h e c k b o x "
a n d r o i d : t i t l e = " @ s t r i n g / t e x t _ t i t l e " / >
< L i s t P r e f e r e n c e
a n d r o i d : k e y = " p r e f _ l i s t "
a n d r o i d : t i t l e = " @ s t r i n g / l i s t _ t i t l e "
a n d r o i d : e n t r i e s = " @ a r r a y / l i s t _ e n t r i e s "
a n d r o i d : e n t r y V a l u e s = " @ a r r a y / l i s t _ v a l u e s "
a n d r o i d : d e f a u l t V a l u e = " @ s t r i n g / l i s t _ d e f a u l t " / >
< / P r e f e r e n c e S c r e e n >

9.4
Les tableaux de chaînes de caractères

Les tableaux de valeurs pour la liste (fichier  values/arrays.xml) :
< s o u r c e s >
< s t r i n g - a r r a y n a m e = " l i s t _ e n t r i e s " >
< i t e m > v a l u e A < / i t e m >
< i t e m > v a l u e B < / i t e m >
< i t e m > v a l u e C < / i t e m >
< / s t r i n g - a r r a y >
< s t r i n g - a r r a y n a m e = " l i s t _ v a l u e s " >
< i t e m > A < / i t e m >
< i t e m > B < / i t e m >
< i t e m > C < / i t e m >
< / s t r i n g - a r r a y >
< / r e s o u r c e s >

9.5
Création du Fragment Préférences

Le code d'un Fragment affichant les préférences :
p u b l i c c l a s s S e t t i n g s F r a g m e n t e x t e n d s P r e f e r e n c e F r a g m e n t {

@ 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 ) {
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 ) ;
a d d P r e f e r e n c e s F r o m R e s o u r c e ( R . x m l . s e t t i n g s ) ;
}

Les préférences sont automa quement sauvegardées

9.6
Mise à jour du Fragment
Mise en jour du Fragment en fonc on des changements :

   
9.7
Écouter les changements
Mise en jour du Fragment en fonc on des changements :
p u b l i c c l a s s S e t t i n g s F r a g m e n t e x t e n d s P r e f e r e n c e F r a g m e n t
i m p l e m e n t s S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e 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 R e s u m e ( ) {
s u p e r . o n R e s u m e ( ) ;
g e t P r e f e r e n c e S c r e e n ( ) . g e t S h a r e d P r e f e r e n c e s ( )
. r e g i s t e r O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r ( t h i s ) ;
}

@ O v e r r i d e
p u b l i c v o i d o n P a u s e ( ) {
s u p e r . o n P a u s e ( ) ;
g e t P r e f e r e n c e S c r e e n ( ) . g e t S h a r e d P r e f e r e n c e s ( )
. u n r e g i s t e r O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r ( t h i s ) ;
}
}

9.8
Écouter les changements

Implémenta on de la méthode du Listener et mise à jour de la vue :
p u b l i c c l a s s S e t t i n g s F r a g m e n t e x t e n d s P r e f e r e n c e F r a g m e n t
i m p l e m e n t s S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e 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 S h a r e d P r e f e r e n c e C h a n g e d ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ,
S t r i n g k e y ) {
u p d a t e S u m m a r y ( p r e f e r e n c e s , k e y ) ;
}

p r i v a t e v o i d u p d a t e S u m m a r y ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ,
S t r i n g k e y ) {
i f ( k e y . e q u a l s ( " p r e f _ t e x t " ) | | k e y . e q u a l s ( " p r e f _ l i s t " ) ) {
P r e f e r e n c e p r e f e r e n c e = f i n d P r e f e r e n c e ( k e y ) ;
p r e f e r e n c e . s e t S u m m a r y ( p r e f e r e n c e s . g e t S t r i n g ( k e y , " " ) ) ;
}
}
}

9.9
Écouter les changements

Mise à jour de la vue à la créa on :
p u b l i c c l a s s S e t t i n g s F r a g m e n t e x t e n d s P r e f e r e n c e F r a g m e n t
i m p l e m e n t s S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e 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 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 ) ;
a d d P r e f e r e n c e s F r o m R e s o u r c e ( R . x m l . s e t t i n g s ) ;
S h a r e d P r e f e r e n c e s s h a r e d P r e f e r e n c e s =
g e t P r e f e r e n c e S c r e e n ( ) . g e t S h a r e d P r e f e r e n c e s ( ) ;
u p d a t e S u m m a r y ( s h a r e d P r e f e r e n c e s , " p r e f _ t e x t " ) ;
u p d a t e S u m m a r y ( s h a r e d P r e f e r e n c e s , " p r e f _ l i s t " ) ;
}
}

9 . 10
Écouter les changements
Mise à jour de la vue à la créa on :
p u b l i c c l a s s M a i n 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 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 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 _ m a i n , 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 ) 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 ) ;
S h a r e d P r e f e r e n c e s s h a r e d P r e f e r e n c e s =
P r e f e r e n c e M a n a g e r . g e t D e f a u l t S h a r e d P r e f e r e n c e s ( g e t A c t i v i t y ( ) ) ;
u p d a t e V i e w W i t h S e t t i n g s ( s h a r e d P r e f e r e n c e s ) ;
r e t u r n v i e w ;
}

p r i v a t e v o i d u p d a t e V i e w W i t h S e t t i n g s ( S h a r e d P r e f e r e n c e s s h a r e d P r e f e r e n c e s ) {
b o o l e a n c h e c k b o x V a l u e = s h a r e d P r e f e r e n c e s . g e t B o o l e a n ( " p r e f _ c h e c k b o x " , t r u e ) ;
S t r i n g t e x t V a l u e = s h a r e d P r e f e r e n c e s . g e t S t r i n g ( " p r e f _ t e x t " , " " ) ;
S t r i n g l i s t V a l u e = s h a r e d P r e f e r e n c e s . g e t S t r i n g ( " p r e f _ l i s t " , " " ) ;
t e x t V i e w . s e t T e x t ( c h e c k b o x V a l u e + " \ n " + t e x t V a l u e + " \ n " + l i s t V a l u e ) ;
}
}

9 . 11
Vue du fragment principal
Créa on de la vue :
p u b l i c c l a s s M a i n 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 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 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 _ m a i n ,
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 ) 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 ) ;
S h a r e d P r e f e r e n c e s s h a r e d P r e f e r e n c e s =
P r e f e r e n c e M a n a g e r . g e t D e f a u l t S h a r e d P r e f e r e n c e s ( g e t A c t i v i t y ( ) ) ;
u p d a t e V i e w ( s h a r e d P r e f e r e n c e s ) ;
r e t u r n v i e w ;
}

p r i v a t e v o i d u p d a t e V i e w ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ) { / * . . . * / }
}

9 . 12
Récupération des préférences

Récupéra on des valeurs des préférences :
p u b l i c c l a s s M a i n 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 T e x t V i e w 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 V i e w ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ) {
b o o l e a n c h e c k b o x V a l u e =
p r e f e r e n c e s . g e t B o o l e a n ( " p r e f _ c h e c k b o x " , t r u e ) ;
S t r i n g t e x t V a l u e =
p r e f e r e n c e s . g e t S t r i n g ( " p r e f _ t e x t " , " " ) ;
S t r i n g l i s t V a l u e =
p r e f e r e n c e s . g e t S t r i n g ( " p r e f _ l i s t " , " " ) ;
t e x t V i e w . s e t T e x t ( c h e c k b o x V a l u e +
" \ n " + t e x t V a l u e +
" \ n " + l i s t V a l u e ) ;
}
}

9 . 13
Écoute des changements de préférences

Écoute du changement de préférences :
p u b l i c c l a s s M a i n 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 S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e 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 R e s u m e ( ) {
s u p e r . o n R e s u m e ( ) ;
P r e f e r e n c e M a n a g e r . g e t D e f a u l t S h a r e d P r e f e r e n c e s ( g e t A c t i v i t y ( ) ) .
r e g i s t e r O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r ( t h i s ) ;
}

@ O v e r r i d e
p u b l i c v o i d o n P a u s e ( ) {
P r e f e r e n c e M a n a g e r . g e t D e f a u l t S h a r e d P r e f e r e n c e s ( g e t A c t i v i t y ( ) ) .
r e g i s t e r O n S h a r e d P r e f e r e n c e C h a n g e L i s t e n e r ( t h i s ) ;
s u p e r . o n P a u s e ( ) ;
}
}

9 . 14
Écoute des changements de préférences

Modifica on de la vue lorsque les préférences changent :
p u b l i c c l a s s M a i n 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 S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e 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 S h a r e d P r e f e r e n c e C h a n g e d ( S h a r e d P r e f e r e n c e s p r e f e r e n c e s ,
S t r i n g k e y ) {
u p d a t e V i e w ( p r e f e r e n c e s ) ;
}
}

9 . 15
Mise en place du menu

Inser on du menu dans le Fragment principal :
p u b l i c c l a s s M a i n 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 S h a r e d P r e f e r e n c e s . O n S h a r e d P r e f e r e n c e C h a n g e 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 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 H a s O p t i o n s M e n u ( t r u e ) ;
}

@ 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 O p t i o n s M e n u ( M e n u m e n u , M e n u I n f l a t e r i n f l a t e r ) {
i n f l a t e r . i n f l a t e ( R . m e n u . m e n u _ m a i n , m e n u ) ;
}
}

9 . 16
Mise en place du menu
< 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 _ s e t t i n g s "
a n d r o i d : t i t l e = " @ s t r i n g / a c t i o n _ s e t t i n g s "
a n d r o i d : o r d e r I n C a t e g o r y = " 1 0 0 "
a n d r o i d : i c o n = " @ a n d r o i d : d r a w a b l e / i c _ m e n u _ p r e f e r e n c e s "
a n d r o i d : s h o w A s A c t i o n = " a l w a y s " / >
< / m e n u >
}

9 . 17
L'activité principale

Créa on de la vue :
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 M a i n F r a g m e n t ( ) )
. c o m m i t ( ) ;
}
}
}

9 . 18
L'activité principale

Traitement des événements 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 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 ) {
i f ( i t e m . g e t I t e m I d ( ) = = R . i d . a c t i o n _ s e t t i n g s ) {
o p e n S e t t i n g s ( ) ;
r e t u r n t r u e ;
}
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 ) ;
}
}

9 . 19
L'activité principale

Ouverture du Fragment  Préférences :
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 v o i d o p e n S e t t i n g s ( ) {
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 , n e w S e t t i n g s F r a g m e n t ( ) )
. 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 ( ) ;
}
}

9 . 20
Les fichiers
Stockage interne :
Toujours disponible
Par défaut, accessible uniquement par votre applica on
Fichiers Supprimés à la désinstalla on de l'applica on
Sockage externe :
Pas toujours disponible (USB, etc.)
Fichiers Accessibles et modifiables par tout le monde
Seuls les fichiers du répertoire  getExternalFilesDir() sont
supprimés à la désinstalla on de l'applica on
Nécessite des permissions
U le pour partager des données entre applica ons

10 . 1
Créer un fichier dans le stockage interne
Deux répertoires :
getFilesDir() : Le répertoire interne de votre applica on
getCacheDir() : le cache interne de votre applica on

Pour créer un fichier dans l'un de ces répertoires :
F i l e f i l e = n e w F i l e ( c o n t e x t . g e t F i l e s D i r ( ) , " f i c h i e r . t x t " ) ;

ou
F i l e O u t p u t S t r e a m o u t p u t S t r e a m
= o p e n F i l e O u t p u t ( " f i c h i e r . t x t " , C o n t e x t . M O D E _ P R I V A T E ) ;

ou
F i l e f i l e
= F i l e . c r e a t e T e m p F i l e ( " f i c h i e r " , " t m p " , c o n t e x t . g e t C a c h e D i r ( ) ) ;

10 . 2
Écrire et lire des données dans un fichier
Nous souhaitons écrire un éditeur de fichier :
10 . 3
Écrire et lire des données dans un fichier

Supposons que nous ayons l'ac vité suivante :
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 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 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 ) ;
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 ) ;
}
}

10 . 4
Écrire et lire des données dans un fichier

Déclenchement de l'écriture et de la lecture du fichier :
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 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 r o t e c t e d v o i d o n S t a r t ( ) {
s u p e r . o n R e s u m e ( ) ;
e d i t T e x t . s e t T e x t ( l o a d ( ) ) ;
}

@ 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 ( ) {
s u p e r . o n P a u s e ( ) ;
s a v e ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
}
}

10 . 5
Écrire et lire des données dans un fichier

La sauvegarde :
p r i v a t e v o i d s a v e ( S t r i n g s t r i n g ) {
F i l e f i l e = n e w F i l e ( g e t F i l e s D i r ( ) , f i l e n a m e ) ;
t r y ( B u f f e r e d W r i t e r w r i t e r =
n e w B u f f e r e d W r i t e r ( n e w F i l e W r i t e r ( f i l e ) ) ) {
w r i t e r . w r i t e ( s t r i n g ) ;
} c a t c h ( I O E x c e p t i o n e ) {
T o a s t . m a k e T e x t ( t h i s ,
g e t S t r i n g ( R . s t r i n g . r e a d _ e r r o r ) ,
T o a s t . L E N G T H _ L O N G ) ;
}
}

10 . 6
Écrire et lire des données dans un fichier

La lecture :
p r i v a t e S t r i n g l o a d ( ) {
F i l e f i l e = n e w F i l e ( g e t F i l e s D i r ( ) , f i l e n a m e ) ;
i f ( ! f i l
e . e x i s t s ( ) ) r e t u r n " " ;
t r y ( B u f
f e r e d R e a d e r r e a d e r =
n e w B u f f e r e d R e a d e r ( n e w F i l e R e a d e r ( f i l e ) ) ) {
r e t u r n l o a d ( r e a d e r ) ;
} c a t c h ( I O E x c e p t i o n e ) {
T o a s t . m a k e T e x t ( t h i s ,
g e t S t r i n g ( R . s t r i n g . r e a d _ e r r o r ) ,
T o a s t . L E N G T H _ L O N G ) ;
r e t u r n " " ;
}
}

10 . 7
Écrire et lire des données dans un fichier

La lecture :
p r i v a t e S t r i n g l o a d ( B u f f e r e d R e a d e r r e a d e r ) t h r o w s I O E x c e p t i o n {
S t r i n g B u i l d e r b u i l d e r = n e w S t r i n g B u i l d e r ( ) ;
f o r ( ; ; ) {
S t r i n g l i n e = r e a d e r . r e a d L i n e ( ) ;
i f ( l i n e = = n u l l ) b r e a k ;
b u i l d e r . a p p e n d ( l i n e ) . a p p e n d ( " \ n " ) ;
}
r e t u r n b u i l d e r . t o S t r i n g ( ) ;
}

10 . 8
Permissions pour le stockage externe
Il suffit d'ajouter les permissions dans le manifeste de l'applica on :

Pour l'écriture :
< m a n i f e s t >
< 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 . W R I T E _ E X T E R N A L _ S T O R A G E " / >
< / m a n i f e s t >

Pour la lecture :
< m a n i f e s t >
< 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 A D _ E X T E R N A L _ S T O R A G E " / >
< / m a n i f e s t >

10 . 9
Un exemple d'application
Nous souhaitons parcourir et lire les fichiers du stockage externe :
 
 
Deux types de fragments :
Affichage d'un répertoire :  DirectoryFragment
Affichage du contenu d'un fichier :  FileFragment
Affichage du contenu d'un fichier

< F r a m 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 " >
< S c r o l l 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 " >
< 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 = " w r a p _ c o n t e n t "
a n d r o i d : i d = " @ + i d / t e x t V i e w " / >
< / S c r o l l V i e w >
< / F r a m e L a y o u t >

10
10 .. 11
10
Affichage du contenu d'un fichier

Créa on de l'instance et conserva on du chemin :


p u b l i c c l a s s F i l e 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 F i l e F r a g m e n t n e w I n s t a n c e ( S t r i n g f i l e n a m e ) {
F i l e F r a g m e n t f r a g m e n t = n e w F i l e F r a g m e n t ( ) ;
B u n d l e a r g s = n e w B u n d l e ( ) ;
a r g s . p u t S t r i n g ( " p a t h " , f i l e n a m e ) ;
f r a g m e n t . s e t A r g u m e n t s ( a r g s ) ;
r e t u r n f r a g m e n t ;
}

p r i v a t e S t r i n g p a t h ( ) { r e t u r n g e t A r g u m e n t s ( ) . g e t S t r i n g ( " p a t h " ) ; }

10 . 12
Affichage du contenu d'un fichier
Créa on de la vue et ges on du cycle de vie :
p u b l i c c l a s s F i l e 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 T e x t V i e w t e x t V i e w ;

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 i l e ,
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 ) 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 ) ;
r e t u r n v i e w ;
}

p u b l i c 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 ( ) ; t e x t V i e w . s e t T e x t ( l o a d ( ) ) ;
g e t A c t i v i t y ( ) . s e t T i t l e ( p a t h ( ) ) ;
}
}

10 . 13
Affichage du contenu d'un fichier
Chargement du contenu du fichier :
p u b l i c c l a s s F i l e 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 S t r i n g l o a d ( ) {
F i l e f i l e = n e w F i l e ( p a t h ( ) ) ;
i f ( ! f i l e . e x i s t s ( ) ) r e t u r n " " ;
t r y ( B u f f e r e d R e a d e r r e a d e r =
n e w B u f f e r e d R e a d e r ( n e w F i l e R e a d e r ( f i l e ) ) ) {
r e t u r n l o a d ( r e a d e r ) ;
} c a t c h ( I O E x c e p t i o n e ) {
T o a s t . m a k e T e x t ( t h i s . g e t A c t i v i t y ( ) ,
g e t S t r i n g ( R . s t r i n g . r e a d _ e r r o r ) ,
T o a s t . L E N G T H _ L O N G ) ;
r e t u r n " " ;
}
}
}

10 . 14
Affichage du contenu d'un fichier

Chargement du contenu du fichier :
p u b l i c c l a s s F i l e 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 S t r i n g l o a d ( B u f f e r e d R e a d e r r e a d e r ) t h r o w s I O E x c e p t i o n {
S t r i n g B u i l d e r b u i l d e r = n e w S t r i n g B u i l d e r ( ) ;
f o r ( ; ; ) {
S t r i n g l i n e = r e a d e r . r e a d L i n e ( ) ;
i f ( l i n e = = n u l l ) b r e a k ;
b u i l d e r . a p p e n d ( l i n e ) . a p p e n d ( " \ n " ) ;
}
r e t u r n b u i l d e r . t o S t r i n g ( ) ;
}
}

10 . 15
Affichage du contenu d'un répertoire

Créa on de l'instance :
p u b l i c c l a s s D i r e c t o r y F r a g m e n t e x t e n d s L i s t F r a g m e n t {
p u b l i c s t a t i c D i r e c t o r y F r a g m e n t n e w I n s t a n c e ( S t r i n g p a t h ) {
D i r e c t o r y F r a g m e n t f r a g m e n t = n e w D i r e c t o r y F r a g m e n t ( ) ;
B u n d l e a r g s = n e w B u n d l e ( ) ;
a r g s . p u t S t r i n g ( " p a t h " , p a t h ) ;
f r a g m e n t . s e t A r g u m e n t s ( a r g s ) ;
r e t u r n f r a g m e n t ;
}

p r i v a t e S t r i n g p a t h ( ) { r e t u r n g e t A r g u m e n t s ( ) . g e t S t r i n g ( " p a t h " ) ; }
}

10 . 16
Affichage du contenu d'un répertoire
Créa on de la vue et ges on du cycle de vie :
p u b l i c c l a s s D i r e c t o r y F r a g m e n t e x t e n d s L i s t F r a g m e n t {
p r i v a t e S t r i n g [ ] f i l e s ;

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 ) ;
F i l e d i r e c t o r y = n e w F i l e ( p a t h ( ) ) ;
f i l e s = d i r e c t o r y . l i s t ( ) ;
s e t L i s t A d a p t e r ( n e w A r r a y A d a p t e r < > ( g e t A c t i v i t y ( ) ,
a n d r o i d . R . l a y o u t . s i m p l e _ l i s t _ i t e m _ 1 ,
a n d r o i d . R . i d . t e x t 1 , f i l e s ) ) ;
}

p u b l i c 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 ( ) ;
g e t A c t i v i t y ( ) . s e t T i t l e ( p a t h ( ) ) ;
}
}

10 . 17
Affichage du contenu d'un répertoire

Mise en place des no fica ons de l'ac vité :


p u b l i c c l a s s D i r e c t o r y F r a g m e n t e x t e n d s L i s t F r a g m e n t {
p r i v a t e O n D i r e c t o r y 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 u b l i c i n t e r f a c e O n D i r e c t o r y F r a g m e n t L i s t e n e r {
p u b l i c v o i d o n C h a n g e P a t h ( S t r i n g p a t h ) ;
}
}

10 . 18
Affichage du contenu d'un répertoire
Mise en place des no fica ons de l'ac vité :
p u b l i c c l a s s D i r e c t o r y F r a g m e n t e x t e n d s L i s t F r a g m e n t {
p r i v a t e O n D i r e c t o r y 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 = ( O n D i r e c t o r y 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 O n D i r e c t o r y 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 D e t a c h ( ) { s u p e r . o n D e t a c h ( ) ; l i s t e n e r = n u l l ; }
}

10 . 19
Affichage du contenu d'un répertoire

Mise en place des no fica ons de l'ac vité :


p u b l i c c l a s s D i r e c t o r y F r a g m e n t e x t e n d s L i s t F r a g m e n t {
p r i v a t e O n D i r e c t o r y 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 L i s t I t e m C l i c k ( L i s t V i e w l i s t ,
V i e w v i e w ,
i n t p o s i t i o n , l o n g i d ) {
s u p e r . o n L i s t I t e m C l i c k ( l i s t , v i e w , p o s i t i o n , i d ) ;
i f ( n u l l ! = l i s t e n e r ) {
S t r i n g p a t h = p a t h ( ) . e q u a l s ( " / " ) ? " " : p a t h ( ) ;
l i s t e n e r . o n C h a n g e P a t h ( p a t h + " / " + f i l e s [ p o s i t i o n ] ) ;
}
}
}

10 . 20
L'activité principale

Créa on de le la vue :
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 , D i r e c t o r y F r a g m e n t . n e w I n s t a n c e ( " / " ) )
. c o m m i t ( ) ;
}
}
}

10 . 21
L'activité principale
Récep on des no fica ons des fragments :
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 r e c t o r y F r a g m e n t . O n D i r e c t o r y 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 C h a n g e P a t h ( S t r i n g p a t h ) {
F i l e f i l e = n e w F i l e ( p a t h ) ;
F r a g m e n t f r a g m e n t =
( f i l e . i s D i r e c t o r y ( ) )
? D i r e c t o r y F r a g m e n t . n e w I n s t a n c e ( p a t h )
: F i l e F r a g m e n t . n e w I n s t a n c e ( p a t h ) ;
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 , f r a g m e n t )
. a d d T o B a c k S t a c k ( p a t h )
. c o m m i t ( ) ;
}

10 . 22
Bases de données SQLite

Comment stocker des infos structurées dans base de données ?

Pour cela, nous allons :

définir un modèle de données (les tables) ;
représenter ce modèle sous la forme de classes ;
définir un  SQL Helper pour faciliter la créa on des tables ;
voir comment modifier, consulter les données.

11 . 1
Définition du modèle

Défini on du modèle de données, c'est‐à‐dire, les tables :
p u b l i c c l a s s D a t a b a s e C o n t r a c t {
p u b l i c i n t e r f a c e A r t i c l e e x s t e n d s B a s e C o l u m n s {
S t r i n g t a b l e N a m e = " a rt i c l e s " ;
S t r i n g c o l u m n G u i d = " gu i d " ;
S t r i n g c o l u m n G u i d T y p e = " T E X T " ;
S t r i n g c o l u m n T i t l e = "
t i t l e " ;
S t r i n g c o l u m n T i t l e T y p e= " T E X T " ;
S t r i n g c o l u m n C o n t e n t = " c o n t e n t " ;
S t r i n g c o l u m n C o n t e n t T y p e = " T E X T " ;
}
}

Les autres types possibles :  NULL,  INTEGER,  REAL et  BLOB ;


Il peut y avoir plusieurs tables.

11 . 2
Définition du SQLiteOpenHelper
Instruc ons SQL à par r de la défini on du modèle :
p u b l i c c l a s s D a t a b a s e O p e n H e l p e r e x t e n d s S Q L i t e O p e n H e l p e r {

p r i v a t e s t a t i c f i n a l S t r i n g S Q L C r e a t e T a b l e A r t i c l e s =
" C R E A T E T A B L E " + D a t a b a s e C o n t r a c t . A r t i c l e s. t a b l e N a m e + " ( " +
D a t a b a s e C o n t r a c t . A r t i c l e s . _ I D + " I N T E G E R P R I M A R Y K E Y , " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d + " " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d T y p e + " , " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n T i t l e + "
" +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n T i t l e T y p e+ " , " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n C o n t e n t + " " +
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n C o n t e n t T y p e +
" ) " ;

p r i v a t e s t a t i c f i n a l S t r i n g S Q L D e l e t e T a b l e A r t i c l e s =
" D R O P T A B L E I F E X I S T S " ` D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e ;
}

11 . 3
Définition du SQLiteOpenHelp

Créa on de la base de données :
p u b l i c c l a s s D a t a b a s e O p e n H e l p e r e x t e n d s S Q L i t e O p e n H e l p e r {
p u b l i c s t a t i c f i n a l i n t d a t a b a s e V e r s i o n = 1 ;
p u b l i c s t a t i c f i n a l S t r i n g d a t a b a s e N a m e = " a r t i c l e s . d b " ;

p u b l i c D a t a b a s e O p e n H e l p e r ( C o n t e x t c o n t e x t ) {
s u p e r ( c o n t e x t , d a t a b a s e N a m e , n u l l , d a t a b a s e V e r s i o n ) ;
}

@ 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 ( S Q L i t e D a t a b a s e d a t a b a s e ) {
d a t a b a s e . e x e c S Q L ( S Q L C r e a t e T a b l e A r t i c l e s ) ;
}
}

11 . 4
Définition du SQLiteOpenHelper
Mise à jour de la base de données lors d'un changement de version :
p u b l i c c l a s s D a t a b a s e O p e n H e l p e r e x t e n d s S Q L i t e O p e n H e l p e r {
p u b l i c s t a t i c f i n a l i n t d a t a b a s e V e r s i o n = 1 ;

@ O v e r r i d e
p u b l i c v o i d o n U p g r a d e ( S Q L i t e D a t a b a s e d a t a b a s e , i n t o l d V e r s i o n ,
i n t n e w V e r s i o n ) {
d a t a b a s e . e x e c S Q L ( S Q L D e l e t e T a b l e A r t i c l e s ) ;
o n C r e a t e ( d a t a b a s e ) ;
}

@ O v e r r i d e
p u b l i c v o i d o n D o w n g r a d e ( S Q L i t e D a t a b a s e d a t a b a s e , i n t o l d V e r s i o n ,
i n t n e w V e r s i o n ) {
o n U p g r a d e ( d a t a b a s e , o l d V e r s i o n , n e w V e r s i o n ) ;
}
}

11 . 5
Utilisation du SQLiteOpenHelper

Avant d'u liser le SQLiteOpenHelper, il faut l'instancier :
d a t a b a s e O p e n H e l p e r = n e w D a t a b a s e O p e n H e l p e r ( c o n t e x t ) ;

Inser on ( INSERT INTO) :


p u b l i c v o i d i n s e r t ( A r t i c l e a r t i c l e ) {
S Q L i t e D a t a b a s e d a t a b a s e = d a t a b a s e O p e n H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ;
C o n t e n t V a l u e s v a l u e s = n e w C o n t e n t V a l u e s ( ) ;
v a l u e s . p u t ( D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d , a r t i c l e . g u i d ) ;
v a l u e s . p u t ( D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n C o n t e n t , a r t i c l e . c o n t e n t ) ;
v a l u e s . p u t ( D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n T i t l e , a r t i c l e . t i t l e ) ;
d a t a b a s e . i n s e r t ( D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e , n u l l , v a l u e s ) ;
}

11 . 6
Utilisation du SQLiteOpenHelper

Mise en jour ( UPDATE) :
p u b l i c v o i d u p d a t e ( A r t i c l e a r t i c l e ) {
S Q L i t e D a t a b a s e d a t a b a s e = d a t a b a s e O p e n H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ;
C o n t e n t V a l u e s v a l u e s = n e w C o n t e n t V a l u e s ( ) ;
v a l u e s . p u t ( D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n C o n t e n t , a r t i c l e . c o n t e n t ) ;
v a l u e s . p u t ( D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n T i t l e , a r t i c l e . t i t l e ) ;
S t r i n g s e l e c t i o n = D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d ` " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { a r t i c l e . g u i d } ;
d a t a b a s e . u p d a t e ( D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e , v a l u e s ,
s e l e c t i o n , s e l e c t i o n A r g s ) ;
}

11 . 7
Utilisation du SQLiteOpenHelper

Suppression ( DELETE) :
p u b l i c v o i d d e l e t e ( S t r i n g g u i d ) {
S Q L i t e D a t a b a s e d a t a b a s e = d a t a b a s e O p e n H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ;
S t r i n g s e l e c t i o n = D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d ` " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { g u i d } ;
d a t a b a s e . d e l e t e ( D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e ,
s e l e c t i o n ,
s e l e c t i o n A r g s ) ;
}

11 . 8
Utilisation du SQLiteOpenHelper
SELECT * FROM articles :
p u b l i c C u r s o r g e t A r t i c l e s ( ) {
S Q L i t e D a t a b a s e d a t a b a s e = d a t a b a s e O p e n H e l p e r . g e t R e a d a b l e D a t a b a s e ( ) ;
r e t u r n d a t a b a s e . q u e r y ( D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e ,
n u l l , n u l l , n e w S t r i n g [ ] { } , n u l l , n u l l , n u l l ) ;
}

SELECT guild, title FROM articles WHERE title LIKE "%s%" :


p u b l i c C u r s o r g e t A r t i c l e
S t r i s ( n g s ) {
S Q L i t e D a t a b a s e e = d a t a b a s d a t a b a s e O p e n H e l p e r . g e t R e a d a b l e D a t a b a s e ( ) ;
S t r i n g s e l e c t i o n = D
a b a s a t e C o n t r a c t . A r t i c l e s . c o l u m n T i t l e ` " L I K E ? " ;
S t r i n g [ ] s e l e c t i o n A r
= { g s " % " ` s ` " % " } ;
S t r i n g [ ] c o l u m n s = {
a t a b D a s e C o n t r a c t . A r t i c l e s . c o l u m n G u i d ,
D a t a b a s e C o n t r a c t . A r t i c l e s . c o l u m n T i t l e } ;
r e t u r n d a t a b a s e . q u e r y ( D a t a b a s e C o n t r a c t . A r t i c l e s . t a b l e N a m e ,
c o l u m n s , s e l e c t i o n , s e l e c t i o n A r g s , n u l l , n u l l , n u l l ) ;
}

11 . 9
Les curseurs
Les curseurs perme ent de parcourir le résultat d'une requête :

int getCount();

boolean moveToFirst();

boolean moveToNext();

boolean moveToPosition(int position);

int getColumnIndex(String columnName);

String getString(int cId),  double getDouble(int cId)...

void close();

...

11 . 10
Exemple d'application
  11 . 11
Les tables

La structure de la base de données :
p u b l i c c l a s s D a t a b a s e C o n t r a c t {

p u b l i c i n t e r f a c e I t e m s e x t e n d s B a s e C o l u m n s {
S t r i n g t a b l e N a m e = " i t e m s " ;
S t r i n g c o l u m n T e x t = " t e x t " ;
S t r i n g c o l u m n T e x t T y p e = " T E X T " ;
}

11 . 12
Le code de l'activité principale

En supposant que nous avons écrit le  SQLiteOpenHelper :
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 D a t a b a s e O p e n H e l p e r d a t a b a s e O p e n H e l p e r ;
p r i v a t e I t e m A d a p t e r a d a p t e r ;
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 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 ) ;
d a t a b a s e O p e n H e l p e r = n e w D a t a b a s e O p e n H e l p e r ( t h i s ) ;
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 ) ;
r e c y c l e r V i e w = ( R e c y c l e r V i e w ) f i n d V i e w B y I d ( R . i d . r e c y c l e r V i e w ) ;
r e c y c l e r V i e w . s e t L a y o u t M a n a g e r ( n e w L i n e a r L a y o u t M a n a g e r ( t h i s ) ) ;
a d a p t e r = n e w I t e m A d a p t e r ( g e t I t e m s ( ) ) ;
r e c y c l e r V i e w . s e t A d a p t e r ( a d a p t e r ) ;
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 ) ;
}
}

11 . 13
Le code de l'activité principale

Les méthodes qui interagissent avec la base de données :
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 D a t a b a s e O p e n H e l p e r d a t a b a s e O p e n H e l p e r ;

p r i v a t e C u r s o r g e t I t e m s ( ) {
S Q L i t e D a t a b a s e d a t a b a s e =
d a t a b a s e O p e n H e l p e r . g e t R e a d a b l e D a t a b a s e ( ) ;
r e t u r n d a t a b a s e . q u e r y ( D a t a b a s e C o n t r a c t . I t e m s . t a b l e N a m e ,
n u l l , n u l l , n e w S t r i n g [ ] { } , n u l l , n u l l , n u l l ) ;
}

p r i v a t e v o i d i n s e r t I t e m ( S t r i n g t e x t ) {
S Q L i t e D a t a b a s e d a t a b a s e = d a t a b a s e O p e n H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ;
C o n t e n t V a l u e s v a l u e s = n e w C o n t e n t V a l u e s ( ) ;
v a l u e s . p u t ( D a t a b a s e C o n t r a c t . I t e m s . c o l u m n T e x t , t e x t ) ;
d a t a b a s e . i n s e r t ( D a t a b a s e C o n t r a c t . I t e m s . t a b l e N a m e , n u l l , v a l u e s ) ;
}
}

11 . 14
Le code de l'activité principale

Traitement des clics sur le bouton "Ajouter" :
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 t e m A d a p t e r a d a p t e r ;
p r i v a t e E d i t T e x t e d i t T e x t ;

p u b l i c v o i d o n A d d I t e m ( V i e w v i e w ) {
i n s e r t I t e m ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
a d a p t e r . c h a n g e C u r s o r ( g e t I t e m s ( ) ) ;
e d i t T e x t . s e t T e x t ( " " ) ;
}
}

11 . 15
Le code de l'adaptateur
Créa on des vues :
p u b l i c c l a s s I t e m A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < V i e w H o l d e r > {

p r i v a t e C u r s o r c u r s o r ;

p u b l i c I t e m A d a p t e r ( C u r s o r c u r s o r ) {
t h i s . c u r s o r = c u r s o r ;
}

@ O v e r r i d e
p u b l i c V i e w H o l d e r o n C r e a t e V i e w H o l d e r ( V i e w G r o u p p a r e n t , i n t v i e w T y p e ) {
V i e w v i e w = L a y o u t I n f l a t e r . f r o m ( p a r e n t . g e t C o n t e x t ( ) )
. i n f l a t e ( R . l a y o u t . i t e m , p a r e n t , f a l s e ) ;
V i e w H o l d e r v i e w H o l d e r = n e w V i e w H o l d e r ( v i e w ) ;
r e t u r n v i e w H o l d e r ;
}

11 . 16
Le code de l'adaptateur
Mise à jour des vues et nombre d'éléments dans le curseur :
p u b l i c c l a s s I t e m A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < V i e w H o l d e r > {
p r i v a t e C u r s o r c u r s o r ;

@ O v e r r i d e
p u b l i c v o i d o n B i n d V i e w H o l d e r ( V i e w H o l d e r h o l d e r , i n t p o s i t i o n ) {
c u r s o r . m o v e T o P o s i t i o n ( p o s i t i o n ) ;
i n t i n d e x =
c u r s o r . g e t C o l u m n I n d e x ( D a t a b a s e C o n t r a c t . I t e m s . c o l u m n T e x t ) ;
S t r i n g t e x t = c u r s o r . g e t S t r i n g ( i n d e x ) ;
h o l d e r . b i n d ( t e x t ) ;
}

@ O v e r r i d e
p u b l i c i n t g e t I t e m C o u n t ( ) { r e t u r n c u r s o r . g e t C o u n t ( ) ; }

11 . 17
Le code de l'adaptateur

Changement de curseur :
p u b l i c c l a s s I t e m A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < V i e w H o l d e r > {

p r i v a t e C u r s o r c u r s o r ;

p u b l i c v o i d c h a n g e C u r s o r ( C u r s o r c u r s o r ) {
t h i s . c u r s o r . c l o s e ( ) ;
t h i s . c u r s o r = c u r s o r ;
n o t i f y D a t a S e t C h a n g e d ( ) ;
}

11 . 18
Le code de ViewHolder

p u b l i c c l a s s V i e w H o l d e r e x t e n d s R e c y c l e r V i e w . V i e w H o l d e r {
p r i v a t e f i n a l T e x t V i e w t e x t V i e w ;

p u b l i c V i e w H o l d e r ( V i e w i t e m V i e w ) {
s u p e r ( i t e m V i e w ) ;
t e x t V i e w = ( T e x t V i e w ) i t e m V i e w . f i n d V i e w B y I d ( R . i d . t e x t ) ;
}

p u b l i c v o i d b i n d ( 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 ) ;
}
}

11 . 19
Fournisseur de contenu
Un fournisseur de contenu est un composant d'une applica on
Il permet l'accès à des données
Il présente les données sous la forme d'une ou plusieurs tables
Chaque ligne possède un iden fiant

_ID firstname lastname


1 Bob Machin
2 Alice Truc
3 Oscar Chose
4 Trudy Bidule

12 . 1
Fournisseur de contenu

On accède à un fournisseur de contenu via un  ContentResolver
C o n t e n t R e s o l v e r c o n t e n t R e s o l v e r = c o n t e x t . g e t C o n t e n t R e s o l v e r ( ) ;

Il permet les quatres opéra ons de base (CRUD) :
Create :  contentResolver.insert
Read :  contentResolver.query
Update :  contentResolver.update
Delete :  contentResolver.delete

12 . 2
Content URIs
Un URI (Uniform Resource Iden fier) iden fie une donnée
La classe  Uri va nous perme re de manipuler des URI
S t r i n g a u t h o r i t y = " c o m . u n i v _ a m u . c c i " ;
S t r i n g u s e r s = " u s e r s " ;
U r i c o n t e n t U r i = U r i . p a r s e ( " c o n t e n t : / / " + a u t h o r i t y + " / " + u s e r s ) ;
/ / - > c o n t e n t : / / c o m . u n i v _ a m u . c c i / u s e r s
U r i u s e r 2 U r i = C o n t e n t U r i s . w i t h A p p e n d e d I d ( c o n t e n t U r i , 2 ) ;
/ / - > c o n t e n t : / / c o m . u n i v _ a m u . c c i / u s e r s / 2

Pour faire une requête, il faut un Uri :
c u r s o r = c o n t e n t R e s o l v e r . q u e r y ( c o n t e n t U r i , / * . . . * / ) ;
c o n t e n t R e s o l v e r . i n s e r t ( c o n t e n t U r i , / * . . . * / ) ;
c o n t e n t R e s o l v e r . d e l e t e ( u s e r 2 U r i , / * . . . * / ) ;

12 . 3
Schéma de la base de données

p u b l i c c l a s s C o n t r a c t {
p u b l i c s t a t i c f i n a l S t r i n g A U T H O R I T Y = " c o m . u n i v _ a m u . c c i " ;
p u b l i c s t a t i c f i n a l S t r i n g U S E R S = " u s e r s " ;
p u b l i c s t a t i c f i n a l U r i C O N T E N T _ U R I =
U r i . p a r s e ( " c o n t e n t : / / " + A U T H O R I T Y + " / " + U S E R S ) ;

p u b l i c i n t e r f a c e U s e r s e x t e n d s B a s e C o l u m n s {
S t r i n g F I R S T N A M E = " F I R S T N A M E " ;
S t r i n g L A S T N A M E = " L A S T N A M E " ;
}
}

L'interface  BaseColumns con ent  _ID

12 . 4
Effectuer d'une requête
c u r s o r = c o n t e n t R e s o l v e r . q u e r y ( C o n t r a c t . C O N T E N T _ U R I ,
p r o j e c t i o n , s e l e c t i o n , s e l e c t i o n A r g s , s o r t O r d e r ) ;

Selec on des colonnes
S t r i n g [ ] p r o j e c t i o n = { C o n t r a c t . U s e r s . _ I D ,
C o n t r a c t . U s e r s . F I R S T N A M E ,
C o n t r a c t . U s e r s . L A S T N A M E } ;

Ajout d'une clause "where"
S t r i n g s e l e c t i o n = C o n t r a c t . U s e r s . F I R S T N A M E + " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { " B o b " } ;

Ajout d'un "order by"
S t r i n g s o r t O r d e r = C o n t r a c t . U s e r s . L A S T N A M E + " A S C " ;

S e l e c t _ I D , F I R S T N A M E , L A S T N A M E
F R O M U S E R S W H E R E F I R S T N A M E = ' b o b ' O R D E R B Y L A S T N A M E A S C ;

12 . 5
Insérer des données

n e w U r i = c o n t e n t R e s o l v e r . i n s e r t ( C o n t r a c t . C O N T E N T _ U R I , v a l u e s ) ;

Les valeurs à ajouer
C o n t e n t V a l u e s v a l u e s = n e w C o n t e n t V a l u e s ( ) ;
v a l u e s . p u t ( C o n t r a c t . U s e r s . F I R S T N A M E , " B o b " ) ;
v a l u e s . p u t ( C o n t r a c t . U s e r s . L A S T N A M E , " M a c h i n " ) ;

Uri retourné
c o n t e n t : / / c o m . u n i v _ a m u . c c i / u s e r s / [ i d e n t i f i a n t d e l a n o u v e l l e l i g n e ]

I N S E R T I N T O U S E R S ( F I R S T N A M E , L A S T N A M E ) V A L U E S ( " B o b " , " M a c h i n " ) ;

12 . 6
Modifier des données

r o w s U p d a t e d C o u n t = c o n t e n t R e s o l v e r . u p d a t e ( C o n t r a c t . C O N T E N T _ U R I ,
v a l u e s , s e l e c t i o n , s e l e c t i o n A r g s ) ;

Données à me re à jour
C o n t e n t V a l u e s v a l u e s = n e w C o n t e n t V a l u e s ( ) ;
v a l u e s . p u t ( C o n t r a c t . U s e r s . L A S T N A M E , " T r u c " ) ;

Ajout d'une clause "where"
S t r i n g s e l e c t i o n = C o n t r a c t . U s e r s . F I R S T N A M E + " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { " B o b " } ;

U P D A T E U S E R S S E T L A S T N A M E = " T r u c " W H E R E F I R S T N A M E = " B o b " ;

12 . 7
Supprimer des données

r o w s D e l e t e d C o u n t = c o n t e n t R e s o l v e r . d e l e t e ( C o n t r a c t . C O N T E N T _ U R I ,
s e l e c t i o n , s e l e c t i o n A r g s ) ;

Ajout d'une clause "where"
S t r i n g s e l e c t i o n = C o n t r a c t . U s e r s . F I R S T N A M E + " = ? " ;
S t r i n g [ ] s e l e c t i o n A r g s = { " B o b " } ;

D E L E T E F R O M U S E R S W H E R E F I R S T N A M E = " B o b " ;

12 . 8
Implémentation d'un fournisseur de contenu
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {
@ 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 v e r r i d e
p u b l i c C u r s o r q u e r y ( U r i u r i ,
S t r i n g [ ] p r o j e c t i o n ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ,
S t r i n g s o r t O r d e r ) { / * . . . * / }

@ O v e r r i d e
p u b l i c C u r s o r i n s e r t ( U r i u r i , C o n t e n t V a l u e s v a l u e s ) { / * . . . * / }

@ O v e r r i d e
p u b l i c C u r s o r u p d a t e ( U r i u r i , C o n t e n t V a l u e s v a l u e s ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ) { / * . . . * / }

@ O v e r r i d e
p u b l i c C u r s o r d e l e t e ( U r i u r i ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ) { / * . . . * / }

@ O v e r r i d e
p u b l i c S t r i n g g e t T y p e ( U r i u r i ) { / * . . . * / }
}

12 . 9
Déclaration du fournisseur de contenu

Dans le manifeste de l'applica on :
< m a n i f e s t . . . >
< a p p l i c a t i o n . . . >
. . .
< pr 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 n d r o i d : n a m e = " . U s e r s P r o v i d e r "
a n d r o i d : e x p o r t e d = " t r u e " / >
< a p p l i c a t i o n >
< / m a n i f e s t >

12 . 10
DatabaseHelper pour SQLite
p u b l i c c l a s s U s e r D a t a b a s e H e l p e r e x t e n d s S Q L i t e O p e n H e l p e r {
p r i v a t e s t a t i c f i n a l i n t D A T A B A S E _ V E R S I O N = 1 ;
p u b l i c s t a t i c f i n a l S t r i n g D A T A B A S E _ N A M E = " u s e r s . d b " ;

p u b l i c U s e r D a t a b a s e H e l p e r ( C o n t e x t c o n t e x t ) {
s u p e r ( c o n t e x t , D A T A B A S E _ N A M E , n u l l , D A T A B A S E _ V E R S I O N ) ;
}

@ 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 ( S Q L i t e D a t a b a s e d b ) { c r e a t e T a b l e ( d b ) ; }

@ O v e r r i d e
p u b l i c v o i d o n U p g r a d e ( S Q L i t e D a t a b a s e d b , i n t o l d V e r s i o n , i n t n e w V e r s i o n ) {
d r o p T a b l e ( d b ) ; o n C r e a t e ( d b ) ;
}

@ O v e r r i d e
p u b l i c v o i d o n D o w n g r a d e ( S Q L i t e D a t a b a s e d b , i n t o l d V e r s i o n , i n t n e w V e r s i o n ) {
o n U p g r a d e ( d b , o l d V e r s i o n , n e w V e r s i o n ) ;
}

p r i v a t e s t a t i c v o i d c r e a t e T a b l e ( S Q L i t e D a t a b a s e d b ) { / * . . * / }
p r i v a t e s t a t i c v o i d d r o p T a b l e ( S Q L i t e D a t a b a s e d b ) { / * . . . * / }
}

12 . 11
Utilisation du DatabaseHelper
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {
p r i v a t e U s e r D a t a b a s e H e l p e r o p e n H e l p e r ;

@ 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 e n H e l p e r = n e w U s e r D a t a b a s e H e l p e r ( g e t C o n t e x t ( ) ) ;
}

@ O v e r r i d e
p u b l i c C u r s o r q u e r y ( U r i u r i ,
S t r i n g [ ] p r o j e c t i o n ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ,
S t r i n g s o r t O r d e r ) {
S Q L i t e D a t a b a s e d a t a b a s e = o p e n H e l p e r . g e t R e a d a b l e D a t a b a s e ( ) ; / * . . . * /
}

@ O v e r r i d e
p u b l i c C u r s o r u p d a t e ( U r i u r i , C o n t e n t V a l u e s v a l u e s ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ) {
S Q L i t e D a t a b a s e d a t a b a s e = o p e n H e l p e r . g e t W r i t a b l e D a t a b a s e ( ) ; / * . . . * /
}
/ * . . . * /
}

12 . 12
Détection du type d'URI
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {
p r i v a t e s t a t i c f i n a l i n t U S E R S = 1 ;
p r i v a t e s t a t i c f i n a l i n t U S E R S _ I D = 2 ;

p r i v a t e s t a t i c f i n a l U r i M a t c h e r u r i M a t c h e r =
n e w U r i M a t c h e r ( U r i M a t c h e r . N O _ M A T C H ) ;

s t a t i c {
u r i M a t c h e r . a d d U R I ( C o n t r a c t . A U T H O R I T Y , C o n t r a c t . U S E R S , U S E R S ) ;
u r i M a t c h e r . a d d U R I ( C o n t r a c t . A U T H O R I T Y , C o n t r a c t . U S E R S + " / # " , U S E R S _ I D ) ;
}

@ O v e r r i d e
p u b l i c C u r s o r q u e r y ( U r i u r i , S t r i n g [ ] p r o j e c t i o n ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ,
S t r i n g s o r t O r d e r ) {
s w i t c h ( u r i M a t c h e r . m a t c h ( u r i ) ) {
c a s e A L A R M S : / * . . . * / b r e a k ;
c a s e A L A R M S _ I D :
S t r i n g i d = u r i . g e t L a s t P a t h S e g m e n t ( ) ;
/ * . . . * / b r e a k ;
d e f a u l t : t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( " U n k n o w n U R I " + u r i ) ;
} / * . . . * /
}

12 . 13
Type MIME (Multipurpose Internet Mail Extensions)
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {
/ * . . . * /

@ O v e r r i d e
p u b l i c S t r i n g g e t T y p e ( U r i u r i ) {
s w i t c h ( u r i M a t c h e r . m a t c h ( u r i ) ) {
c a s e U S E R S :
r e t u r n " v n d . a n d r o i d . c u r s o r . d i r / v n d . c o m . u n i v _ a m u . c c i . u s e r s " ;
c a s e U S E R S _ I D :
r e t u r n " v n d . a n d r o i d . c u r s o r . i t e m / v n d . c o m . u n i v _ a m u . c c i . u s e r s " ;
d e f a u l t :
t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( " U n k n o w n U R I " + u r i ) ;
}
}
}

Descrip on du type des données retournées par un URI
Format :  vnd.android.cursor.[dir|item]/vnd.<name>.<type>

12 . 14
Adaptateur utilisant un fournisseur de contenu
p u b l i c c l a s s U s e r s A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < U s e r V i e w H o l d e r > {
p r i v a t e C u r s o r c u r s o r ;

@ O v e r r i d e
p u b l i c v o i d o n B i n d V i e w H o l d e r ( U s e r V i e w H o l d e r v i e w H o l d e r , i n t p o s i t i o n ) {
i f ( ! c u r s o r . m o v e T o P o s i t i o n ( p o s i t i o n ) ) { r e t u r n ; }
v i e w H o l d e r . b i n d ( c u r s o r ) ;
}

@ O v e r r i d e
p u b l i c i n t g e t I t e m C o u n t ( ) {
r e t u r n c u r s o r = = n u l l ? 0 : c u r s o r . g e t C o u n t ( ) ;
}

p u b l i c v o i d s w a p C u r s o r ( C u r s o r c u r s o r ) {
i f ( t h i s . c u r s o r = = c u r s o r ) { r e t u r n ; }
i f ( t h i s . c u r s o r ! = n u l l ) { t h i s . c u r s o r . c l o s e ( ) ; }
t h i s . c u r s o r = c u r s o r ;
n o t i f y D a t a S e t C h a n g e d ( ) ;
}
/ * . . . * /
}

12 . 15
Chargement des curseurs
p u b l i c c l a s s U s e r 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 U s e r s A d a p t e r a d a p t e r ;

@ 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 ) {
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 L o a d e r M a n a g e r ( ) . i n i t L o a d e r ( 0 , n u l l , n e w L o a d e r C a l l b a c k s ( ) ) ;
}

@ 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 ) {
a d a p t e r = n e w U s e r s A d a p t e r ( ) ;
/ * . . . * /
}

p r i v a t e c l a s s L o a d e r C a l l b a c k s
i m p l e m e n t s L o a d e r M a n a g e r . L o a d e r C a l l b a c k s < C u r s o r > {
/ * . . . * /
}

12 . 16
Chargement des curseurs
p u b l i c c l a s s U s e r 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 U s e r s A d a p t e r a d a p t e r ;

/ * . . . * /

p r i v a t e c l a s s L o a d e r C a l l b a c k s
i m p l e m e n t s L o a d e r M a n a g e r . L o a d e r C a l l b a c k s < C u r s o r > {
@ O v e r r i d e
p u b l i c L o a d e r o n C r e a t e L o a d e r ( i n t i d , B u n d l e a r g s ) {
r e t u r n n e w C u r s o r L o a d e r ( g e t A c t i v i t y ( ) , C o n t r a c t . C O N T E N T _ U R I ,
n u l l , n u l l , n u l l , n u l l ) ;
}

@ O v e r r i d e
p u b l i c v o i d o n L o a d F i n i s h e d ( L o a d e r l o a d e r , C u r s o r d a t a ) {
a d a p t e r . s w a p C u r s o r ( d a t a ) ;
}

@ O v e r r i d e
p u b l i c v o i d o n L o a d e r R e s e t ( L o a d e r l o a d e r ) { a d a p t e r . s w a p C u r s o r ( n u l l ) ; }
}

12 . 17
Notification des modifications
p u b l i c c l a s s U s e r s P r o v i d e r e x t e n d s C o n t e n t P r o v i d e r {

@ O v e r r i d e
p u b l i c C u r s o r q u e r y ( U r i u r i , S t r i n g [ ] p r o j e c t i o n ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ,
S t r i n g s o r t O r d e r ) {
C u r s o r c u r s o r = / * . . . . * /
c u r s o r . s e t N o t i f i c a t i o n U r i ( g e t C o n t e x t ( ) . g e t C o n t e n t R e s o l v e r ( ) , u r i ) ;
r e t u r n c u r s o r ;
}

@ O v e r r i d e
p u b l i c C u r s o r u p d a t e ( U r i u r i , C o n t e n t V a l u e s v a l u e s ,
S t r i n g s e l e c t i o n , S t r i n g [ ] s e l e c t i o n A r g s ) {
g e t C o n t e x t ( ) . g e t C o n t e n t R e s o l v e r ( ) . n o t i f y C h a n g e ( u r i , n u l l ) ;
}

/ * . . . * /

Le curseur sera redemandé à chaque modifica on

12 . 18
Animation dans les RecyclerView
p u b l i c c l a s s U s e r s A d a p t e r e x t e n d s R e c y c l e r V i e w . A d a p t e r < U s e r V i e w H o l d e r > {
p r i v a t e C u r s o r c u r s o r ;

p u b l i c U s e r s A d a p t e r ( ) { s e t H a s S t a b l e I d s ( t r u e ) ; }

@ O v e r r i d e
p u b l i c l o n g g e t I t e m I d ( i n t p o s i t i o n ) {
i f ( c u r s o r = = n u l l | | ! c u r s o r . m o v e T o P o s i t i o n ( p o s i t i o n ) ) {
r e t u r n R e c y c l e r V i e w . N O _ I D ;
}
r e t u r n c u r s o r . g e t L o n g ( c u r s o r . g e t C o l u m n I n d e x ( C o n t r a c t . U s e r s . _ I D ) ) ;
}

/ * . . . * /
}

Les RecyclerView peuvent animer la modifica on de la liste :
Les iden fiants doivent être stables
Il faut implémenter la méthode  getItemId

12 . 19
Services
Un service est un composant
Il ne fournit pas d'interface u lisateur
Il peut exécuter des tâches de fond
Un service peut être démarré par une autre applica on
Un composant peut s'a acher (bind) à un service
Cela lui permet de communiquer avec le service
Entre applica ons, communica ons inter‐processus (IPC)

13 . 1
Les deux types de service
"Started"
Le service est démarré en u lisant  startService :
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 , D o w n l o a d S e r v i c e . c l a s s ) ;
i n t e n t . s e t D a t a ( U r i . p a r s e ( u r l ) ) ;
c o n t e x t . s t a r t S e r v i c e ( d o w n l o a d I n t e n t ) ;

"Bound"
Le service est a aché au composant en u lisant  bindService :
I n t e n t i n t e n t = n e w I n t e n t ( t h i s , L o c a l S e r v i c e . c l a s s ) ;

c o n n e c t i o n = n e w S e r v i c e C o n n e c t i o n ( ) {
@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e C o n n e c t e d ( C o m p o n e n t N a m e n a m e , I B i n d e r s e r v i c e ) { . . . }

@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e D i s c o n n e c t e d ( C o m p o n e n t N a m e n a m e ) { . . . }
} ;

c o n t e x t . b i n d S e r v i c e ( i n t e n t , c o n n e c t i o n , C o n t e x t . B I N D _ A U T O _ C R E A T E ) ;
13 . 2
Création d'un service
p u b l i c c l a s s M y S e r v i c e e x t e n d s S e r v i c e {
@ 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 ( ) { . . . }

@ O v e r r i d e
p u b l i c i n t o n S t a r t C o m m a n d ( I n t e n t i n t e n t , i n t f l a g s , i n t s t a r t I d ) {
/ / P o u r r e d é m a r r e r a u t o m a t i q u e m e n t s i l e s e r v i c e e s t t u é :
r e t u r n S T A R T _ S T I C K Y ;
}

@ O v e r r i d e
p u b l i c I B i n d e r o n B i n d ( I n t e n t i n t e n t ) { . . . }

@ O v e r r i d e
p u b l i c b o o l e a n o n U n b i n d ( I n t e n t i n t e n t ) { . . . }

@ O v e r r i d e
p u b l i c v o i d o n R e b i n d ( I n t e n t i n t e n t ) { . . . }

@ O v e r r i d e
p u b l i c b o o l e a n s t o p S e r v i c e ( I n t e n t i n t e n t ) {
. . .
r e t u r n s u p e r . s t o p S e r v i c e ( i n t e n t ) ;
}

@ O v e r r i d e
p u b l i c v o i d o n D e s t r o y ( ) { . . . } 13 . 3
}

Déclaration dans le manifeste

< m a n i f e s t . . . >
< a p p l i c a t i o n . . . >
. . .
< s e r v i c e a n d r o i d : n a m e = " . M y S e r v i c e " a n d r o i d : e x p o r t e d = " f a l s e " / >
< / a p p l i c a t i o n >
< / m a n i f e s t >

13 . 4
Cycle de vie d'un service
Work created and shared by the Android Open Source Project and used according to terms described in the Crea ve Commons 2.5 A ribu on License

13 . 5
Arrêt d'un service "started"
Le système peut arrêter le service s'il a besoin de mémoire
Le système peut s'arrêter lui‐même en u lisant  stopSelf()
Un composant peut demander l'arrêt du service :
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 , M y S e r v i c e . c l a s s ) ;
c o n t e x t . s t o p S e r v i c e ( i n t e n t ) ;

stopService(Intent intent) du service est alors appelée

Il est important de ne pas arrêter un service qui travaille
Les  startId de  onStartCommand peuvent être conservés :
p u b l i c i n t o n S t a r t C o m m a n d ( I n t e n t i n t e n t , i n t f l a g s , i n t s t a r t I d )

Ensuite, on peut u liser  stopSelf(startId) pour préciser à


quelle requête correspond la demande d'arrêt.
13 . 6
Création d'un service "bound" local

p u b l i c c l a s s L o c a l S e r v i c e e x t e n d s S e r v i c e {
p r i v a t e f i n a l I B i n d e r b i n d e r = n e w L o c a l B i n d e r ( ) ;

p r i v a t e f i n a l R a n d o m g e n e r a t o r = n e w R a n d o m ( ) ;

p u b l i c c l a s s L o c a l B i n d e r e x t e n d s B i n d e r {
L o c a l S e r v i c e g e t S e r v i c e ( ) {
r e t u r n L o c a l S e r v i c e . t h i s ;
}
}

@ O v e r r i d e
p u b l i c I B i n d e r o n B i n d ( I n t e n t i n t e n t ) {
r e t u r n b i n d e r ;
}

p u b l i c i n t g e t R a n d o m N u m b e r ( ) {
r e t u r n g e n e r a t o r . n e x t I n t ( 1 0 0 ) ;
}
}

13 . 7
Connexion à un service de la même application

p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
L o c a l S e r v i c e s e r v i c e ;
b o o l e a n b o u n d = f a l 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 a r t ( ) {
s u p e r . o n S t a r t ( ) ;
I n t e n t i n t e n t = n e w I n t e n t ( t h i s , L o c a l S e r v i c e . c l a s s ) ;
b i n d S e r v i c e ( i n t e n t , c o n n e c t i o n , C o n t e x t . B I N D _ A U T O _ C R E 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 o p ( ) {
s u p e r . o n S t o p ( ) ;
i f ( b o u n d ) { u n b i n d S e r v i c e ( c o n n e c t i o n ) ; b o u n d = f a l s e ; }
}

/ * . . . * /
}

13 . 8
Connexion à un service de la même application
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
L o c a l S e r v i c e s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;

/ * . . . * /

p r i v a t e S e r v i c e C o n n e c t i o n c o n n e c t i o n = n e w S e r v i c e C o n n e c t i o n ( ) {

@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e C o n n e c t e d ( C o m p o n e n t N a m e c l a s s N a m e ,
I B i n d e r i B i n d e r ) {
L o c a l S e r v i c e . L o c a l B i n d e r b i n d e r =
( L o c a l S e r v i c e . L o c a l B i n d e r ) i B i n d e r ;
M y A c t i v i t y . t h i s . s e r v i c e = b i n d e r . g e t S e r v i c e ( ) ;
b o u n d = t r u e ;
}

@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e D i s c o n n e c t e d ( C o m p o n e n t N a m e c l a s s N a m e ) {
b o u n d = f a l s e ;
}
} ;
}

13 . 9
Utilisation du service

p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
L o c a l S e r v i c e s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;

/ * . . . * /

p u b l i c i n t g e t N u m b e r F r o m S e r v i c e ( ) {
r e t u r n ( b o u n d ) ? s e r v i c e . g e t R a n d o m N u m b e r ( ) : 0 ;
}

/ * . . . * /
}

13 . 10
Création d'un service "bound" accessible d'une autre application

p u b l i c c l a s s M e s s e n g e r S e r v i c e e x t e n d s S e r v i c e {
p r i v a t e f i n a l R a n d o m g e n e r a t o r = n e w R a n d o m ( ) ;

c l a s s I n c o m i n g H a n d l e r e x t e n d s H a n d l e r {
@ O v e r r i d e
p u b l i c v o i d h a n d l e M e s s a g e ( M e s s a g e m s g ) {
i n t n u m b e r = g e n e r a t o r . n e x t I n t ( m s g . a r g 2 - m s g . a r g 1 + 1 ) + m s g . a r g 1 ;
/ * T O D O : e n v o y e r l a r é p o n s e * /
}
}

f i n a l M e s s e n g e r m e s s e n g e r = n e w M e s s e n g e r ( n e w I n c o m i n g H a n d l e r ( ) ) ;

@ O v e r r i d e
p u b l i c I B i n d e r o n B i n d ( I n t e n t i n t e n t ) {
r e t u r n m e s s e n g e r . g e t B i n d e r ( ) ;
}
}

13 . 11
Connexion au service
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
M e s s e n g e r s e r v i c e ;
b o o l e a n b o u n d = f a l 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 a r t ( ) {
s u p e r . o n S t a r t ( ) ;
I n t e n t i n t e n t = n e w I n t e n t ( t h i s , M e s s e n g e r S e r v i c e . c l a s s ) ;
b i n d S e r v i c e ( i n t e n t , c o n n e c t i o n , C o n t e x t . B I N D _ A U T O _ C R E 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 o p ( ) {
s u p e r . o n S t o p ( ) ;
i f ( b o u n d ) { u n b i n d S e r v i c e ( c o n n e c t i o n ) ; b o u n d = f a l s e ; }
}

/ * . . . * /
}

13 . 12
Connexion au service
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
M e s s e n g e r s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;

/ * . . . * /

p r i v a t e S e r v i c e C o n n e c t i o n c o n n e c t i o n = n e w S e r v i c e C o n n e c t i o n ( ) {

@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e C o n n e c t e d ( C o m p o n e n t N a m e c l a s s N a m e ,
I B i n d e r i B i n d e r ) {
M y A c t i v i t y . t h i s . s e r v i c e = n e w M e s s e n g e r ( i B i n d e r ) ;
b o u n d = t r u e ;
}

@ O v e r r i d e
p u b l i c v o i d o n S e r v i c e D i s c o n n e c t e d ( C o m p o n e n t N a m e c l a s s N a m e ) {
b o u n d = f a l s e ;
}
} ;
}

13 . 13
Communication avec le service
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
M e s s e n g e r s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;
/ * . . . * /
p u b l i c v o i d g e t N u m b e r F r o m S e r v i c e ( ) {
i f ( b o u n d ) {
M e s s a g e m s g = M e s s a g e . o b t a i n ( n u l l , 0 , 2 0 , 1 0 0 ) ;
t r y { s e r v i c e . s e n d ( m s g ) ; }
c a t c h ( R e m o t e E x c e p t i o n e ) { e . p r i n t S t a c k T r a c e ( ) ; }
}
}
/ * . . . * /
}

p u b l i c c l a s s M e s s e n g e r S e r v i c e e x t e n d s S e r v i c e {
c l a s s I n c o m i n g H a n d l e r e x t e n d s H a n d l e r {
@ O v e r r i d e
p u b l i c v o i d h a n d l e M e s s a g e ( M e s s a g e m s g ) {
i n t n u m b e r = g e n e r a t o r . n e x t I n t ( m s g . a r g 2 - m s g . a r g 1 + 1 ) + m s g . a r g 1 ;
/ * T O D O : e n v o y e r l a r é p o n s e * /
}
}
}

13 . 14
Ajout d'un replyTo pour recevoir la réponse
p u b l i c c l a s s M y A c t i v i t y e x t e n d s A c t i v i t y {
M e s s e n g e r s e r v i c e ;
b o o l e a n b o u n d = f a l s e ;

/ * . . . * /

p u b l i c v o i d g e t N u m b e r F r o m S e r v i c e ( ) {
i f ( b o u n d ) {
M e s s a g e m s g = M e s s a g e . o b t a i n ( n u l l , 0 , 2 0 , 1 0 0 ) ;
t r y { m s g . r e p l y T o = m e s s e n g e r ; s e r v i c e . s e n d ( m s g ) ; }
c a t c h ( R e m o t e E x c e p t i o n e ) { e . p r i n t S t a c k T r a c e ( ) ; }
}
}

c l a s s R e s u l t H a n d l e r e x t e n d s H a n d l e r {
@ O v e r r i d e
p u b l i c v o i d h a n d l e M e s s a g e ( M e s s a g e m s g ) {
L o g . d ( " M y A c t i v i t y " , " R e s u l t : " + m s g . a r g 1 ) ;
}
}

f i n a l M e s s e n g e r m e s s e n g e r = n e w M e s s e n g e r ( n e w R e s u l t H a n d l e r ( ) ) ;
}

13 . 15
Communication de la réponse par le service

p u b l i c c l a s s M e s s e n g e r S e r v i c e e x t e n d s S e r v i c e {
p r i v a t e f i n a l R a n d o m g e n e r a t o r = n e w R a n d o m ( ) ;

c l a s s I n c o m i n g H a n d l e r e x t e n d s H a n d l e r {
@ O v e r r i d e
p u b l i c v o i d h a n d l e M e s s a g e ( M e s s a g e m s g ) {
i n t n u m b e r = g e n e r a t o r . n e x t I n t ( m s g . a r g 2 - m s g . a r g 1 + 1 ) + m s g . a r g 1 ;
M e s s a g e r e s u l t M e s s a g e = M e s s a g e . o b t a i n ( n u l l , 0 , n u m b e r , 0 ) ;
t r y {
m s g . r e p l y T o . s e n d ( r e s u l t M e s s a g e ) ;
} c a t c h ( R e m o t e E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
}
}
}

/ * . . . * /
}

13 . 16
Service en premier plan

Un service est  foreground si l'u lisateur est conscient de son


existence (lecture d'une musique, téléchargement en cours, etc.)
Une no fica on est affiché à l'u lisateur pour lui perme re
d'interagir avec le service (passer à la musique suivante, etc.)
Un service  foreground n'est pas un candidat pour libérer de la
mémoire (de la même façon qu'une ac vité en premier plan)

13 . 17
Service en premier plan

Passage en premier plan :
N o t i f i c a t i o n n o t i f i c a t i o n = n e w N o t i f i c a t i o n . B u i l d e r ( t h i s )
. s e t C o n t e n t T i t l e ( " M y n o t i f i c a t i o n " )
. s e t C o n t e n t T e x t ( " C o n t e n t t e x t " )
. s e t S m a l l I c o n ( R . d r a w a b l e . i c o n )
. b u i l d ( ) ;

I n t e n t n o t i f i c a t i o n I n t e n t = n e w I n t e n t ( t h i s , M y A c t i v i t y . c l a s s ) ;
P e n d i n g I n t e n t p e n d i n g I n t e n t =
P e n d i n g I n t e n t . g e t A c t i v i t y ( t h i s , 0 , n o t i f i c a t i o n I n t e n t , 0 ) ;
s t a r t F o r e g r o u n d ( N O T I F I C A T I O N _ I D , n o t i f i c a t i o n ) ;

Sor e du premier plan :
s t o p F o r e g r o u n d ( t r u e / * p o u r s u p p r i m e r l a n o t i f i c a t i o n * / ) ;

13 . 18
Cycle de vie des processus
Android classe les processus par ordre d'importance :
1. Foreground process
Ac vité en cours d'u lisa on par l'u lisateur
Service connecté à une ac vité en cours d'u lisa on
Service qui a appelé  startForeground()
Service qui exécute une de ses callbacks
BroadcastReceiver qui exécute  onReceive
2. Visible process
Ac vité visible
Service connecté à une ac vité visible
13 . 19
Cycle de vie des processus

3. Service process
Service qui a été démarré avec  startService
4. Background process
Con ent des composants
5. Empty process
Ne con ent rien

13 . 20
Les threads
Les threads sont des processus léger ou fils d'exécu on
Les threads s'exécutent (ou semblent s'exécuter) en parallèle
Les threads d'un même processus partagent une zone mémoire
Sous Android, une applica on n'u lise qu'un thread principal
Seul le thread principal peut modifier les vues de l'interface
Le thread principal gère la queue d'événements

Pourquoi créer des threads ?


Pour ne jamais bloquer le thread principal

14 . 1
Un exemple
Client Server
Main Thread

draw UI
Download Thread
onClick
Connection
...

Download
...

Notify UI
UpdateView

draw UI

...

14 . 2
L'interface Runnable et la classe Thread
L'interface  Runnable :
p u b l i c i n t e r f a c e R u n n a b l e { v o i d r u n ( ) ; }

Défini on d'une tâche à exécuter :
p u b l i c c l a s s D o w n l o a d T a s k i m p l e m e n t s R u n n a b l e {
p u b l i c v o i d r u n ( ) { / * T O D O D o w n l o a d * / }
}

Créa on d'un nouveau thread :
T h r e a d t h r e a d = n e w T h r e a d ( n e w D o w n l o a d T a s k ( ) ) ;

Exécu on du thread :
t h r e a d . s t a r t ( ) ;

14 . 3
Synchronisation avec le thread principal

Seul le thread principal peut modifier les vues de l'interface :
p u b l i c c l a s s D o w n l o a d T a s k i m p l e m e n t s R u n n a b l e {
p r i v a t e f i n a l I m a g e V i e w i m a g e V i e w ;

p u b l i c D o w n l o a d T a s k ( I m a g e V i e w i m a g e V i e w ) {
t h i s . i m a g e V i e w = i m a g e V i e w ;
}

p u b l i c v o i d r u n ( ) {
B i t m a p b i t m a p = l o a d I m a g e ( " h t t p : / / e x a m p l e . c o m / a . j p g " ) ;
/ * I N T E R D I T : i m a g e V i e w . s e t I m a g e B i t m a p ( b i t m a p ) ; * /
}
}

14 . 4
Synchronisation avec le thread principal

Réintégra on dans le thread principal :
p u b l i c v o i d r u n ( ) {
B i t m a p b i t m a p = l o a d I m a g e ( " h t t p : / / e x a m p l e . c o m / a . j p g " ) ;
i m a g e V i e w . p o s t ( n e w R u n n a b l e ( ) {
p u b l i c v o i d r u n ( ) { i m a g e V i e w . s e t I m a g e B i t m a p ( b i t m a p ) ; }
} ) ;
}

Pour exécuter des tâches dans le thread principal :
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)

14 . 5
La classe AsyncTask

Simplifica on de l'écriture d'un thread avec  AsyncTask :


p u b l i c c l a s s I m a g e D o w n l o a d e r e x t e n d s A s y n c T a s k < U R L , I n t e g e r , B i t m a p > {
p r i v a t e I m a g e V i e w v i e w ;

p u b l i c I m a g e D o w n l o a d e r ( I m a g e V i e w i m a g e V i e w ) { t h i s . v i e w = i m a g e V i e w ; }

@ O v e r r i d e
p r o t e c t e d B i t m a p d o I n B a c k g r o u n d ( U R L . . . u r l s ) {
r e t u r n d o w n l o a d I m a g e ( u r l s [ 0 ] ) ;
}

@ O v e r r i d e
p r o t e c t e d v o i d o n P o s t E x e c u t e ( B i t m a p b i t m a p ) {
v i e w . s e t I m a g e B i t m a p ( b i t m a p ) ;
}
}

14 . 6
La classe AsyncTask

U lisa on de la classe  ImageDownloader :


I m a g e D o w n l o a d e r i m a g e D o w n l o a d e r = n e w I m a g e D o w n l o a d e r ( i m a g e V i e w ) ;
i m a g e D o w n l o a d e r . e x e c u t e ( u r l ) ;

Les autres méthodes de  AsyncTask :
void onPreExecute()
void onProgressUpdate(Progress... values)
void publishProgress(Progress... values)
void onCancelled(Result result)
boolean cancel(boolean mayInterruptIfRunning)
boolean isCancelled()

14 . 7
Exemple - Connexion réseau

14 . 8
Exemple - Connexion réseau

Nous devons :

Ajouter une permission à l'applica on
Créer un thread
Ouvrir une connexion
Lire les données provenant d'un flux
Injecter les données téléchargées dans l'applica on

14 . 9
Exemple - Connexion réseau

Ajout des droits 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 = " . . . . "
p a c k a g e = " c o m . u n i v _ a m u . c c i . i m a g e d o w n l o a d e r " >

< 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 . I N T E R N E T " / >

< ! - - . . . . - - >
< / m a n i f e s t >

14 . 10
Exemple - Connexion réseau
Créa on de la tâche perme ant le téléchargement de l'image :
p u b l i c c l a s s I m a g e D o w n l o a d e r e x t e n d s A s y n c T a s k < U R L , I n t e g e r , B i t m a p > {
p r i v a t e I m a g e V i e w i m a g e V i e w ;

p u b l i c I m a g e D o w n l o a d e r ( I m a g e V i e w i m a g e V i e w ) {
t h i s . i m a g e V i e w = i m a g e V i e w ;
}

@ O v e r r i d e
p r o t e c t e d B i t m a p d o I n B a c k g r o u n d ( U R L . . . u r l s ) {
U R L u r l = u r l s [ 0 ] ;
t r y ( I n p u t S t r e a m s t r e a m = u r l . o p e n C o n n e c t i o n ( ) . g e t I n p u t S t r e a m ( ) ) {
B i t m a p b i t m a p = B i t m a p F a c t o r y . d e c o d e S t r e a m ( s t r e a m ) ;
r e t u r n b i t m a p ;
} c a t c h ( I O E x c e p t i o n e ) { r e t u r n n u l l ; }
}

/ * . . . * /

14 . 11
Exemple - Connexion réseau
Créa on de la tâche perme ant le téléchargement de l'image :
p u b l i c c l a s s I m a g e D o w n l o a d e r e x t e n d s A s y n c T a s k < U R L , I n t e g e r , B i t m a p > {
p r i v a t e I m a g e V i e w i m a g e V i e w ;

p u b l i c I m a g e D o w n l o a d e r ( I m a g e V i e w i m a g e V i e w ) {
t h i s . i m a g e V i e w = i m a g e V i e w ;
}

@ O v e r r i d e
p r o t e c t e d B i t m a p d o I n B a c k g r o u n d ( U R L . . . u r l s ) {
/ * . . . * /
}

@ O v e r r i d e
p r o t e c t e d v o i d o n P o s t E x e c u t e ( B i t m a p b i t m a p ) {
i f ( b i t m a p ! = n u l l )
i m a g e V i e w . s e t I m a g e B i t m a p ( b i t m a p ) ;
}
}

14 . 12
Exemple - Connexion réseau
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 {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p r i v a t e E d i t T e x t u r l E d i t T e x t ;

@ 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 m a g e V i e w = ( 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 V i e w ) ;
u r l 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 . u r l E d i t T e x t ) ;
}
}

14 . 13
Exemple - Connexion réseau
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 {
p r i v a t e I m a g e V i e w i m a g e V i e w ;
p r i v a t e E d i t T e x t u r l E d i t T e x t ;

/ * . . . * /

p u b l i c v o i d o n C l i c k ( V i e w v i e w ) {
I m a g e D o w n l o a d e r i m a g e D o w n l o a d e r = n e w I m a g e D o w n l o a d e r ( i m a g e V i e w ) ;
t r y {
U R L u r l = n e w U R L ( u r l E d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
i m a g e D o w n l o a d e r . e x e c u t e ( u r l ) ;
} c a t c h ( M a l f o r m e d U R L E x c e p t i o n e ) {
T o a s t . m a k e T e x t ( t h i s ,
g e t S t r i n g ( R . s t r i n g . m a l f o r m e d _ u r l ) ,
T o a s t . L E N G T H _ L O N G ) . s h o w ( ) ;
}
}
}

14 . 14
Services et threads

Nous voulons créer un service pour télécharger des images

Ce service doit :

pouvoir être u lisé à par r d'une autre applica on


"broadcaster" le fait qu'il a terminé un téléchargement
Ne pas effectuer les téléchargements sur le thread principal
Traiter de façon séquen elle les téléchargements

14 . 15
IntentService
La classe  IntentService étend  Service et permet de réaliser cela :
p u b l i c c l a s s M y I n t e n t S e r v i c e e x t e n d s I n t e n t S e r v i c e {

p u b l i c M y I n t e n t S e r v i c e ( ) {
s u p e r ( " M y I n t e n t S e r v i c e " ) ;
}

@ O v e r r i d e
p r o t e c t e d v o i d o n H a n d l e I n t e n t ( I n t e n t i n t e n t ) {
t r y {
T h r e a d . s l e e p ( 5 0 0 0 ) ;
} c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {
T h r e a d . c u r r e n t T h r e a d ( ) . i n t e r r u p t ( ) ;
}
}
}

Le service est arrêté quand tous les traitements ont été effectués

14 . 16
Communication de l'URL à télécharger
p u b l i c c l a s s D o w n l o a d e r S e r v i c e e x t e n d s I n t e n t S e r v i c e {
p u b l i c s t a t i c f i n a l S t r i n g U R L = " u r l " ;
p u b l i c s t a t i c f i n a l S t r i n g F I L E N A M E = " f i l e n a m e " ;

p u b l i c D o w n l o a d e r S e r v i c e ( ) {
s u p e r ( " D o w n l o a d e r S e r v i c e " ) ;
}

@ O v e r r i d e
p r o t e c t e d v o i d o n H a n d l e I n t e n t ( I n t e n t i n t e n t ) {
S t r i n g i n t e n t U r l = i n t e n t . g e t S t r i n g E x t r a ( U R L ) ;
S t r i n g i n t e n t F i l e n a m e = i n t e n t . g e t S t r i n g E x t r a ( F I L E N A M E ) ;
d o w n l o a d ( i n t e n t U r l , i n t e n t F i l e n a m e ) ;
}

I n t e n t i n t e n t = n e w I n t e n t ( t h i s , D o w n l o a d e r S e r v i c e . c l a s s ) ;
i n t e n t . p u t E x t r a ( D o w n l o a d e r S e r v i c e . U R L , " h t t p : / / . . . . " ) ;
i n t e n t . p u t E x t r a ( D o w n l o a d e r S e r v i c e . F I L E N A M E , " i m a g e . j p g " ) ;
s t a r t S e r v i c e ( i n t e n t ) ;

14 . 17
Téléchargement
p r i v a t e v o i d d o w n l o a d ( S t r i n g i n t e n t U r l , S t r i n g i n t e n t F i l e n a m e ) {
t r y {
U R L i n p u t U r l = n e w U R L ( i n t e n t U r l ) ;
F i l e o u t p u t F i l e = n e w F i l e (
E n v i r o n m e n t . g e t E x t e r n a l S t o r a g e P u b l i c D i r e c t o r y (
E n v i r o n m e n t . D I R E C T O R Y _ D O W N L O A D S
) ,
i n t e n t F i l e n a m e ) ;
t r y ( I n p u t S t r e a m i n p u t S t r e a m =
i n p u t U r l . o p e n C o n n e c t i o n ( ) . g e t I n p u t S t r e a m ( ) ;
O u t p u t S t r e a m o u t p u t S t r e a m = n e w F i l e O u t p u t S t r e a m ( o u t p u t F i l e )
) {
c o p y ( i n p u t S t r e a m , o u t p u t S t r e a m ) ;
b r o a d c a s t S u c c e s s ( i n t e n t U r l , o u t p u t F i l e . g e t A b s o l u t e P a t h ( ) ) ;
}
} c a t c h ( I O E x c e p t i o n e ) {
e . p r i n t S t a c k T r a c e ( ) ;
b r o a d c a s t E r r o r ( ) ;
}
}

14 . 18
Téléchargement

p r i v a t e v o i d c o p y ( I n p u t S t r e a m i n p u t S t r e a m ,
O u t p u t S t r e a m o u t p u t S t r e a m ) t h r o w s I O E x c e p t i o n {
b y t e [ ] b u f f e r = n e w b y t e [ 1 0 2 4 ] ;
f o r ( ; ; ) {
i n t b y t e s C o u n t = i n p u t S t r e a m . r e a d ( b u f f e r ) ;
i f ( b y t e s C o u n t = = - 1 ) b r e a k ;
o u t p u t S t r e a m . w r i t e ( b u f f e r , 0 , b y t e s C o u n t ) ;
}
}

14 . 19
Téléchargement
p u b l i c s t a t i c f i n a l i n t D O W N L O A D _ S U C C E S S = 1 ;
p u b l i c s t a t i c f i n a l i n t D O W N L O A D _ E R R O R = 2 ;
p u b l i c s t a t i c f i n a l S t r i n g U R L = " u r l " ;
p u b l i c s t a t i c f i n a l S t r i n g F I L E N A M E = " f i l e n a m e " ;
p u b l i c s t a t i c f i n a l S t r i n g R E S U L T _ C O D E = " r e s u l t _ c o d e " ;
p u b l i c s t a t i c f i n a l S t r i n g D O N E _ A C T I O N =
" c o m . u n i v _ a m u . c c i . d o w n l o a d e r . D O N E _ A C T I O N " ;

p r i v a t e v o i d b r o a d c a s t S u c c e s s ( S t r i n g u r l , S t r i n g f i l e n a m e ) {
I n t e n t i n t e n t = n e w I n t e n t ( D O N E _ A C T I O N ) ;
i n t e n t . p u t E x t r a ( U R L , u r l ) ;
i n t e n t . p u t E x t r a ( F I L E N A M E , f i l e n a m e ) ;
i n t e n t . p u t E x t r a ( R E S U L T _ C O D E , D O W N L O A D _ S U C C E S S ) ;
s e n d B r o a d c a s t ( i n t e n t ) ;
}

p r i v a t e v o i d b r o a d c a s t E r r o r ( ) {
I n t e n t i n t e n t = n e w I n t e n t ( D O N E _ A C T I O N ) ;
i n t e n t . p u t E x t r a ( R E S U L T _ C O D E , D O W N L O A D _ E R R O R ) ;
s e n d B r o a d c a s t ( i n t e n t ) ;
}

14 . 20
Le manifeste de l'application

< m a n i f e s t . . . >

< 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 . I N T E R N E T " / >


< 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 . W R I T E _ E X T E R N A L _ S T O R A G E " / >

< a p p l i c a t i o n . . . >
< s e r v i c e a n d r o i d : n a m e = " f r . u n i v _ a m u . c c i . d o w n l o a d e r . D o w n l o a d e r S e r v i c e "
a n d r o i d : e x p o r t e d = " t r u e " / >
< / a p p l i c a t i o n >

< / m a n i f e s t >

14 . 21
Appel au service dans la même 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 m a g e V i e w i m a g e V i e w ;
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 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 . m a i n _ a c t i v i t y ) ;
i m a g e V i e w = ( 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 _ v i e w ) ;
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 ) ;
}

p u b l i c v o i d o n C
i e l i c k ( V w v i e w ) {
U r i u r i = U
s e r i . p a r ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
I n t e n t i n t e
e w n t = n I n t e n t ( t h i s , D o w n l o a d e r S e r v i c e . c l a s s ) ;
i n t e n t . p u t E
o w x t r a ( D n l o a d e r S e r v i c e . U R L , u r i . t o S t r i n g ( ) ) ;
i n t e n t . p u t E
o w x t r a ( D n l o a d e r S e r v i c e . F I L E N A M E ,
u r i . g e t L a s t P a t h S e g m e n t ( ) ) ;
s t a r t S e r v i c e ( i n t e n t ) ;
}
}

14 . 22
Appel au service dans la même 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 m a g e V i e w i m a g e V i e w ;
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 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 . m a i n _ a c t i v i t y ) ;
i m a g e V i e w = ( 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 _ v i e w ) ;
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 ) ;
}

p u b l i c v o i d o n C
i e l i c k ( V w v i e w ) {
U r i u r i = U
s e r i . p a r ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
I n t e n t i n t e
e w n t = n I n t e n t ( t h i s , D o w n l o a d e r S e r v i c e . c l a s s ) ;
i n t e n t . p u t E
o w x t r a ( D n l o a d e r S e r v i c e . U R L , u r i . t o S t r i n g ( ) ) ;
i n t e n t . p u t E
o w x t r a ( D n l o a d e r S e r v i c e . F I L E N A M E ,
u r i . g e t L a s t P a t h S e g m e n t ( ) ) ;
s t a r t S e r v i c e ( i n t e n t ) ;
}
}

14 . 23
Écoute des "broadcasts" du service
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 ( ) ;
I n t e n t F i l t e r f i l t e r = n e w I n t e n t F i l t e r ( ) ;
f i l t e r . a d d A c t i o n ( D o w n l o a d e r S e r v i c e . D O N E _ A C T I O N ) ;
r e g i s t e r R e c e i v e r ( r e c e i v e r , f i l 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 P a u s e ( ) {
s u p e r . o n P a u s e ( ) ;
u n r e g i s t e r R e c e i v e r ( r e c e i v e r ) ;
}

f i n a l p r i v a t e B r o a d c a s t R e c e i v e r r e c e i v e r = n e w B r o a d c a s t R e c e i v e r ( ) {
@ O v e r r i d e
p u b l i c v o i d o n R e c e i v e ( C o n t e x t c o n t e x t , I n t e n t i n t e n t ) {
/ * T O D O * /
}
} ;
}

14 . 24
Implémentation de la méthode onReceive
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 {

f i n a l p r i v a t e B r o a d c a s t R e c e i v e r r e c e i v e r = n e w B r o a d c a s t R e c e i v e r ( ) {
@ O v e r r i d e
p u b l i c v o i d o n R e c e i v e ( C o n t e x t c o n t e x t , I n t e n t i n t e n t ) {
s w i t c h ( i n t e n t . g e t I n t E x t r a ( D o w n l o a d e r S e r v i c e . R E S U L T _ C O D E , 0 ) ) {
c a s e D o w n l o a d e r S e r v i c e . D O W N L O A D _ S U C C E S S :
S t r i n g u r l =
i n t e n t . g e t S t r i n g E x t r a ( D o w n l o a d e r S e r v i c e . U R L ) ;
S t r i n g f i l e n a m e =
i n t e n t . g e t S t r i n g E x t r a ( D o w n l o a d e r S e r v i c e . F I L E N A M E ) ;
s e t B a c k g r o u n d I m a g e ( u r l , f i l e n a m e ) ;
b r e a k ;
c a s e D o w n l o a d e r S e r v i c e . D O W N L O A D _ E R R O R :
T o a s t . m a k e T e x t ( g e t A p p l i c a t i o n C o n t e x t ( ) ,
R . s t r i n g . d o w n l o a d _ e r r o r , T o a s t . L E N G T H _ L O N G ) . s h o w ( ) ;
b r e a k ;
}
}
} ;

14 . 25
Changement de l'image de fond de la vue

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 v o i d s e t B a c k g r o u n d I m a g e ( S t r i n g u r l , S t r i n g f i l e n a m e ) {
i f ( ! e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) . e q u a l s ( u r l ) ) r e t u r n ;
B i t m a p b i t m a p = B i t m a p F a c t o r y . d e c o d e F i l e ( f i l e n a m e ) ;
i m a g e V i e w . s e t I m a g e B i t m a p ( b i t m a p ) ;
}
}

14 . 26
Utilisation du service de l'extérieur 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 u b l i c v o i d o n C l i c k ( V i e w v i e w ) {
U r i u r i= U r i . p a r s e ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ;
I n t e n t in t e n t = n e w I n t e n t ( ) ;
i n t e n t . s
e t C o m p o n e n t ( n e w C o m p o n e n t N a m e ( " f r . u n i v _ a m u . c c i . d o w n l o a d e r " ,
" f r . u n i v _ a m u . c c i . d o w n l o a d e r . D o w n l o a d e r S e r v i c e " ) ) ;
i n t e n t . p u t E x t r a ( D o w n l o a d e r S e r v i c e . U R L , u r i . t o S t r i n g ( ) ) ;
i n t e n t . p u t E x t r a ( D o w n l o a d e r S e r v i c e . F I L E N A M E , u r i . g e t L a s t P a t h S e g m e n t ( ) ) ;
s t a r t S e r v i c e ( i n t e n t ) ;
}

< m a n i f e s t . . . >

< a p p l i c a t i o n . . . >
< s e r v i c e a n d r o i d : n a m e = " f r . u n i v _ a m u . c c i . d o w n l o a d e r . D o w n l o a d e r S e r v i c e "
a n d r o i d : e x p o r t e d = " t r u e " / >
< / a p p l i c a t i o n >

< / m a n i f e s t >

14 . 27

Vous aimerez peut-être aussi