Vous êtes sur la page 1sur 283

Dveloppement Mobile sur Android

Master CCI
Bertrand Estellon - DII - Aix-Marseille Universit
1

Organisation de l'enseignement
Objec fs:
Connatrelesdirentscomposantsd'uneapplica onAndroid
Savoirorganiseruneapplica on
Savoiru liserunedocumenta on
ProgresserenJava
valua on:
SeulslesTPserontvalus
IlestimportantdevenirtouslesTP
Lesnotessontindividuelles
Vousdevezdonctravaillerseul

2.1
Le projet
Unrveil:

2.2
Dmo du projet

2:16

2.3
Les fonctionnalits du projet
Ajoutd'unealarme
Modica ondel'heuredesalarmes
Ac va on/Dsac va ond'unealarme
Suppressiond'unealarme
No ca ondel'u lisa on
Sonneriedel'alarme
Rveildel'cranencasdesonnerie
Possibilitd'arrterl'alarme

2.4
Les outils pour dvelopper sur Android
Nousdevonsu liserleSDKd'Androidquifournit:
leslibrairiesJavad'Android
unmulateurpourtestervosapplica ons
desimagesdusystmeAndroid
Nousdevonsu liserJavadoncilfaut:
Matriserlesconceptsdelaprogramma onobjet
Savoirlireunedocumenta onJava
Nousdevonsu liserunIDEadapt,c'estdire,AndroidStudio:
PremiretapeduTP,lacongura ondel'IDE
IlestbassurIntelliJIDEAdeJetBrains

2.5
Android Studio

2.6
Android SDK

2.7
AVD Manager

2.8
mulateur

2.9
Installation

5:20

2 . 10
Cration d'une machine virtuelle

1:13

2 . 11
Cration d'un projet

1:51

2 . 12
Les composants d'une application
Ac vits:lesdirentscransdel'applica on
Services:uncomposantquis'excuteentchedefond
Fournisseurdecontenu:ges onetpartagedesdonnes
Receveurdebroadcasts:recep ondeno ca ons

FireActivity
AlarmActivity

AlarmProvider
FireService
UpdateBroadcastReceiver

2 . 13
Scurit dans le systme Android
Chaqueapplica onestexcutedansunesandbox(bacsable):
AndroidestsystmeLinuxmul u lisateur
Chaqueapplica onestunu lisateurdirent
Chaquechierdel'applica onn'estaccessiblequeparelle
Pardfaut,chaqueprocessuspossdesamachinevirtuelle
Chaqueapplica onasonpropreprocessusLinux

2 . 14
Communication entre composants
Lesac vits,lesservicesetlesreceveursdebroadcastssont
ac vspardesmessagesasynchrones:lesintents
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 ) ;

Lesfournisseursdecontenusontac vspardesrequtes
eectuesl'aided'unrsolveurdecontenu.
Unerequteestcompose:
d'uneURIdelaforme content://authority/path
d'uneac on query, delete, updateou 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

CodeJava

Ressources

Scriptsdecompilation

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
Dclaration 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 rsultat :

3.3
Cycle de vie d'une activit :
Aucunemthode maindansunprogrammeAndroid
Androidexcutelecoded'uneac vitenappelantdescallbacks
Cescallbackscorrespondentauxphrasesdelavied'uneac vit
Iln'estpasncessaired'implmentertouteslescallbacks

WorkcreatedandsharedbytheAndroidOpenSourceProjectandusedaccordingtotermsdescribedintheCrea veCommons2.5A ribu onLicense

3.4
tats durables d'une activit
Resumed
L'ac vitestaupremierplanetl'u lisateurpeutinteragiravecelle
Onditaussiqu'elleestentraind'treexcute
Paused
L'ac vitestpar ellementrecouverteparuneautreac vitquise
trouveaupremierplan
L'ac vitenpausenepeutpasrecevoird'ac ondel'u lisateur
Stopped
L'ac vitesttotalementcacheetnepeutplusexcutedecode
Toutessesinforma onssontconserves

3.5
tats transitoires d'une activit
Created
L'ac vitvientd'trecre.
Started
L'ac vitvientdedevenirvisible.

WorkcreatedandsharedbytheAndroidOpenSourceProjectandusedaccordingtotermsdescribedintheCrea veCommons2.5A ribu onLicense

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 activits

WorkcreatedandsharedbytheAndroidOpenSourceProjectandusedaccordingtotermsdescribedintheCrea veCommons2.5A ribu onLicense

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 onestdtruitedanslestatsrouges:

WorkcreatedandsharedbytheAndroidOpenSourceProjectandusedaccordingtotermsdescribedintheCrea veCommons2.5A ribu onLicense


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

WorkcreatedandsharedbytheAndroidOpenSourceProjectandusedaccordingtotermsdescribedintheCrea veCommons2.5A ribu onLicense

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
LesBundlespeuventassocierdeschanesdecaractresdes:
destypessimples:en ers,o ants,caractres...
deschanesdecaractres
destableauxetdeslistes
desobjetsParcelable
Quelquesremarques:
UnBundleestParcelable
UnobjetParcelablepeuttrecritdansunobjetParcel
UnParcelestunconteneurpourunmessage

3 . 15
Quelques mthodes 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 ) ;
}
}

Dansce eexemple:
RelativeLayouttend ViewGroup

ViewGrouptend View

TextViewtend View

4.2
Les classes View et ViewGroup

Unevueestuneclassequitend View
Unevuepeuttredessinel'cran
Ungroupedevuetend ViewGroupetdonc View
Ungroupedevuespeutcontenird'autresvues
Ungroupedevuesorganisel'achagedesvuesqu'ilcon ent
setContentViewde Activitypourprciserlavueacher

4.3
Hirarchie 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 vnements

Onajoutedescouteursauxvuespourcouterlesvnements:
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
Lamthode setOnClickListenerprendenparamtreunobjetqui
implmentel'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 ) ;
}

Uneinterfaceestassociechaquetyped'vnements
Onobservelesvnementsenconnectantdeslisteners
Pourcela,onu liselesmthodes setOn*Listener
Ensuite,unvnemententranel'appeld'unemthodede
l'interfacesurl'objetquevousavezconnectlavue

4.9
Implmentation 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
Implmentation 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
Implmentation 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
ellessontendehorsducodeetcon ennent
lesimages
leschanesdecaractres
lesmodlesd'interfacesu lisateur
lesanima ons...
ellessontchoisiesenfonc ondelacongura on:
tailledel'cran
orienta ondel'cran
langue...
demaintenirceslmentssansconnatreJava.
5.1
Les ressources

Ellessontdanslessousrpertoiresdurpertoire res
5.2
La classe R
Elleestgnreautoma quementparAndroid
EllepermetdedsignerlesressourcesdanslecodeJava
Parexemple, activity_main.xml= R.layout.activity_main

5.3
Les layouts
Lamthode setContentViewpeutprendrel'iden antd'unlayout:
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 ) ;
}
}

Lecontenuduchier 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
Lecontenuduchier 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 chanes de caractres
Pourfaciliterlatraduc ondesapplica ons,ilestprfrabled'u liser
desrfrencesdeschanesdecaractresdanslesprogrammesou
leslayouts:
< 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 chanes de caractres

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

PouraccderauxchanesdecaractresenXML:
< 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 chanes de caractres

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 rfrences
SyntaxepourdsigneruneressourcedansundocumentXML
@ [ < p a c k a g e _ n a m e > : ] < r e s o u r c e _ t y p e > / < r e s o u r c e _ n a m e >

o
<package_name>estlenomdupaquet
<resource_type>estletypedelaressource
<resource_name>est
lenomduchierquicon entlaressource
oulavaleurdel'a ribut android:named'unlmentXML

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

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

Ilestgalementpossibled'accderauxdimensionsenJava:
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 diffrentes configurations
Ilestpossibledednirdesressourcesenfonc onde:
l'orienta onduterminal
larsolu on
latailledel'cran
laversiondel'API
delalangue,etc.
Parexemple:
values/dimens.xml:dimensionspardfaut
values-w820dp/dimens.xml:dim.pourdescransde820p
layout:leslayoutspardfaut
layout-land:lesversionspaysagedeslayouts
values-fr/strings.xml:chanesenfranais

5 . 11
Les images
Ilestpossibledestockerdesimagesdanslesressources
Lesimagespeuventtrestockessousdirentesrsolu ons
Larsolu onestchoisieenfonc onduterminaldel'u lisateur

5 . 12
Les images

Avecun ic_launcher.pngdanslessousrpertoires 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

Ondsigneuneimageparsoniden ant:
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
unDrawabledcritparunchierXML:
< 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 >

quichangeavecl'tatdel'lmentsurlequelilestu 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
Contenuduchier 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 >

Exempled'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
Dni ond'unstylepar rd'unautrestyle:
< 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 ondustyledanslemanifestedel'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 ondesiden antsauxmembresd'unlayout:
< 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 >

Accsauxlmentsd'unlayoutavecsoniden ant:
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
Unfragment:

reprsenteunepor ond'interfaceu lisateur


peuttreinsrdansuneac vit
peuttreu lisdansplusieursac vits
possdesonproprecycledevie,layout,etc.

Uneac vit:

peutacherplusieursfragments
peutu liserunepilepourgrerlanaviga onentrefragments

6.1
Une application avec deux fragments

6.2
Premier layout : le formulaire
Lelayoutcorrespondantauformulairedupremiercran:
< 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
Deuxime 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
Lelayoutdel'ac vitprincipale:
< 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 " / >

Lecodedel'ac vitprincipale:
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
Cration 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

FormFragmentdoitno erl'ac vitdelavalida onduformulaire

Interfacepourrendrelefragmentru 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 vitvaimplmenterce einterface


Lorsdel'excu ondelamthode onAttachdufragment,nous
allonsconserverunerfrenceandepouvoirno erl'ac vit.

6.8
Notification entre le fragment et l'activit

Nousconservonslarfrencedel'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
Nousfaisonsensorted'couterlesclicssurlebouton:
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
Nousno onsl'ac vitsiunclicseproduit:
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
Rcep ondelano ca onparl'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 deuxime 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 deuxime 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

Lelayoutdel'ac vitpardfaut:
< 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

Lelayoutdel'ac vitenmodepaysage(rpertoire 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
Lecodedel'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
Lesboitesdedialoguesontdesfragments:
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'inferfacedecommunica 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 ) ;
}

Onrednitensuitelamthode 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

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

Touslesfragmentspeuventrecevoirlesno ca ons
Lepremierquiretourne truearrtelapropaga 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
DanslecoursetlesTP,nousallonsu liserdes RecyclerView:

8.1
Ilestgalementpossibled'u liserl'ancienneclasse ListView.
Les listes

Un RecyclerViewpermetl'achaged'ungrandnombredevues
Un LayoutManagerpermetdegrerlaposi ondeslments
Un Adaptervaadapterlesdonnesauxvues

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

Interfacedecommunica 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 vitimplmentece einterface:


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 modle

Modica ondesdonnesetno ca ondel'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 ( ) ;
}
}

Ilestpossibledeno erl'adaptateurplusnementavecles
mthodes 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
Slection des lments
Slection des lments

No ca ondel'ac vitlorsquel'u lisateurcliquesurunlment:


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
Slection des lments

No ca ondel'ac vitlorsquel'u lisateurcliquesurunlment:


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
Slection des lments

Rcep ondesno ca onsparl'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
Slection des lments

Mthodespourgrerlesslec 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
Slection des lments

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
Slection des lments

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
Slection des lments

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
Slection des lments
Communica ondeslmentsslec onnsl'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
Slection des lments

Miseenplacedunouveaulayout:
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
Slection des lments

Modica ondelavueenfonc ondelaslec ondel'lment:


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"
Noussouhaitonspouvoirsupprimerleslmentsslec onns:


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 ondesvnementsdumenudumode``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 ondeladestruc ondumode``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"

Suppressiondeslmentsdumodle:
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 prfrences

9.1
Exemple d'utilisation des prfrences

9.2
Exemple d'utilisation des prfrences
9.3
Structure des prfrences
UnchierXMLdcritlastructuredespfrences:
< 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 chanes de caractres

Lestableauxdevaleurspourlaliste(chier 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
Cration du Fragment Prfrences

Lecoded'unFragmentachantlesprfrences:
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 ) ;
}

Lesprfrencessontautoma quementsauvegardes

9.6
Mise jour du Fragment
MiseenjourduFragmentenfonc ondeschangements:


9.7
couter les changements
MiseenjourduFragmentenfonc ondeschangements:
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

Implmenta ondelamthodeduListeneretmisejourdelavue:
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

Misejourdelavuelacra 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
Misejourdelavuelacra 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
Cra ondelavue:
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
Rcupration des prfrences

Rcupra ondesvaleursdesprfrences:
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 prfrences

couteduchangementdeprfrences:
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 prfrences

Modica ondelavuelorsquelesprfrenceschangent:
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 ondumenudansleFragmentprincipal:
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

Cra ondelavue:
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

Traitementdesvnementsdumenu:
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

OuvertureduFragment Prfrences:
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
Stockageinterne:
Toujoursdisponible
Pardfaut,accessibleuniquementparvotreapplica on
FichiersSupprimsladsinstalla ondel'applica on
Sockageexterne:
Pastoujoursdisponible(USB,etc.)
FichiersAccessiblesetmodiablespartoutlemonde
Seulsleschiersdurpertoire getExternalFilesDir()sont
supprimsladsinstalla ondel'applica on
Ncessitedespermissions
U lepourpartagerdesdonnesentreapplica ons

10 . 1
Crer un fichier dans le stockage interne
Deuxrpertoires:
getFilesDir():Lerpertoireinternedevotreapplica on
getCacheDir():lecacheinternedevotreapplica on

Pourcrerunchierdansl'undecesrpertoires:
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 donnes dans un fichier
Noussouhaitonscrireunditeurdechier:
10 . 3
crire et lire des donnes dans un fichier

Supposonsquenousayonsl'ac vitsuivante:
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 donnes dans un fichier

Dclenchementdel'critureetdelalectureduchier:
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 donnes dans un fichier

Lasauvegarde:
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 donnes dans un fichier

Lalecture:
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 donnes dans un fichier

Lalecture:
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
Ilsutd'ajouterlespermissionsdanslemanifestedel'applica on:

Pourl'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 >

Pourlalecture:
< 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
Noussouhaitonsparcouriretlireleschiersdustockageexterne:


Deuxtypesdefragments:
Achaged'unrpertoire: DirectoryFragment
Achageducontenud'unchier: 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

Cra ondel'instanceetconserva onduchemin:


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
Cra ondelavueetges onducycledevie:
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
Chargementducontenuduchier:
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

Chargementducontenuduchier:
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 rpertoire

Cra ondel'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 rpertoire
Cra ondelavueetges onducycledevie:
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 rpertoire

Miseenplacedesno ca onsdel'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 rpertoire
Miseenplacedesno ca onsdel'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 rpertoire

Miseenplacedesno ca onsdel'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

Cra ondelelavue:
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
Rcep ondesno ca onsdesfragments:
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 donnes SQLite

Commentstockerdesinfosstructuresdansbasededonnes?

Pourcela,nousallons:

dnirunmodlededonnes(lestables);
reprsentercemodlesouslaformedeclasses;
dnirun SQL Helperpourfaciliterlacra ondestables;
voircommentmodier,consulterlesdonnes.

11 . 1
Dfinition du modle

Dni ondumodlededonnes,c'estdire,lestables:
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 " ;
}
}

Lesautrestypespossibles: NULL, INTEGER, REALet BLOB;


Ilpeutyavoirplusieurstables.

11 . 2
Dfinition du SQLiteOpenHelper
Instruc onsSQLpar rdeladni ondumodle:
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
Dfinition du SQLiteOpenHelp

Cra ondelabasededonnes:
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
Dfinition du SQLiteOpenHelper
Misejourdelabasededonneslorsd'unchangementdeversion:
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

Avantd'u liserleSQLiteOpenHelper,ilfautl'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

Miseenjour( 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
Lescurseursperme entdeparcourirlersultatd'unerequte:

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

Lastructuredelabasededonnes:
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

Ensupposantquenousavonscritle 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

Lesmthodesquiinteragissentaveclabasededonnes:
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

Traitementdesclicssurlebouton"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
Cra ondesvues:
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
Misejourdesvuesetnombred'lmentsdanslecurseur:
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

Changementdecurseur:
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
Unfournisseurdecontenuestuncomposantd'uneapplica on
Ilpermetl'accsdesdonnes
Ilprsentelesdonnessouslaformed'uneouplusieurstables
Chaquelignepossdeuniden ant

_ID rstname lastname


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

12 . 1
Fournisseur de contenu

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

Ilpermetlesquatresopra onsdebase(CRUD):
Create: contentResolver.insert
Read: contentResolver.query
Update: contentResolver.update
Delete: contentResolver.delete

12 . 2
Content URIs
UnURI(UniformResourceIden er)iden eunedonne
Laclasse Urivanousperme redemanipulerdesURI
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

Pourfaireunerequte,ilfautunUri:
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
Schma de la base de donnes

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 BaseColumnscon ent _ID

12 . 4
Effectuer d'une requte
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 ondescolonnes
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 } ;

Ajoutd'uneclause"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 " } ;

Ajoutd'un"orderby"
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
Insrer des donnes

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

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

Uriretourn
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 donnes

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

Donnesme rejour
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 " ) ;

Ajoutd'uneclause"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 donnes

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

Ajoutd'uneclause"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
Implmentation 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
Dclaration du fournisseur de contenu

Danslemanifestedel'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
Dtection 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 ondutypedesdonnesretournesparunURI
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 ) ;
}

/ * . . . * /

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

/ * . . . * /
}

LesRecyclerViewpeuventanimerlamodica ondelaliste:
Lesiden antsdoiventtrestables
Ilfautimplmenterlamthode getItemId

12 . 19
Services
Unserviceestuncomposant
Ilnefournitpasd'interfaceu lisateur
Ilpeutexcuterdestchesdefond
Unservicepeuttredmarrparuneautreapplica on
Uncomposantpeuts'a acher(bind)unservice
Celaluipermetdecommuniqueravecleservice
Entreapplica ons,communica onsinterprocessus(IPC)

13 . 1
Les deux types de service
"Started"
Leserviceestdmarrenu 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"
Leserviceesta achaucomposantenu 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
Cration 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
}

Dclaration 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
WorkcreatedandsharedbytheAndroidOpenSourceProjectandusedaccordingtotermsdescribedintheCrea veCommons2.5A ribu onLicense

13 . 5
Arrt d'un service "started"
Lesystmepeutarrterleservices'ilabesoindemmoire
Lesystmepeuts'arrterluimmeenu lisant stopSelf()
Uncomposantpeutdemanderl'arrtduservice:
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)duserviceestalorsappele

Ilestimportantdenepasarrterunservicequitravaille
Les startIdde onStartCommandpeuventtreconservs:
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,onpeutu liser stopSelf(startId)pourprciser


quellerequtecorrespondlademanded'arrt.
13 . 6
Cration 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 mme 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 mme 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
Cration 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 rponse
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 rponse 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

Unserviceest foregroundsil'u lisateurestconscientdeson


existence(lectured'unemusique,tlchargementencours,etc.)
Uneno ca onestachl'u lisateurpourluiperme re
d'interagiravecleservice(passerlamusiquesuivante,etc.)
Unservice foregroundn'estpasuncandidatpourlibrerdela
mmoire(delammefaonqu'uneac vitenpremierplan)

13 . 17
Service en premier plan

Passageenpremierplan:
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 edupremierplan:
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
Androidclasselesprocessusparordred'importance:
1.Foregroundprocess
Ac vitencoursd'u lisa onparl'u lisateur
Serviceconnectuneac vitencoursd'u lisa on
Servicequiaappel startForeground()
Servicequiexcuteunedesescallbacks
BroadcastReceiverquiexcute onReceive
2.Visibleprocess
Ac vitvisible
Serviceconnectuneac vitvisible
13 . 19
Cycle de vie des processus

3.Serviceprocess
Servicequiatdmarravec startService
4.Backgroundprocess
Con entdescomposants
5.Emptyprocess
Necon entrien

13 . 20
Les threads
Lesthreadssontdesprocessuslgeroulsd'excu on
Lesthreadss'excutent(ousemblents'excuter)enparallle
Lesthreadsd'unmmeprocessuspartagentunezonemmoire
SousAndroid,uneapplica onn'u lisequ'unthreadprincipal
Seullethreadprincipalpeutmodierlesvuesdel'interface
Lethreadprincipalgrelaqueued'vnements

Pourquoi crer des threads ?


Pournejamaisbloquerlethreadprincipal

14 . 1
Un exemple
Client Server
MainThread

drawUI
DownloadThread
onClick
Connection
...

Download
...

NotifyUI
UpdateView

drawUI

...

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

Dni ond'unetcheexcuter:
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 * / }
}

Cra ond'unnouveauthread:
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 ( ) ) ;

Excu onduthread:
t h r e a d . s t a r t ( ) ;

14 . 3
Synchronisation avec le thread principal

Seullethreadprincipalpeutmodierlesvuesdel'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

Rintgra ondanslethreadprincipal:
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 ) ; }
} ) ;
}

Pourexcuterdestchesdanslethreadprincipal:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)

14 . 5
La classe AsyncTask

Simplica ondel'critured'unthreadavec 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 ondelaclasse 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 ) ;

Lesautresmthodesde 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 rseau

14 . 8
Exemple - Connexion rseau

Nousdevons:

Ajouterunepermissionl'applica on
Crerunthread
Ouvriruneconnexion
Lirelesdonnesprovenantd'unux
Injecterlesdonnestlchargesdansl'applica on

14 . 9
Exemple - Connexion rseau

Ajoutdesdroitsdanslemanifestedel'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 rseau
Cra ondelatcheperme antletlchargementdel'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 rseau
Cra ondelatcheperme antletlchargementdel'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 rseau
L'ac vitprincipale:
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 rseau
L'ac vitprincipale:
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

Nousvoulonscrerunservicepourtlchargerdesimages

Ceservicedoit:

pouvoirtreu lispar rd'uneautreapplica on


"broadcaster"lefaitqu'ilaterminuntlchargement
Nepaseectuerlestlchargementssurlethreadprincipal
Traiterdefaonsquen ellelestlchargements

14 . 15
IntentService
Laclasse IntentServicetend Serviceetpermetderalisercela:
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 ( ) ;
}
}
}

Leserviceestarrtquandtouslestraitementsontteectus

14 . 16
Communication de l'URL tlcharger
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
Tlchargement
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
Tlchargement

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
Tlchargement
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 mme 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 mme 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
Implmentation de la mthode 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'extrieur 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