Chapitre 4 Controles Gestion Evenements
Chapitre 4 Controles Gestion Evenements
Chapitre 4 Controles Gestion Evenements
GESTION
DES ÉVÉNEMENTS
01/12/2024
PLAN DU CHAPITRE
explicites
Les intents implicites
01/12/202
4
LA GESTION DES
ÉVÈNEMENTS
Deux moyens :
⚫ créer un auditeur d'événements (classe qui implémente une
interface connue) et l'enregistrer auprès du composant (View)
⚫ les View sont elles mêmes auditrices de certains evénements
: (touché de l'écran par exemple). Il suffit donc de spécialiser
la méthode adaptée et lancée lorsque l'événement survient
1°) est classique (Java S E , J ava ME). Les interfaces sont des
interfaces internes à la classe View et de nom OnXXXListener (donc
des interfaces de nom View.OnXXXListener). Cela nécessite
d'implémenter une méthode de nom onXXX(). On enregistre un
auditeur par setOnXXXListener(View.OnXXXListener l)
2°) permet d'écrire directement la gestion de certains événements
01/12/202
4
LA GESTION DES
On va faire É V È N E M Eun
implémenter N Tlistener
S à notre classe, ce qui
veut dire que notre classe sera une classe à l'écoute des
actions qu'on effectuera sur les vues. A chaque fois qu'on
effectuera une action, une méthode qui correspond à cette
action sera appelée, et on définira dans cette méthode ce
qu'il faut faire une fois l'action effectuée
Il existe plusieurs interfaces, une pour chaque type
d'actions, nous allons voir uniquement le clic normal pour
l'instant. Uniquement des méthodes relatives aux cliques
pourront être implémentées.
L'interface utilisée s'appelle View.OnClickListener et
nous oblige à définir la méthode void onClick (View vue).
C'est dans cette méthode qu'on définira la conduite à
adopter en cas de clic. L'argument de type View est la vue
sur laquelle le clic a été effectué. 4
01/12/202
4
LA GESTION DES
ÉVÈNEMENTS
Il existe d'autres interfaces avec d'autres méthodes à implémenter
View.OnLongClickListener pour les longs clics, avec la
méthode :
⚫ boolean onLongClick(View vue)
⚫ elle doit retourner true une fois que l'action associée a été
effectuée.
View.OnKeyListener pour gérer l'appui de touches avec la
méthode :
⚫ boolean onKey (View vue, int codeTouche,
KeyEvent
inforEvent)
⚫ Cette méthode doit retourner true une fois que l'action associée a été
effectuée.
View.OnTouchListener correspond à une simple touche qui
s'effectue sur l'élément. On observe une touche au moment d'un
clique puis au moment du relâchement. Rester appuyé après un clic
est toujours une touche, même si on sort de l'élément. On y associe
la méthode :
⚫ boolean onTouch (View vue, MotionEvent inforEvent ) : Cette
méthode doit retourner true une fois que l'action associée a été effectuée.
01/12/202
4 5
LA GESTION DES
ÉV
Exemple: É Nun
Créer EM E N Td'événements
auditeur S
01/12/202
4
LA GESTION DES
ÉVÉNEMENTS
public class Main extends Activity{
{
private OnClickListener clickListenerBoutons = new OnClickListener()
@Override
public void onClick(View v) {
/* réagir au clic pour les boutons 1 et 2*/}
};
private OnTouchListener touchListenerBouton1 = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
/* réagir au toucher pour le bouton 1*/
return false;}
};
private OnTouchListener
touchListenerBouton3 = new
OnTouchListener() {
@Override
public boolean onTouch(View v,
MotionEvent event) {
/* réagir au toucher pour le bouton 3*/
return false;}
};
public
Buttonvoid
b =onCreate(Bundle
null; savedInstanceState)
Button b2 = null; {
super.onCreate(savedInstanceState);
Button b3 = null; @Override
setContentView(R.layout.main);
b = (Button) findViewById(R.id.boutton);
b.setOnTouchListener(touchListenerBouton1);
b.setOnClickListener(clickListenerBoutons); 9
b2.setOnClickListener(clickListenerBoutons);
b3.setO nTouchListener(touchListenerB outon3);
}}
01/12/202
4
LA GESTION DES
ÉVÉNEMENTS
On peut indiquer dans le fichier .xml de description d'IHM, la
méthode qui sera lancée sous une certaine action sur un
composant graphique
Par exemple, l'attribut android:onClick d'un composant
graphique indique le nom de la méthode qui sera lancée si on
clique sur cette View
Par exemple, dans le fichier de description de l'IHM, on écrit
<Button
android:id="@+id/push
"
...
android:onClick="onCl
ickEmpiler">
</Button>
Dans l'activité chargeant l'IHM contenant ce Button, on pourra
écrire :
public void onClickEmpiler(View v){ 10
// traitement lancé lorsque l'utilisateur clique sur le Button
d'id push
01/12/202
4 }
LES
INTENTS
U n intent est une "intention" à faire quelque chose
contenant des informations destinées à un composant
Android. C'est un message asynchrone.
Les activités, services et récepteurs d'informations
utilisent les Intent pour communiquer entre eux.
La navigation entre les écrans peut se faire de deux
façons différentes : soit explicitement, soit
implicitement. Dans les deux cas, l’ordre de changement
d’activité est véhiculé par un objet de type Intent .
U n Intent ne contient pas obligatoirement explicitement
le composant qui va le gérer. Dans ce cas c'est un Intent
implicite.
Si l'Intent indique explicitement la classe du
composant qui va le gérer c'est un Intent explicite
U n événement est une sous classe de 11
android.content.Intent
01/12/202
4
LES
INTENTS
Les Intents permettent de gérer l'envoi et la réception
de messages afin de faire coopérer les applications.
Le but des Intents est de déléguer une action à un
autre composant, une autre application ou une autre
activité de l'application courante.
U n objet Intent contient les information
(champs) suivantes:
⚫ le nom du composant ciblé (facultatif)
⚫ l'action à réaliser, sous forme de chaine de
caractères
⚫ les données: contenu M I M E et U R I
⚫ des données supplémentaires (extra) sous forme de
paires clef/valeur
⚫ une catégorie pour cibler un type d'application 12
⚫ des drapeaux (informations supplémentaires)
01/12/202
4
LES
INTENTS
La façon dont sont renseignés ces champs
13
01/12/202
4
LES
INTENTS
À l'opposé des intents explicites se trouvent les intents «
implicites ». Dans ce cas, on ne connaît pas de manière précise le
destinataire de l'intent, c'est pourquoi on va s'appliquer à
renseigner d'autres champs pour laisser Android déterminer
qui est capable de réceptionner cet intent. Il faut au moins
fournir deux informations essentielles :
⚫ Une action : ce qu'on désire que le destinataire fasse.
⚫ U n ensemble de données : sur quelles données le destinataire doit
effectuer son action.
Il existe aussi d'autres informations, pas forcément
obligatoires,
mais qui ont aussi leur utilité propre le moment venu :
⚫ La catégorie : permet d'apporter des informations supplémentaires
sur l'action à exécuter et le type de composant qui devra gérer
l'intent.
⚫ Le type : pour indiquer quel est le type des données incluses.
Normalement ce type est contenu dans les données, mais en
précisant cet attribut vous pouvez désactiver cette vérification
automatique et imposer un type particulier.
⚫ Les extras : pour ajouter du contenu à vos intents afin de les
faire circuler entre les composants. 14
⚫ Les flags : permettent de modifier le comportement de l'intent.
01/12/202
4
LES
INTENTS
L’action d’un intent est une chaîne de caractères
qui symbolise le traitement à déclencher.
De nombreuses constantes sont définies dans le
SDK
pour les actions nativement disponibles comme:
⚫ Intent .ACTION_WEB_SEARCH pour demander de
réaliser une recherche sur Internet
⚫ Intent .ACTION_CALL pour passer un appel
téléphonique.
Les données détaillent l’action de l’Intent dont
elle
dépend directement. Elles peuvent être d’ailleurs nulle,
certaines actions n’appelant pas forcément à devoir
être précisées. Pour illustration, dans
l’exemple A C T I O N _ C A L L , la donnée sera le 15
numéro de téléphone à composer.
La donné est couplée avec un autre attribut qui est le
01/12/202
4
LES
INTENTS
16
01/12/202
4
INTENTS EXPLICITES
Pour passer d'une activité courante à une nouvelle activité, il
faut écrire le code :
01/12/202
4
L’ENCHAINEMENT D E S E C R A N S AV E C
IND
T EENST S E X P L I C I T E S
Si on veut un résultat en retour de la nouvelle activity on
utilisera la méthode
⚫ void startActivityForResult(Intent intent, int requestCode),
⚫ requestCode un code passé qui permet d'identifier de
manière unique un intent.
Quand l'activité appelée s'arrêtera, la première méthode
de callback appelée dans l'activité précédente sera
void onActivityResult(int requestCd, int resultCd,
Intent data)
On retrouve requestCode, qui sera le même code que
celui passé dans le startActivityForResult et qui permet
de repérer quel intent a provoqué l'appel de l'activité dont
le cycle vient de s'interrompre. resultCode est quant à lui
un code renvoyé par l'activité qui indique comment elle
s'est terminée (typiquement Activity.RESULT_OK si
l'activité s'est terminée normalement,
ou Activity.RESULT_CANCELED s'il y a eu un problème 18
ou
qu'aucun code de retour n'a été précisé). Enfin, intent est un
intent qui contient éventuellement des données. 01/12/202
L’ENCHAINEMENT D E S E C R A N S AV E C
DES INTENTS EXPLICITES
En fait cet Intent est envoyé à l'environnement
d'exécution. Celui ci le redirige vers l'activité concernée
19
01/12/202
4
L’ENCHAINEMENT D E S E C R A N S AV E C
DES INTENTS EXPLICITES
Le premier argument du constructeur de l'Intent doit
être le Context de l’application. Si l'appel est fait dans
une activity MonActivity, this est souvent utilisé et
convient car Activity dérive de Context
On utilise souvent MonActivity.this quand on est
dans un listener d'événement. Mais, la méthode
getApplicationContext() est la plus pratique et la plus
sûre si l'objet manipulant l'Intent n'hériste pas
de Context.
S'il s'agit de passer la main à une autre application,
on donne au constructeur de l'Intent les données et
l'URI (uniform ressource identifier) cible: l'OS est
chargé de trouver une application pouvant répondre
à l'Intent. 20
01/12/202
4
L’ENCHAINEMENT D E S E C R A N S AV E C
DES INTENTS EXPLICITES
valeur.
Pour insérer un extra, il suffit d'utiliser la
21
01/12/202
4
L’ENCHAINEMENT DE S E C RA N S
AV E C D E S I N T E N T S E X P L I C I T E S
Les Intent servent parfois d'enveloppes pour passer
des informations d'une Activity à une autre. On
utilise pour cela
⚫ Exemple
01/12/202
4
L’ENCHAINEMENT D E S E C R A N S AV E C D E S
INTENTS
EXPLICITES
pas
d'extra associé à nomEntrée dans l'Intent
On récupère l'information de la manière suivante:
01/12/202
4
L E S INTENTS
IMPLICITES
La syntaxe d'un U R I peut être analysée de la manière suivante (les
parties entre accolades {} sont optionnelles) :
<schéma> : <information> { ? <requête> } { # <fragment> }
Le schéma décrit quelle est la nature de l'information. S'il s'agit
d'un numéro de téléphone, alors le schéma sera tel, s'il s'agit d'un
site internet, alors le schéma sera http, etc.
L'information est la donnée en tant que telle. Cette information
respecte elle aussi une syntaxe, mais qui dépend du schéma cette fois-
ci. Ainsi, pour un numéro de téléphone, vous pouvez vous contenter
d'insérer le numéro tel:0606060606, mais pour des coordonnées G P S
il faudra séparer la latitude de la longitude à l'aide d'une
virgule geo:123.456789,-12.345678. Pour un site internet, il s'agit d'un
chemin hiérarchique.
La requête permet de fournir une précision par rapport à
l'information.
Le fragment permet enfin d’accéder à une sous-partie de l'information.
Pour créer un objet U R I , c'est simple, il suffit d'utiliser la méthode
statique Uri Uri.parse(String uri);
Par exemple, pour envoyer un S M S à une personne, on utilisera
l'URI :
Uri sms = Uri.parse("sms:0606060606");
25
On peut aussi indiquer plusieurs destinataires et un corps pour ce
message : Uri.parse("sms:0606060606,0606060607?body=Salut
%20lesamies")
01/12/202
4;
L E S INTENTS
IMPLICITES
Le M I M E est un identifiant pour les formats de fichier.
Par exemple, il existe un type M I M E text. Si une donnée
est accompagnée du type M I M E text, alors les données
sont du texte. On trouve aussi audioet video par exemple.
Il est ensuite possible de préciser un sous-type afin
d'affiner les informations sur les données, par
exemple audio/mp3 et audio/wav sont deux types M I M E qui
indiquent que les données sont sonores, mais aussi de quelle
manière elles sont encodées.
Les types M I M E que nous venons de voir son standards, c'est-
à-dire qu'il y a une organisation qui les a reconnus comme
étant légitimes. Mais si vous vouliez créer vos propres types
M I M E ? Vous n'allez pas demander à l'organisation de les
valider, ils ne seront pas d'accord avec vous. C'est pourquoi il
existe une petite syntaxe à respecter pour les types
personnalisés : vnd.votre_package.le_type, ce qui peut donner
par exemple vnd.sdz.chapitreTrois.contact_telephonique
26
types M I M E sur https://fr.wikipedia.org/wiki/Type_MIME
01/12/202
4
L E S INTENTS IMPLICITES-
ACTIONS
Liste des actions standard que les intentions peuvent utiliser pour les
activités de lancement (généralement par le biais startActivity
(intention).
⚫ ACTION_MAIN
⚫ ACTION_VIEW
⚫ ACTION_ATTACH_DATA
⚫ ACTION_EDIT
⚫ ACTION_PICK
⚫ AC T IO N _ C H O O S E R
⚫ AC T ION _ GE T _ C ON T E N T
⚫ ACTION DIAL
⚫ ACTION_ANSWER
⚫ ACTION_INSERT
⚫ AC T ION _ D E L E T E
27
⚫ AC T ION _ R U N
⚫ AC T ION _ S Y N C
01/12/202
LES INTENTS IMPLICITES-
MÉTHODES
D ’ I N VO C AT I O N D ’ I N T E N T S
Button b = (Button)findViewById(R.id.Button01);
b.setOnClickListener(new OnClickListener()
{ public void onClick(View v) {
Uri telnumber = Uri.parse("tel:0248484000");
Intent call = new Intent(Intent.ACTION_DIAL, telnumber);
startActivity(call);
} });
<uses-permission
android:name="android.permission.CALL_PHONE" >
</uses-permission> 29
01/12/202
4
L E S INTENTS IMPLICITES- ENVOIE D E
MAIL
30
01/12/202
4
LES INTENTS IMPLICITES- VOIR TOUS
LES
C O N TA C T S
31
01/12/202
4
LES INTENTS IMPLICITES- VOIR U N
C O N TA C T
PA RT I C U L I E R
32
01/12/202
4
LES INTENTS IMPLICITES- EDITER U N
C O N TA C T
33
01/12/202
4
LESINTENTS IMPLICITES- R E C H E RC H E
GOOGLE
34
01/12/202
4
LES INTENTS IMPLICITES- E N VO I E D’UN
SMS
35
01/12/202
4
LES INTENTS IMPLICITES- AF FI CH ER
PHOTOS
36
01/12/202
4
L E S I N T E N T S I M P L I C I T E S - V O I R PA G E
WEB
String myData = "http://www.youTube.com";
Intent myActivity2 = new
Intent(Intent . ACTION_VIEW,
Uri.parse(myData));
startActivity(myActivity2);
01/12/202
4
LES I N T E N T S I M P L I C I T E S - G E O L O C A L I S AT I O N
PA R
C O O R D O N N É E S LONG / L AT
String geoCode ="geo:41.5020952,-81.6789717";
Intent intent = new Intent(Intent .ACTION_VIEW,
Uri.parse(geoCode));
startActivity(intent);
<uses-permission android:name="
a nd ro i d . p e r m i ssi o n. ACC ES S _ COARSE _ LO C AT I O N " >
</uses-permission>
38
01/12/202
4
LES INTENTS IMPLICITES- L A N C E R
MUSIC
P L AY E R
Intent myActivity2 = new
Intent("android.intent.action.MUSIC_PLAYER");
startActivity(myActivity2);
39
01/12/202
4
LES INTENTS IMPLICITES- E C O U TE R
CHANSON
S U R C A RT E S D
Intent myActivity2 =
new
Intent(android.co
ntent.Intent.ACTI
ON_VIEW);
Uri data = Uri.parse("file:///sdcard/tiratata.mp3");
String type = "audio/mp3";
myActivity2.setDataAndType(data, type);
startActivity(myActivity2);
40
01/12/202
4
LES INTENTS IMPLICITES-
PA R A M E T R E S
SYSTEME
01/12/202
4