• Aucun résultat trouvé

[PDF] Support d’introduction au langage Java et Androide | Cours informatique

N/A
N/A
Protected

Academic year: 2021

Partager "[PDF] Support d’introduction au langage Java et Androide | Cours informatique"

Copied!
283
0
0

Texte intégral

(1)

Développement Mobile sur Android

Master CCI

(2)

1 2 . 1

Organisation de l'enseignement

Objec fs :

Connaître les différents composants d'une applica on Android

Savoir organiser une applica on

Savoir u liser une documenta on

Progresser en Java

Évalua on :

Seuls les TP seront évalués

Il est important de venir à tous les TP

Les notes sont individuelles

Vous devez donc travailler seul

(3)

Le projet

Un réveil :

(4)

2 . 3

Démo du projet

(5)

Les fonctionnalités du projet

Ajout d'une alarme

Modifica on de l'heure des alarmes

Ac va on/Désac va on d'une alarme

Suppression d'une alarme

No fica on de l'u lisa on

Sonnerie de l'alarme

Réveil de l'écran en cas de sonnerie

Possibilité d'arrêter l'alarme

(6)

2 . 5

Les outils pour développer sur Android

Nous devons u liser le SDK d'Android qui fournit :

les librairies Java d'Android

un émulateur pour tester vos applica ons

des images du système Android

Nous devons u liser Java donc il faut :

Maîtriser les concepts de la programma on objet

Savoir lire une documenta on Java

Nous devons u liser un IDE adapté, c'est‐à‐dire, Android Studio :

Première étape du TP, la configura on de l'IDE

Il est basé sur IntelliJ IDEA de Jet Brains

(7)
(8)

2 . 7

(9)
(10)

2 . 9

Émulateur

(11)

Installation

(12)

2 . 11

Création d'une machine virtuelle

(13)
(14)

2 . 13

Les composants d'une application

Ac vités : les différents écrans de l'applica on

Services : un composant qui s'exécute en tâche de fond

Fournisseur de contenu : ges on et partage des données

Receveur de broadcasts : recep on de no fica ons

AlarmActivity

FireActivity

AlarmProvider

FireService

(15)

Sécurité dans le système Android

Chaque applica on est exécutée dans une sandbox (bac à sable) :

Android est système Linux mul ‐u lisateur

Chaque applica on est un u lisateur différent

Chaque fichier de l'applica on n'est accessible que par elle

Par défaut, chaque processus possède sa machine virtuelle

Chaque applica on a son propre processus Linux

(16)

2 . 15

Communication entre composants

Les ac vités, les services et les receveurs de broadcasts sont

ac vés par des messages asynchrones : les intents

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

Les fournisseurs de contenu sont ac vés par des requêtes

effectuées à l'aide d'un résolveur de contenu.

Une requête est composée :

d'une URI de la forme 

content://authority/path

d'une ac on 

query

delete

update

 ou 

insert

U r i u r i = U r i . p a r s e ( " c o n t e n t : / / f r . u n i v _ a m u . c c i . a l a r m / a l a r m s " ) ; r e s o l v e r . i n s e r t ( u r i , v a l u e s ) ;

(17)

Quelques classes d'Android

Activity

Intent

ContentProvider

Service

BroadcastReceiver

ContentResolver

View

Cursor

(18)

2 . 17

Structure d'un projet

Manifeste

Code Java

Ressources

(19)

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 >

(20)

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

(21)
(22)

3 . 2

Déclaration de l'activité dans le manifeste

< m a n i f e s t x m l n s : a n d r o i d = " h t t p : / / s c h e m a s . a n d r o i d . c o m / a p k / r e s / a n d r o i d " p a c k a g e = " c o m . c c i . c a l c u l a t o r " > < a p p l i c a t i o n a n d r o i d : a l l o w B a c k u p = " t r u e " a n d r o i d : i c o n = " @ d r a w a b l e / i c _ l a u n c h e r " a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e " a n d r o i d : t h e m e = " @ s t y l e / A p p T h e m e " > < a c t i v i t y a n d r o i d : n a m e = " . M a i n A c t i v i t y " a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e " > < i n t e n t - f i l t e r > < a c t i o n a n d r o i d : n a m e = " a n d r o i d . i n t e n t . a c t i o n . M A I N " / > < c a t e g o r y a n d r o i d : n a m e = " a n d r o i d . i n t e n t . c a t e g o r y . L A U N C H E R " / > < / i n t e n t - f i l t e r > < / a c t i v i t y > < / a p p l i c a t i o n > < / m a n i f e s t >

(23)
(24)

3 . 4

Cycle de vie d'une activité :

Aucune méthode 

main

 dans un programme Android

Android exécute le code d'une ac vité en appelant des callbacks

Ces callbacks correspondent aux phrases de la vie d'une ac vité

Il n'est pas nécessaire d'implémenter toutes les callbacks

(25)

États durables d'une activité

Resumed

L'ac vité est au premier plan et l'u lisateur peut interagir avec elle

On dit aussi qu'elle est en train d'être exécutée

Paused

L'ac vité est par ellement recouverte par une autre ac vité qui se

trouve au premier plan

L'ac vité en pause ne peut pas recevoir d'ac on de l'u lisateur

Stopped

L'ac vité est totalement cachée et ne peut plus exécutée de code

Toutes ses informa ons sont conservées

(26)

3 . 6

États transitoires d'une activité

Created

L'ac vité vient d'être créée.

Started

L'ac vité vient de devenir visible.

(27)

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

(28)

3 . 8

Cycle de vie des activités

(29)

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

(30)

3 . 10

Sauvegarde de l'état de l'application

L'applica on est détruite dans les états 

rouges

 :

(31)

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

(32)

3 . 12

Sauvegarde de l'état de l'application

(33)

Sauvegarde de l'état de l'application

(34)

3 . 14

Sauvegarde de l'état de l'application

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { / * . . . * / @ O v e r r i d e p r o t e c t e d v o i d o n R e s t o r e I n s t a n c e S t a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n R e s t o r e I n s t a n c e S t a t e ( s a v e d I n s t a n c e S t a t e ) ; v a l u e = s a v e d I n s t a n c e S t a t e . g e t I n t ( " v a l u e " ) ; u p d a t e B u t t o n L a b e l ( ) ; } @ O v e r r i d e p r o t e c t e d v o i d o n S a v e I n s t a n c e S t a t e ( B u n d l e o u t S t a t e ) { s u p e r . o n S a v e I n s t a n c e S t a t e ( o u t S t a t e ) ; o u t S t a t e . p u t I n t ( " v a l u e " , v a l u e ) ; } }

(35)

Les Bundles

Les Bundles peuvent associer des chaînes de caractères à des :

des types simples : en ers, flo ants, caractères...

des chaînes de caractères

des tableaux et des listes

des objets Parcelable

Quelques remarques :

Un Bundle est Parcelable

Un objet Parcelable peut être écrit dans un objet Parcel

Un Parcel est un conteneur pour un message

(36)

3 . 16

Quelques méthodes de la classe Bundle

putInt(String key, int value)

int getInt(String key)

putDouble(String key, double value)

double getDouble(String key)

putString(String key, String value)

String getString(String key)

putStringArrayList(String key, ArrayList<String> list)

ArrayList<String> getStringArrayList(String key)

putCharArray(String key, char[] array)

char[] getCharArray(String key)

(37)

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

(38)
(39)

Les classes View et ViewGroup

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; R e l a t i v e L a y o u t l a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ; T e x t V i e w t e x t = n e w T e x t V i e w ( t h i s ) ; t e x t . s e t T e x t ( " H e l l o W o r l d ! " ) ; l a y o u t . a d d V i e w ( t e x t ) ; s e t C o n t e n t V i e w ( l a y o u t ) ; } }

Dans ce e exemple :

RelativeLayout

 étend 

ViewGroup

ViewGroup

 étend 

View

(40)

4 . 3

Les classes View et ViewGroup

Une vue est une classe qui étend 

View

Une vue peut être dessinée à l'écran

Un groupe de vue étend 

ViewGroup

 et donc 

View

Un groupe de vues peut contenir d'autres vues

Un groupe de vues organise l'affichage des vues qu'il con ent

(41)
(42)

4 . 5

Construction d'une vue en Java

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

(43)

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

(44)

4 . 7

Construction d'une vue en Java

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { / * . . . * / p r i v a t e B u t t o n c r e a t e B u t t o n ( ) { B u t t o n b u t t o n = n e w B u t t o n ( t h i s ) ; b u t t o n . s e t L a y o u t P a r a m s ( n e w L i n e a r L a y o u t . L a y o u t P a r a m s ( 0 , V i e w G r o u p . L a y o u t P a r a m s . M A T C H _ P A R E N T , 1 . 0 f ) ) ; b u t t o n . s e t T e x t ( " B u t t o n " ) ; r e t u r n b u t t o n ; } }

(45)

Les évènements

On ajoute des écouteurs aux vues pour écouter les évènements :

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p u b l i c i n t c o u n t = 0 ; @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; B u t t o n b u t t o n = n e w B u t t o n ( t h i s ) ; b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w M y O n C l i c k L i s t e n e r ( t h i s ) ) ; s e t C o n t e n t V i e w ( b u t t o n ) ; } }

(46)

4 . 9

Les écouteurs

La méthode 

setOnClickListener

 prend en paramètre un objet qui

implémente l'interface 

View.OnClickListener

 :

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

Une interface est associée à chaque type d'évènements

On observe les évènements en connectant des listeners

Pour cela, on u lise les méthodes 

setOn*Listener

Ensuite, un évènement entraîne l'appel d'une méthode de

l'interface sur l'objet que vous avez connecté à la vue

(47)

Implémentation avec une classe classique

c l a s s M y O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r { p r i v a t e M a i n A c t i v i t y m a i n A c t i v i t y ; p u b l i c M y O n C l i c k L i s t e n e r ( M a i n A c t i v i t y m a i n A c t i v i t y ) { t h i s . m a i n A c t i v i t y = m a i n A c t i v i t y ; } @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { m a i n A c t i v i t y . c o u n t + + ; } }

(48)

4 . 11

Implémentation avec une classe interne

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p u b l i c i n t c o u n t = 0 ; @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { / * . . . * / b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w M y O n C l i c k L i s t e n e r ( ) ) ; / * . . . * / } c l a s s M y O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { c o u n t + + ; } } }

(49)

Implémentation avec une classe anonyme

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p u b l i c i n t c o u n t = 0 ; @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; B u t t o n b u t t o n = n e w B u t t o n ( t h i s ) ; b u t t o n . s e t O n C l i c k L i s t e n e r ( n e w V i e w . O n C l i c k L i s t e n e r ( ) { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { c o u n t + + ; } } ) ; s e t C o n t e n t V i e w ( b u t t o n ) ; } }

(50)

5 . 1

Les ressources

elles sont en dehors du code et con ennent

les images

les chaînes de caractères

les modèles d'interfaces u lisateur

les anima ons...

elles sont choisies en fonc on de la configura on :

taille de l'écran

orienta on de l'écran

langue...

(51)
(52)

5 . 3

La classe R

Elle est génèrée automa quement par Android

Elle permet de désigner les ressources dans le code Java

(53)

Les layouts

La méthode 

setContentView

 peut prendre l'iden fiant d'un layout :

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; } }

Le contenu du fichier 

activity_main.xml

 :

< R e l a t i v e L a y o u t x m l n s : a n d r o i d = " . . . " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " > < T e x t V i e w a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " a n d r o i d : t e x t S i z e = " 1 0 0 d p " a n d r o i d : t e x t = " H e l l o W o r l d ! " / > < / R e l a t i v e L a y o u t >

(54)

Les layouts

Le contenu du fichier 

activity_main.xml

 :

< R e l a t i v e L a y o u t x m l n s : a n d r o i d = " . . . " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " > < T e x t V i e w a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " a n d r o i d : t e x t S i z e = " 1 0 0 d p " a n d r o i d : t e x t = " H e l l o W o r l d ! " / > < / R e l a t i v e L a y o u t >

(55)
(56)

5 . 6

Les chaînes de caractères

Pour faciliter la traduc on des applica ons, il est préférable d'u liser

des références à des chaînes de caractères dans les programmes ou

les layouts :

< R e l a t i v e L a y o u t x m l n s : a n d r o i d = " . . . " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " > < T e x t V i e w a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " a n d r o i d : t e x t = " @ s t r i n g / h e l l o _ w o r l d " / > < / R e l a t i v e L a y o u t >

(57)

Les chaînes de caractères

Elles se trouvent dans le fichier 

strings.xml

 :

< r e s o u r c e s > < s t r i n g n a m e = " h e l l o _ w o r l d " > H e l l o w o r l d ! < / s t r i n g > < / r e s o u r c e s >

Pour accéder aux chaînes de caractères en XML :

< R e l a t i v e L a y o u t . . . > < T e x t V i e w . . . a n d r o i d : t e x t = " @ s t r i n g / h e l l o _ w o r l d " / > < / R e l a t i v e L a y o u t >

(58)

5 . 8

Les chaînes de caractères

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; R e l a t i v e L a y o u t l a y o u t = n e w R e l a t i v e L a y o u t ( t h i s ) ; T e x t V i e w t e x t = n e w T e x t V i e w ( t h i s ) ; C o n t e x t c o n t e x t = t h i s ; t e x t . s e t T e x t ( R . s t r i n g . h e l l o _ w o r l d ) ; / * S t r i n g h e l l o W o r l d = c o n t e x t . g e t R e s o u r c e s ( ) . g e t T e x t ( R . s t r i n g . h e l l o _ w o r l d ) ; t e x t . s e t T e x t ( h e l l o W o r l d ) ; * / l a y o u t . a d d V i e w ( t e x t ) ; s e t C o n t e n t V i e w ( l a y o u t ) ; } }

(59)

Les références

Syntaxe pour désigner une ressource dans un document XML

@ [ < p a c k a g e _ n a m e > : ] < r e s o u r c e _ t y p e > / < r e s o u r c e _ n a m e >

<package_name>

 est le nom du paquet

<resource_type>

 est le type de la ressource

<resource_name>

 est

le nom du fichier qui con ent la ressource

ou la valeur de l'a ribut 

android:name

 d'un élément XML

< I m a g e V i e w

a n d r o i d : c o n t e n t D e s c r i p t i o n = " @ a n d r o i d : s t r i n g / o k "

(60)

5 . 10

Les dimensions

< R e l a t i v e L a y o u t x m l n s : a n d r o i d = " . . . " x m l n s : t o o l s = " h t t p : / / s c h e m a s . a n d r o i d . c o m / t o o l s " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " a n d r o i d : p a d d i n g L e f t = " @ d i m e n / a c t i v i t y _ h o r i z o n t a l _ m a r g i n " a n d r o i d : p a d d i n g R i g h t = " @ d i m e n / a c t i v i t y _ h o r i z o n t a l _ m a r g i n " a n d r o i d : p a d d i n g T o p = " @ d i m e n / a c t i v i t y _ v e r t i c a l _ m a r g i n " a n d r o i d : p a d d i n g B o t t o m = " @ d i m e n / a c t i v i t y _ v e r t i c a l _ m a r g i n " > < / R e l a t i v e L a y o u t >

Les dimensions sont définies dans le fichier 

dimens.xml

 :

< r e s o u r c e s > < d i m e n n a m e = " a c t i v i t y _ h o r i z o n t a l _ m a r g i n " > 1 6 d p < / d i m e n > < d i m e n n a m e = " a c t i v i t y _ v e r t i c a l _ m a r g i n " > 1 6 d p < / d i m e n > < / r e s o u r c e s >

Il est également possible d'accéder aux dimensions en Java :

f l o a t d i m e n s i o n = g e t R e s o u r c e s ( ) . g e t D i m e n s i o n ( R . d i m e n . a c t i v i t y _ h o r i z o n t a l _ m a r g i n ) ;

(61)

Prise en charge des différentes configurations

Il est possible de définir des ressources en fonc on de :

l'orienta on du terminal

la résolu on

la taille de l'écran

la version de l'API

de la langue, etc.

Par exemple :

values/dimens.xml

 : dimensions par défaut

values-w820dp/dimens.xml

 : dim. pour des écrans de 820p

layout

 : les layouts par défaut

layout-land

 : les versions paysage des layouts

values-fr/strings.xml

 : chaînes en français

(62)

5 . 12

Les images

Il est possible de stocker des images dans les ressources

Les images peuvent être stockées sous différentes résolu ons

La résolu on est choisie en fonc on du terminal de l'u lisateur

(63)

Les images

Avec un 

ic_launcher.png

 dans les sous‐répertoires 

drawable-*

 :

< I m a g e V i e w a n d r o i d : c o n t e n t D e s c r i p t i o n = " @ s t r i n g / h e l l o _ w o r l d " a n d r o i d : s r c = " @ d r a w a b l e / i c _ l a u n c h e r " a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " / > < I m a g e B u t t o n a n d r o i d : i d = " @ + i d / b u t t o n " a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " a n d r o i d : c o n t e n t D e s c r i p t i o n = " @ s t r i n g / c o u n t " a n d r o i d : s r c = " @ d r a w a b l e / i c _ l a u n c h e r " a n d r o i d : o n C l i c k = " c o u n t " / >

(64)

5 . 14

Les images

On désigne une image par son iden fiant :

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; g e t W i n d o w ( ) . s e t B a c k g r o u n d D r a w a b l e R e s o u r c e ( R . d r a w a b l e . i c _ l a u n c h e r ) ; I m a g e V i e w i m a g e = ( I m a g e V i e w ) f i n d V i e w B y I d ( R . i d . i m a g e ) ; i m a g e . s e t I m a g e R e s o u r c e ( R . d r a w a b l e . i c _ l a u n c h e r ) ; } }

(65)

Les images

un Drawable décrit par un fichier XML :

< r i p p l e x m l n s : a n d r o i d = " . . . " a n d r o i d : c o l o r = " ? a n d r o i d : c o l o r C o n t r o l H i g h l i g h t " > < i t e m > < s h a p e a n d r o i d : s h a p e = " o v a l " > < s o l i d a n d r o i d : c o l o r = " ? a n d r o i d : c o l o r A c c e n t " / > < / s h a p e > < / i t e m > < / r i p p l e >

qui change avec l'état de l'élément sur lequel il est u lisé :

< s e l e c t o r x m l n s : a n d r o i d = " . . . " > < i t e m a n d r o i d : s t a t e _ s e l e c t e d = " t r u e " a n d r o i d : d r a w a b l e = " @ d r a w a b l e / s e l e c t e d _ n o t e _ b a c k g r o u n d " / > < i t e m a n d r o i d : d r a w a b l e = " @ d r a w a b l e / n o r m a l _ n o t e _ b a c k g r o u n d " / > < / s e l e c t o r >

(66)

5 . 16

Les couleurs

Contenu du fichier 

res/color/button_text.xml

 :

< s e l e c t o r x m l n s : a n d r o i d = " . . . " > < i t e m a n d r o i d : s t a t e _ p r e s s e d = " t r u e " a n d r o i d : c o l o r = " # f f f f 0 0 0 0 " / > < ! - - p r e s s e d - - > < i t e m a n d r o i d : s t a t e _ f o c u s e d = " t r u e " a n d r o i d : c o l o r = " # f f 0 0 0 0 f f " / > < ! - - f o c u s e d - - > < i t e m a n d r o i d : c o l o r = " # f f 0 0 0 0 0 0 " / > < ! - - d e f a u l t - - > < / s e l e c t o r >

Exemple d'u lisa on :

< B u t t o 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 "

(67)

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 >

(68)

5 . 18

Les styles

Défini on d'un style à par r d'un autre style :

< r e s o u r c e s > < s t y l e n a m e = " A p p T h e m e " p a r e n t = " a n d r o i d : T h e m e . M a t e r i a l . L i g h t . D a r k A c t i o n B a r " > < i t e m n a m e = " a n d r o i d : c o l o r P r i m a r y " > @ a n d r o i d : c o l o r / h o l o _ b l u e _ l i g h t < / i t e m > < i t e m n a m e = " a n d r o i d : c o l o r P r i m a r y D a r k " > @ a n d r o i d : c o l o r / h o l o _ b l u e _ d a r k < / i t e m > < i t e m n a m e = " a n d r o i d : t e x t C o l o r " > @ a n d r o i d : c o l o r / b l a c k < / i t e m > < ! - - . . . - - > < / s t y l e > < / r e s o u r c e s >

(69)

Les styles

U lisa on du style dans le manifeste de l'applica on :

< m a n i f e s t x m l n s : a n d r o i d = " h t t p : / / s c h e m a s . a n d r o i d . c o m / a p k / r e s / a n d r o i d " p a c k a g e = " c o m . u n i v _ a m u . c c i . n o t e s " > < a p p l i c a t i o n a n d r o i d : a l l o w B a c k u p = " t r u e " a n d r o i d : i c o n = " @ d r a w a b l e / i c _ l a u n c h e r " a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e " a n d r o i d : t h e m e = " @ s t y l e / A p p T h e m e " > < a c t i v i t y a n d r o i d : n a m e = " . M a i n A c t i v i t y " a n d r o i d : l a b e l = " @ s t r i n g / a p p _ n a m e " > < i n t e n t - f i l t e r > < a c t i o n a n d r o i d : n a m e = " a n d r o i d . i n t e n t . a c t i o n . M A I N " / > < c a t e g o r y a n d r o i d : n a m e = " a n d r o i d . i n t e n t . c a t e g o r y . L A U N C H E R " / > < / i n t e n t - f i l t e r > < / a c t i v i t y > < / a p p l i c a t i o n > < / m a n i f e s t >

(70)

5 . 20

Les identifiants

Associa on des iden fiants aux membres d'un layout :

< R e l a t i v e L a y o u t x m l n s : a n d r o i d = " h t t p : / / s c h e m a s . a n d r o i d . c o m / a p k / r e s / a n d r o i d " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " > < T e x t V i e w a n d r o i d : i d = " @ + i d / t e x t " a n d r o i d : l a y o u t _ w i d t h = " w r a p _ c o n t e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " a n d r o i d : t e x t = " @ s t r i n g / h e l l o _ w o r l d " / > < / R e l a t i v e L a y o u t >

Accès aux éléments d'un layout avec son iden fiant :

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

(71)

Les fragments

Un fragment :

représente une por on d'interface u lisateur

peut être inséré dans une ac vité

peut être u lisé dans plusieurs ac vités

possède son propre cycle de vie, layout, etc.

Une ac vité :

peut afficher plusieurs fragments

(72)

6 . 2

Une application avec deux fragments

(73)

Premier layout : le formulaire

Le layout correspondant au formulaire du premier écran :

< L i n e a r L a y o u t x m l n s : a n d r o i d = " . . . " > < E d i t T e x t a n d r o i d : i d = " @ + i d / e d i t T e x t 1 " a n d r o i d : i n p u t T y p e = " n u m b e r " / > < T e x t V i e w a n d r o i d : t e x t = " @ s t r i n g / p l u s " / > < E d i t T e x t a n d r o i d : i d = " @ + i d / e d i t T e x t 2 " a n d r o i d : i n p u t T y p e = " n u m b e r " / > < B u t t o n a n d r o i d : i d = " @ + i d / b u t t o n " a n d r o i d : t e x t = " @ s t r i n g / e q u a l s " / > < / L i n e a r L a y o u t >

(74)
(75)

Deuxième layout : le resultat

< T e x t V i e w x m l n s : a n d r o i d = " . . . " x m l n s : t o o l s = " . . . " a n d r o i d : i d = " @ + i d / t e x t V i e w " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " a n d r o i d : g r a v i t y = " c e n t e r " a n d r o i d : t e x t S i z e = " 1 0 0 d p " a n d r o i d : t e x t = " + " / >

(76)
(77)

Le layout de l'activité principale

Le layout de l'ac vité principale :

< F r a m e L a y o u t x m l n s : a n d r o i d = " . . . " x m l n s : t o o l s = " . . . " a n d r o i d : i d = " @ + i d / c o n t a i n e r " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " / >

Le code de l'ac vité principale :

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

(78)

6 . 6

Création de la vue dans le premier fragment

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

(79)
(80)

6 . 8

Notification entre le fragment et l'activité

FormFragment

 doit no fier l'ac vité de la valida on du formulaire

Interface pour rendre le fragment réu lisable :

p u b l i c i n t e r f a c e F o r m F r a g m e n t L i s t e n e r {

v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) ; }

L'ac vité va implémenter ce e interface

Lors de l'exécu on de la méthode 

onAttach

 du fragment, nous

(81)

Notification entre le fragment et l'activité

Nous conservons la référence de l'ac vité :

p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t { p r i v a t e F o r m F r a g m e n t L i s t e n e r l i s t e n e r ; @ O v e r r i d e p u b l i c v o i d o n A t t a c h ( A c t i v i t y a c t i v i t y ) { s u p e r . o n A t t a c h ( a c t i v i t y ) ; t r y { l i s t e n e r = ( F o r m F r a g m e n t L i s t e n e r ) a c t i v i t y ; } c a t c h ( C l a s s C a s t E x c e p t i o n e ) { t h r o w n e w C l a s s C a s t E x c e p t i o n ( a c t i v i t y . t o S t r i n g ( ) + " m u s t i m p l e m e n t F o r m F r a g m e n t L i s t e n e r " ) ; } } }

(82)

6 . 10

Notification entre le fragment et l'activité

Nous faisons en sorte d'écouter les clics sur le bouton :

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

(83)

Notification entre le fragment et l'activité

Nous no fions l'ac vité si un clic se produit :

p u b l i c c l a s s F o r m F r a g m e n t e x t e n d s F r a g m e n t { p r i v a t e E d i t T e x t e d i t T e x t 1 , e d i t T e x t 2 ; p r i v a t e F o r m F r a g m e n t L i s t e n e r l i s t e n e r ; p r i v a t e c l a s s O n C l i c k L i s t e n e r i m p l e m e n t s V i e w . O n C l i c k L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( V i e w v ) { d o u b l e v a l u e 1 = D o u b l e . p a r s e D o u b l e ( e d i t T e x t 1 . g e t T e x t ( ) . t o S t r i n g ( ) ) ; d o u b l e v a l u e 2 = D o u b l e . p a r s e D o u b l e ( e d i t T e x t 2 . g e t T e x t ( ) . t o S t r i n g ( ) ) ; l i s t e n e r . o n E q u a l s ( v a l u e 1 , v a l u e 2 ) ; } } }

(84)

6 . 12

Notification entre le fragment et l'activité

Récep on de la no fica on par l'ac vité :

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y i m p l e m e n t s F o r m F r a g m e n t L i s t e n e r { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; i f ( s a v e d I n s t a n c e S t a t e = = n u l l ) { g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) . a d d ( R . i d . c o n t a i n e r , n e w F o r m F r a g m e n t ( ) ) . c o m m i t ( ) ; } } @ O v e r r i d e p u b l i c v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) { / * T O D O : a f f i c h e r l e r é s u l t a t * / } }

(85)

Le deuxième fragment

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

(86)

6 . 14

Affichage du deuxième fragment par l'activité

p u b l i c c l a s s R e s u l t F r a g m e n t e x t e n d s F r a g m e n t i m p l e m e n t s F o r m F r a g m e n t L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) { d o u b l e v a l u e = v a l u e 1 + v a l u e 2 ; g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) . r e p l a c e ( R . i d . c o n t a i n e r , R e s u l t F r a g m e n t . g e t I n s t a n c e ( v a l u e ) ) . a d d T o B a c k S t a c k ( " r e s u l t " ) . c o m m i t ( ) ; } }

(87)

Affichage de deux fragments par l'activité

(88)

6 . 16

Affichage de deux fragments par l'activité

Le layout de l'ac vité par défaut :

< L i n e a r L a y o u t x m l n s : a n d r o i d = " . . . " a n d r o i d : o r i e n t a t i o n = " v e r t i c a l " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " > < f r a g m e n t c l a s s = " c o m . u n i v _ a m u . c c i . m y a p p l i c a t i o n . F o r m F r a g m e n t " a n d r o i d : i d = " @ + i d / f o r m " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " / > < F r a m e L a y o u t a n d r o i d : i d = " @ + i d / c o n t a i n e r " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " w r a p _ c o n t e n t " a n d r o i d : b a c k g r o u n d = " ? a n d r o i d : a t t r / d e t a i l s E l e m e n t B a c k g r o u n d " / > < / L i n e a r L a y o u t >

(89)

Affichage de deux fragments par l'activité

Le layout de l'ac vité en mode paysage (répertoire 

layout-land

) :

< L i n e a r L a y o u t x m l n s : a n d r o i d = " . . . " a n d r o i d : o r i e n t a t i o n = " h o r i z o n t a l " a n d r o i d : l a y o u t _ w i d t h = " m a t c h _ p a r e n t " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " > < f r a g m e n t c l a s s = " c o m . u n i v _ a m u . c c i . m y a p p l i c a t i o n . F o r m F r a g m e n t " a n d r o i d : i d = " @ + i d / f o r m " a n d r o i d : l a y o u t _ w e i g h t = " 1 " a n d r o i d : l a y o u t _ w i d t h = " 0 p x " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " / > < F r a m e L a y o u t a n d r o i d : i d = " @ + i d / c o n t a i n e r " a n d r o i d : l a y o u t _ w e i g h t = " 1 " a n d r o i d : l a y o u t _ w i d t h = " 0 p x " a n d r o i d : l a y o u t _ h e i g h t = " m a t c h _ p a r e n t " a n d r o i d : b a c k g r o u n d = " ? a n d r o i d : a t t r / d e t a i l s E l e m e n t B a c k g r o u n d " / > < / L i n e a r L a y o u t >

(90)

6 . 18

Affichage de deux fragments par l'activité

Le code de l'ac vité :

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y i m p l e m e n t s F o r m F r a g m e n t L i s t e n e r { @ O v e r r i d e p r o t e c t e d v o i d o n C r e a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n C r e a t e ( s a v e d I n s t a n c e S t a t e ) ; s e t C o n t e n t V i e w ( R . l a y o u t . a c t i v i t y _ m a i n ) ; } @ O v e r r i d e p u b l i c v o i d o n E q u a l s ( d o u b l e v a l u e 1 , d o u b l e v a l u e 2 ) { d o u b l e v a l u e = v a l u e 1 + v a l u e 2 ; g e t F r a g m e n t M a n a g e r ( ) . b e g i n T r a n s a c t i o n ( ) . r e p l a c e ( R . i d . c o n t a i n e r , R e s u l t F r a g m e n t . g e t I n s t a n c e ( v a l u e ) ) . a d d T o B a c k S t a c k ( " r e s u l t " ) . c o m m i t ( ) ; } }

(91)

Les boites de dialogue

(92)

6 . 20

Les boites de dialogue

Les boites de dialogue sont des fragments :

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

(93)

Les boites de dialogue

L'inferface de communica on :

p u b l i c i n t e r f a c e D i a l o g F r a g m e n t L i s t e n e r { v o i d o n C h a n g e T e x t ( S t r i n g t e x t ) ; }

On redéfinit ensuite la méthode 

onAttach

 :

p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t { p r i v a t e D i a l o g F r a g m e n t L i s t e n e r l i s t e n e r ; @ O v e r r i d e p u b l i c v o i d o n A t t a c h ( A c t i v i t y a c t i v i t y ) { s u p e r . o n A t t a c h ( a c t i v i t y ) ; t r y { l i s t e n e r = ( D i a l o g F r a g m e n t L i s t e n e r ) a c t i v i t y ; } c a t c h ( C l a s s C a s t E x c e p t i o n e ) { t h r o w n e w C l a s s C a s t E x c e p t i o n ( a c t i v i t y . t o S t r i n g ( ) + " m u s t i m p l e m e n t D i a l o g F r a g m e n t L i s t e n e r " ) ; } } }

(94)

6 . 22

Les boites de dialogue

Les écouteurs des événements :

p u b l i c c l a s s D i a l o g F r a g m e n t e x t e n d s a n d r o i d . a p p . D i a l o g F r a g m e n t { p r i v a t e c l a s s O n P o s i t i v e B u t t o n C l i c k L i s t e n e r i m p l e m e n t s D i a l o g I n t e r f a c e . O n C l i c k L i s t e n e r { @ O v e r r i d e p u b l i c v o i d o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , i n t i d ) { l i s t e n e r . o n C h a n g e T e x t ( e d i t T e x t . g e t T e x t ( ) . t o S t r i n g ( ) ) ; D i a l o g F r a g m e n t . t h i s . g e t D i a l o g ( ) . d i s m i s s ( ) ; } } p r i v a t e c l a s s O n N e g a t i v e B u t t o n C l i c k L i s t e n e r i m p l e m e n t s D i a l o g I n t e r f a c e . O n C l i c k L i s t e n e r { p u b l i c v o i d o n C l i c k ( D i a l o g I n t e r f a c e d i a l o g , i n t i d ) { D i a l o g F r a g m e n t . t h i s . g e t D i a l o g ( ) . c a n c e l ( ) ; } } }

(95)

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

(96)

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 >

(97)
(98)

7 . 2

Chargement et traitement des actions du menu

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { @ O v e r r i d e p u b l i c b o o l e a n o n C r e a t e O p t i o n s M e n u ( M e n u m e n u ) { g e t M e n u I n f l a t e r ( ) . i n f l a t e ( R . m e n u . m a i n , m e n u ) ; r e t u r n t r u e ; } @ O v e r r i d e p u b l i c b o o l e a n o n O p t i o n s I t e m S e l e c t e d ( M e n u I t e m i t e m ) { s w i t c h ( i t e m . g e t I t e m I d ( ) ) { c a s e R . i d . a c t i o n _ d e c r e m e n t : d e c r e m e n t ( ) ; r e t u r n t r u e ; c a s e R . i d . a c t i o n _ i n c r e m e n t : i n c r e m e n t ( ) ; r e t u r n t r u e ; d e f a u l t : r e t u r n s u p e r . o n O p t i o n s I t e m S e l e c t e d ( i t e m ) ; } } / * l e s m é t h o d e s d e c r e m e n t , i n c r e m e n t e t o n C r e a t e * / }

(99)

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

(100)

7 . 4

Sauvegarde de l'état de l'activité

p u b l i c c l a s s M a i n A c t i v i t y e x t e n d s A c t i v i t y { / * . . . * / @ O v e r r i d e p r o t e c t e d v o i d o n S a v e I n s t a n c e S t a t e ( B u n d l e o u t S t a t e ) { s u p e r . o n S a v e I n s t a n c e S t a t e ( o u t S t a t e ) ; o u t S t a t e . p u t I n t ( " c o u n t e r " , c o u n t e r ) ; } @ O v e r r i d e p r o t e c t e d v o i d o n R e s t o r e I n s t a n c e S t a t e ( B u n d l e s a v e d I n s t a n c e S t a t e ) { s u p e r . o n R e s t o r e I n s t a n c e S t a t e ( s a v e d I n s t a n c e S t a t e ) ; c o u n t e r = s a v e d I n s t a n c e S t a t e . g e t I n t ( " c o u n t e r " ) ; u p d a t e T e x t V i e w ( ) ; } }

(101)

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 >

(102)
(103)
(104)
(105)

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

Références

Documents relatifs

Keywords : Monetary Policy, Macroprudential Policy, News Shocks, Durable Goods, Sectoral Comovement, Exchange Rate Fluctuations, Labour Market Adjustments, Panel Data Estimation,

Une première manière de regretter cette dépolitisation consiste à la rapprocher des difficultés actuelles des enseignants à former les élèves au politique, au sens de

1 LES RÉFLEXIONS sur le corps sont dans l’air du temps. Le corps s’avère particulièrement intéressant du fait de sa dualité : à la fois réalité biologique et production

La plupart des parents attachés à cette notion de lieu de naissance commun aux frères et sœurs sont eux-mêmes nés dans la maternité Salengro, y ont vu naître leurs cadets puis

L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des

Nous nous inscrivons dans cette tradition pour marquer une certaine distinc- tion entre la morale qui fait référence aux normes morales qui balisent l’agir éthique dans un

Section 3 provides a general matrix containing all the functionalities which can be expected of a data quality management tool i.e., all criteria which can be taken into account

YLHQQHQW FRPSOpWHU OHV LQIRUPDWLRQV GpOLYUpHV SDU 5% JUkFH j OHXU FDSDFLWp j HIIHFWXHU GHV PHVXUHV HQ VXUIDFH HW SDUWLFXOLqUHPHQW GHV PHVXUHV GH GpIRUPDWLRQV HQ FLVDLOOHPHQW 8Q