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