Vous êtes sur la page 1sur 17

GESTION DES MENUS DANS UNE

APPLICATION ANDROID

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

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.

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 sous-
menus, qui peuvent contenir des sous-menus, 4

etc.
Imene Sghaier-Développement d’applications mobiles
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
5
une fonctionnalité.
Imene Sghaier-Développement d’applications mobiles
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
6
pouvez mettre android:checked à true.
Imene Sghaier-Développement d’applications mobiles
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"

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, 10
CharSequence titre)
Imene Sghaier-Développement d’applications mobiles
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 12

Imene Sghaier-Développement d’applications mobiles


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

Imene Sghaier-Développement d’applications mobiles


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). 16

Imene Sghaier-Développement d’applications mobiles


RÉFÉRENCES

 https://openclassrooms.com/courses/creez-des-
applications-pour-android/gestion-des-menus-de-
l-application

17