Programmation de composant mobiles aka Android Wies law Zielonka October 8, 2015
ListView et ArrayAdapter / r e c u p e r e r un t a b l e a u de S t r i n g a p a r t i r de r e s s o u r c e s / R e s o u r c e s r e s = g e t R e s o u r c e s ( ) ; f i n a l S t r i n g [ ] c o l o r s = r e s. g e t S t r i n g A r r a y (R. a r r a y. c o l o r s ) ; / c r e e r un a d a p t e r / ArrayAdapter a d a p t e r = new ArrayAdapter <S t r i n g >( t h i s, R. l a y o u t. t e x t v i e w, c o l o r s ) ; / r e c u p e r e r L i s t V i e v from l e f i c h i e r l a y o u t de l a c t i v i L i s t V i e w l v = ( L i s t V i e w ) f i n d V i e w B y I d (R. i d. l i s t V i e w ) ; / c o n n e c t e r L i s t V i e w avec a d a p t e r / l v. s e t A d a p t e r ( a d a p t e r ) ;
ListView dans un layout de Activity Le fichier xml de layout de l activité qui affiche ListView contient un élément pour ListView : <L i s 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 : i d= @+i d / l i s t V i e w a n d r o i d : l a y o u t m a r g i n T o p= 100 dp />
Les ressources avec un tableau de String Le tableau colors est définie dans le fichier app/res/values/strings.xml: <r e s o u r c e s> <s t r i n g a r r a y name= c o l o r s > <item>orange</ item> <item>b l u e</ item> <item>r e d</ item> <item>g r e e n</ item> <item>b l a c k</ item> <item>w h i t e</ item> <item>g r e y</ item> <item>y e l l o w</ item> <item> v i o l e t</ item> <item>p i n k</ item> <item>brun</ item> <item>l a z u r e</ item> </ s t r i n g a r r a y> <! d a u t r e s d e f i n i t i o n s de s t r i n g > </ r e s o u r c e s >
Layout pour une ligne de ListView Le deuxième paramètre du constructeur de ArrayAdapter est un layout qui décrit une ligne de tableau. le même layout sera utilisé pour affichage de chaque ligne. Le fichier xml correspondant app/res/layout/textview.xml : <?xml v e r s i o n= 1. 0 e ncoding= utf 8?> <TextView x m l n s : a n d r o i d= h t t p : // schemas. a n d r o i d. com/ apk / a n d r o i d : l a y o u t w i d t h= match parent 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= 20 sp />
Installer un Listener Installer un listener (lv contient la référence vers l objet ListView - voir le premier transparent) : l v. s e t O n I t e m C l i c k L i s t e n e r (new AdapterView. O n I t e m C l i c k L i s t e n e r ( ) { @Override p u b l i c void o n I t e m C l i c k ( AdapterView <?> parent, View view, i n t p o s i t i o n, long i d ) { Toast. maketext ( M a i n A c t i v i t y. t h i s, c o l o r s [ p o s i t i o n ], Toast. LENGTH LONG ). show ( ) ; } } ) ;
Comment l application peut stocker les données de façon permanente? dans les préférences, dand les fichiers, dans une base de donnée (SQLLite).
Préférences Pour stocker les préférences la classe PreferenceActivity. Mais la version moderne utilise les fragments donc ne sera pas traitée aujourd hui. La classe SharedPreferences permet de stocker les données primitives sous forme de couples (clé, valeur), où la clé est une chaîne de caractères et valeur - la valeur à stocker.
Obtenir l objet SharedPreferences Utiliser la méthode S h a r e d P r e f e r e n c e s g e t S h a r e d P r e f e r e n c e s ( S t r i n g nom, i n t mode ) de la classe Context. Rappel: chaque View est un Context. Les paramètres : nom le nom du fichier où l application stocke les préférences, mode une de constantes : 1. Context.MODE PRIVATE 2. Context.MODE WORLD READABLE 3. Context.MODE WORLD WRITABLE
Lire les préférences Pour lire une préférence on utilise une des méthodes get de la classe SharedPreferences : boolean getboolean ( S t r i n g key, boolean d e f V a l u e ) f l o a t g e t F l o a t ( S t r i n g key, f l o a t d e f V a l u e ) i n t g e t I n t ( S t r i n g key, i n t d e f V a l u e ) long getlong ( S t r i n g key, long d e f V a l u e ) S t r i n g g e t S t r i n g ( S t r i n g key, S t r i n g d e f V a l u e ) Set<S t r i n g > g e t S t r i n g S e t ( S t r i n g key, Set<S t r i n g > d e f V a l u e ) key la clé, defvalue la valuer par défaut retournée si la clé n est pas trouvée.
Écrire ou modifier les préférences D abord il faut obtenir l objet SharedPreferences.Editor grâce à la méthode S h a r e d P r e f e r e n c e s. E d i t o r e d i t ( ) de SharedPreferences. Cet editor possède les méthodes put symétriques aux méthodes get avec les paramètres String pour la clé et valeur pour la valeur stockées.
Valider l écriture/modification de préférences Pour valider les modification apportées par put faire à la fin e d i t o r. a p p l y ( ) ou e d i t o r. commit ( ) où editor l objet SharedPreferences.Editor. La méthode apply() est asynchrone (donc nonbloquante), par contre commit() est bloquante, on préfère la première.
Exemple - écriture de préférences S h a r e d P r e f e r e n c e s p r e f ; p u b l i c s t a t i c f i n a l S t r i n g COULEUR = c o l o r ; p u b l i c f i n a l s t a t i c S t r i n g TEXT SIZE = t e x t s i z e ; p u b l i c s t a t i c f i n a l S t r i n g FICHIER PREFERENCES = f r. l i a f a. z i e l o n k a. p r e f e r e n c e s s i m p l e. PREFERENCES ; / on e s t dans l a c l a s s e P r e f e r e n c e s e x t e n d s A c t i v i t y / p r e f = g e t S h a r e d P r e f e r e n c e s ( FICHIER PREFERENCES, Context. MODE PRIVATE ) ; S t r i n g c o l o r = #FF00FF00 ; i n t t = 20 ; / r e c u p e r e r e d i t o r / S h a r e d P r e f e r e n c e s. E d i t o r e d i t o r = p r e f. e d i t o r ( ) ; / m o d i f i e r / a j o u t e r p r e f e r e n c e s / e d i t o r. p u t I n t ( TEXT SIZE, t ) ; e d i t o r. p u t S t r i n g (COULEUR, c o l o r ) ; e d i t o r. a p p l y ( ) ; / v a l i d e r /
Exemple Lire les préférences Lecture de préférences dans une autre Activity de la même application : S h a r e d P r e f e r e n c e s p r e f ; p r e f=g e t 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. FICHIER PREFERENCES, Context. MODE PRIVATE ) ; S t r i n g c o l o r = p r e f. g e t S t r i n g ( P r e f e r e n c e s.couleur, #FFFFFFFF ) ; i n t n = p r e f. g e t I n t ( P r e f e r e n c e s. TEXT SIZE, 1 2 ) ; TextView t e x t = ( TextView ) 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 S i z e ( TypedValue. COMPLEX UNIT DIP, n ) ; t e x t. s e t B a c k g r o u n d C o l o r ( C o l o r. p a r s e C o l o r ( c o l o r ) ) ;
Digression installer InputFilter customisé sur EditText E d i t T e x t e d i 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 ) ; I n p u t F i l t e r hexa = new I n p u t F i l t e r ( ) { @Override p u b l i c CharSequence f i l t e r ( CharSequence source, i n t s t a r t, i n t end, Spanned dest, i n t d s t a r t, i n t dend ) { S t r i n g B u i l d e r b = new S t r i n g B u i l d e r ( ) ; boolean o k f l a g = true ;
Suite f o r ( i n t i = s t a r t ; i < end ; i ++) { i f ( s o u r c e. charat ( i ) >= 0 && s o u r c e. charat ( i ) <= 9 s o u r c e. charat ( i ) >= a && s o u r c e. charat ( i ) <= f s o u r c e. charat ( i ) >= A && s o u r c e. charat ( i ) <= F ){ b. append ( s o u r c e. charat ( i ) ) ; } e l s e o k f l a g = f a l s e ; / non hexa c a r / } } } ; i f ( o k f l a g ) r e t u r n n u l l ; / e n t r y ok a c c e p t / e l s e r e t u r n b ; / e n t r y not OK modify /
Suite installer les filtres e d i t. s e t F i l t e r s (new I n p u t F i l t e r [ ] { new I n p u t F i l t e r. L e n g t h F i l t e r ( 8 ), hexa } ) ;
Fichiers sur la mémoire interne (fichiers privés) Context possède la méthode F i l e g e t F i l e s D i r ( ) qui retourne le chemin vers le repertoire privé de l application (sur la mémoire interne de l appareil). Dans ma tablette cela donne le chemin : /data/data/fr.liafa.zielonka.widgets/files pour l application qui s appelle widgets.
Lire/écrire les fichiers internes Context possède les méthodes : F i l e I n p u t S t r e a m o p e n F i l e I n p u t ( S t r i n g name ) F i l eoutputstream o p e n F i l e O u t p u t ( S t r i n g name, i n t mode ) boolean d e l e t e F i l e ( S t r i n g name ) qui permettent d ouvrir un fichier interne en lecture, écriture ou le supprimer. Le nom de fichier ne peut pas contenir /. Tous les fichiers internes sont créés dans le répertoire retourné par getfilesdir() et il est impossible de créer de sous répertoires. Le paramètre mode peut prendre les valeurs Context.MODE PRIVATE, Context.MODE APPEND, Context.MODE WORLD READABLE et Context.MODE WORLD WRITEABLE. Les deux derniers modes ne doivent pas être utilisés. Le fichier est par défaut écrasé à l ouverture, si on préfère le garder spécifiez MODE_APPEND.
Exemple lecture S t r i n g B u i l d e r l i r e ( boolean e x t e r n a l, S t r i n g f i c h i e r ) { F i l e f i l e = n u l l ; S t r i n g B u i l d e r sb = n u l l ; F i l e I n p u t S t r e a m f i s = n u l l ; t r y { f i s = o p e n F i l e I n p u t ( f i c h i e r ) ; } catch ( F i l e N o t F o u n d E x c e p t i o n e ){ Log. d ( APPLIC, f i l e + f i c h i e r + not found ) ; return n u l l ; } sb = l i r e F i l e I n p u t S t r e a m ( f i s ) ;
Exemple lecture (suite) } t r y { f i s. c l o s e ( ) ; } catch ( IOException e ) { Log. d ( APPLIC, c l o s e + f i c h i e r ) ; } return sb ;
lirefileinputstream S t r i n g B u i l d e r l i r e F i l e I n p u t S t r e a m ( F i l e I n p u t S t r e a m f i s ){ S t r i n g B u i l d e r sb = n u l l ; InputStreamReader r s t r e a m = n u l l ; t r y { r s t r e a m = new InputStreamReader ( f i s ) ; sb = new S t r i n g B u i l d e r ( ) ; i n t nb = 128; } char [ ] tab = new char [ nb ] ; i n t i ; while ( ( i = r s t r e a m. read ( tab, 0, nb ) ) > 0) { sb. append ( tab, 0, i ) ; } } catch ( IOException e ) { Log. d ( APPLIC, read i m p o s s i b l e ) ; return n u l l ; } return sb ;
Écrire dans un fichier interne boolean s a u v e g a r d e ( boolean e x t e r n a l, S t r i n g t e x t, S t r i n g f i c h i e r ){ F i l eoutputstream f o s = n u l l ; t r y { f o s = o p e n F i l e O u t p u t ( f i c h i e r, MODE PRIVATE ) ; } catch ( F i l e N o t F o u n d E x c e p t i o n e ){ Log. d ( APPLIC, f i l e + f i c h i e r+ not found ) ; return f a l s e ; } t r y { OutputStreamWriter ostream = new OutputStreamWriter ( f o s ) ; ostream. w r i t e ( t e x t, 0, t e x t. l e n g t h ( ) ) ; ostream. c l o s e ( ) ; } catch ( IOException e ){ Log. d ( APPLIC, w r i t e i m p o s s i b l e ) ; return f a l s e ; } return true ;
Trouver les fichiers internes (privés) Context possède les méthodes S t r i n g [ ] f i l e L i s t ( ) boolean d e l e t e F i l e ( S t r i n g name ) La première donne les noms de fichiers créés par l application. La deuxième supprime un fichier (le nom sans séparateur).
Fichiers externes Context possède aussi les méthodes F i l e g e t E x t e r n a l F i l e s D i r ( S t r i n g type ) F i l e [ ] g e t E x t e r n a l F i l e s D i r s ( S t r i n g type ) qui retourne le(s) répertoire(s) externes(s) de l application (sur une carte SD). Chaque application possédant le droit WRITE EXTERNAL STORAGE peut écrire dans ces fichiers et avec le droit READ EXTERNAL STORAGE peut le lire.