Telechargé par free mahdois

chapitre-5-gestion-menus-application-android (1)

publicité
GESTION DES MENUS DANS UNE
APPLICATION ANDROID
1
Imene Sghaier
2017-2018
PLAN DU CHAPITRE
Les menus
 Types de menus sous Android
 Création d’un menu d’options
 Ajouts d’éléments dans un menu d’options
 Manipulation d’un menu en java
 Menu contextuel

2
Imene Sghaier-Développement d’applications mobiles
LES MENUS
Un menu est un endroit privilégié pour placer
certaines fonctions tout en économisant l’espace
dans une fenêtre.
 Tous
les anciens terminaux sous Android
possédaient un bouton physique pour afficher le
menu.
 Cette pratique est devenue un peu plus rare depuis
que les constructeurs essaient au maximum de
dématérialiser les boutons. Mais depuis Android
2.3, il existe un bouton directement dans l'interface
du système d'exploitation, qui permet d'ouvrir un
menu.

3
Imene Sghaier-Développement d’applications mobiles
TYPES DE MENUS SOUS ANDROID

Il existe deux sortes de menu dans Android :
 Le menu d'options, celui qu'on peut ouvrir avec le
bouton Menu sur le téléphone. Si le téléphone est
dépourvu de cette touche, Android fournit un
bouton dans son interface graphique pour y
accéder.
 Les menus contextuels qui sont comme les menus
qui s'ouvrent à l'aide d'un clic droit sous Windows
et Linux ? Eh bien, dans Android ils se déroulent
dès lors qu'on effectue un long clic sur un élément
de l'interface graphique.
 Ces
deux menus peuvent contenir des sousmenus, qui peuvent contenir des sous-menus,
etc.
Imene Sghaier-Développement d’applications mobiles
4
CRÉATION D’UN MENU D’OPTIONS


On peut définir un menu de manière programmatique en Java,
mais la meilleure façon de procéder est en XML.
Tout d'abord, la racine de ce menu est de type <menu> et on
ne peut pas vraiment le personnaliser avec des attributs, ce qui
donne la majorité du temps :
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/androi
d">
<!-- Code -->
</menu>

Ce menu doit être peuplé avec des éléments, et c'est sur ces
éléments que cliquera l'utilisateur pour activer ou désactiver
une fonctionnalité.
Imene Sghaier-Développement d’applications mobiles
5
AJOUTS D’ÉLÉMENTS DANS UN MENU D’OPTIONS

Ces éléments s'appellent en XML des <item> et
peuvent être personnalisés à l'aide de plusieurs
attributs :
android:id, que vous connaissez déjà. Il permet d'identifier
de manière unique un <item>. Autant d'habitude cet
attribut est facultatif, autant cette fois il est vraiment
indispensable.
 android:icon, pour agrémenter votre <item> d'une icône.
 android:title, qui sera son texte dans le menu.
 android:enabled="false« qui permet de désactiver par
défaut un <item>.
 android:checkable auquel vous pouvez mettre true si vous
souhaitez que l'élément puisse être coché
 De plus, si vous souhaitez qu'il soit coché par défaut, vous
pouvez mettre android:checked à true.

Imene Sghaier-Développement d’applications mobiles
6
AJOUTS D’ÉLÉMENTS DANS UN MENU D’OPTIONS
Il peut arriver que plusieurs éléments se ressemblent
beaucoup ou fonctionnent ensemble, c'est pourquoi il
est possible de les regrouper avec <group>.
 Si on veut que tous les éléments du groupe soient
des CheckBox, on peut mettre au groupe
l'attribut android:checkableBehavior="all«
 sachant que les seuls <item> que l'on puisse cocher
sont ceux qui se trouvent dans un sous-menu.
 si on veut qu'ils soient tous des RadioButton, on peut
mettre l'attribut android:checkableBehavior="single"

7
Imene Sghaier-Développement d’applications mobiles
AJOUTS D’ÉLÉMENTS DANS UN MENU D’OPTIONS
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/item1" android:title="Item 1« > </item>
<item android:id="@+id/item2" android:titleCondensed="Item 2"
android:title="Item 2 mais avec un nom assez long quand même">
<menu>
<item android:id="@+id/item3" android:title="Item 2.1" android:checkable="true"/>
<item android:id="@+id/item4" android:title="Item 2.2"/>
</menu> </item>
<item android:id="@+id/item5" android:title="Item 3" android:checkable="true"/>
<item android:id="@+id/item6" android:title="Item 4">
<group android:id="@+id/group1" android:checkableBehavior="all">
<item android:id="@+id/item7" android:title="Item 4.1"></item>
<item android:id="@+id/item8" android:title="Item 4.2"></item> </group>
</item>
<group android:id="@+id/group2" android:enabled="false">
<item android:id="@+id/item9" android:title="Item 5.1"></item>
<item android:id="@+id/item10" android:title="Item 5.2"></item> </group> </menu>
8
Imene Sghaier-Développement d’applications mobiles
MANIPULATION D’UN




MENU EN JAVA
Il va falloir dire à Android qu'il doit parcourir le fichier XML
pour construire le menu.
Pour cela, on va surcharger la méthode boolean
onCreateOptionsMenu (Menu menu) de la classe Activity.
Cette méthode est lancée au moment de la première pression
du bouton qui fait émerger le menu.
Pour parcourir le XML, on va l'inflater:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
//R.menu.menu est l'id de notre menu
inflater.inflate(R.menu.menu, menu);
return true; }
9
Imene Sghaier-Développement d’applications mobiles
MANIPULATION D’UN


MENU EN JAVA
On peut réactiver un menu désactivé par défaut en java à l'aide de la
fonction MenuItem setEnabled (boolean a) (le MenuItemretourné
est celui sur lequel l'opération a été effectuée).
On peut construire un menu en java avec la méthode suivante qui
s'utilise sur un Menu :
MenuItem add (int gId, int oId, int ord, CharSequence titre) avec:
gId est l’id du group du menu s’il n’y a aucun c’est Menu.NONE.
 oId
est l'identifiant unique de l'objet, vous pouvez aussi
mettre Menu.NONE, mais ce n’est pas recommandé.
 ord permet de définir l'ordre dans lequel vous souhaitez le voir apparaître
dans le menu. Par défaut, l'ordre respecté est celui du fichier XML ou de
l'ajout avec la méthode add, mais avec cette méthode vous pouvez
bousculer l'ordre établi pour indiquer celui que vous préférez. Encore une
fois, vous pouvez mettre Menu.NONE.
 titre est le titre de l'item.


De manière identique et avec les mêmes paramètres, on peut
construire un sous-menu avec la méthode suivante :
MenuItem addSubMenu (int groupId, int objectId, int ordre,
CharSequence titre)
Imene Sghaier-Développement d’applications mobiles
10
MANIPULATION D’UN

MENU EN JAVA
L'identifiant d'un <item> permet de déterminer comment il réagit
aux clics au sein de la méthode boolean
onOptionsItemSelected (MenuItem item).
private Menu m = null;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
m = menu;
return true;}
@Override
public boolean onOptionsItemSelected (MenuItem item){
switch(item.getItemId()) {
case R.id.item1:
//faire ce qu’on veut
return true; }
return super.onOptionsItemSelected(item);}
11
Imene Sghaier-Développement d’applications mobiles
MENU CONTEXTUEL




Le menu contextuel est très différent du menu d'options,
puisqu'il n’apparaît pas quand on appuie sur le bouton
d'options, mais plutôt quand on clique sur n'importe quel
Alors, on ne veut peut-être pas que tous les objets aient un
menu contextuel, c'est pourquoi il faut déclarer quels widgets
en possèdent, et cela se fait dans la méthode de la
classe Activity void registerForContextMenu (View v)
Dès que l'utilisateur fera un clic long sur cette vue, un
menu contextuel s'ouvrira (s’il est défini)
Ce menu se définit dans la méthode suivante :
 void onCreateContextMenu (ContextMenu m, View v,
ContextMenu.ContextMenuInfo menuInfo)
 m est le menu à construire, v la vue sur laquelle le menu a
été appelé et menuInfo indique sur quel élément d'un
adaptateur a été appelé le menu, si on se trouve dans une
liste par exemple
Imene Sghaier-Développement d’applications mobiles
12
MENU CONTEXTUEL


Il n'existe pas de méthode du type OnPrepare cette fois-ci, par
conséquent le menu est détruit puis reconstruit à chaque appel.
C'est pourquoi il n'est pas conseillé de conserver le menu dans un
paramètre comme nous l'avions fait pour le menu d'options. Voici un
exemple de construction de menu contextuel de manière
programmatique :
private int final static MENU_DESACTIVER = Menu.FIRST;
private int final static MENU_RETOUR = Menu.FIRST + 1;
@Override
public void onCreateContextMenu(ContextMenu m, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(m, v, menuInfo);
m.add(Menu.NONE, MENU_DESACTIVER, Menu.NONE,
"Supprimer cet élément");
m.add(Menu.NONE, MENU_RETOUR, Menu.NONE,
"Retour"); }
Imene Sghaier-Développement d’applications mobiles
13
MENU CONTEXTUEL
Pour écrire des identifiants facilement, la classe Menu
possède une constante Menu.FIRST qui permet de
désigner le premier élément, puis le deuxième en
incrémentant, etc.
 Avec super.onCreateContextMenu(m, v, menuInfo)
on passe les paramètres à la superclasse pour permettre de
récupérer le ContextMenuInfo dans la méthode qui gère
l'évènementiel des menus contextuels, la méthode boolean
onContextItemSelected (MenuItem item).
 On peut récupérer des informations sur la vue qui a appelé
le menu avec la méthode ContextMenu.ContextMenuInfo
getMenuInfo () de la classe MenuItem.

14
Imene Sghaier-Développement d’applications mobiles
MENU CONTEXTUEL
@Override
public boolean onContextItemSelected(MenuItem
item) {
switch (item.getItemId()) {
case MENU_DESACTIVER:
item.getMenuInfo().targetView.setEnabled(false);
case MENU_RETOUR:
return true;
}
return super.onContextItemSelected(item);
}
15
Imene Sghaier-Développement d’applications mobiles
RÉSUMÉ




La création d'un menu se fait en XML pour tout ce qui est statique
et en Java pour tout ce qui est dynamique.
La déclaration d'un menu se fait obligatoirement avec un
élément menu à la racine du fichier et contiendra des item.
Un menu d'options s'affiche lorsque l'utilisateur clique sur le
bouton de menu de son appareil. Il ne sera affiché que si le fichier
XML représentant votre menu est désérialisé dans la
méthode boolean onCreateOptionsMenu(Menu menu) et que
vous avez donné des actions à chaque item dans la
méthode boolean onOptionsItemSelected(MenuItem item)
Un menu contextuel s'affiche lorsque vous appuyez longtemps sur
un élément il se construit avec
void onCreateContextMenu(ContextMenu menu, View vue,
ContextMenu.ContextMenuInfo menuInfo)

La vue qui a fait appel à ce menu contextuel est récuperée à partir
de la méthode boolean onContextItemSelected(MenuItem
item).
Imene Sghaier-Développement d’applications mobiles
16
RÉFÉRENCES

https://openclassrooms.com/courses/creez-desapplications-pour-android/gestion-des-menus-del-application
17
Téléchargement