Une introduction aux menus Android

Il existe trois types de menus sous Android: Popup, Contextuel et Options.

Chacun a un cas d'utilisation spécifique et un code qui va avec. Pour savoir comment les utiliser, lisez la suite.

Chaque menu doit avoir un fichier XML associé qui définit sa mise en page. Voici les balises associées à l'option de menu:

- Ceci est l'élément conteneur de votre menu (similaire à LinearLayout)

- Ceci indique un élément et est imbriqué à l'intérieur de la balise menu. Sachez qu'un élément d'élément peut contenir un élément pour représenter un sous-menu

- Ceci est utilisé pour signifier une certaine propriété ou fonctionnalité à quelques éléments de menu (état / visibilité IE)

Comme indiqué dans l'extrait de code ci-dessus, chaque élément de menu est associé à divers attributs. Je vais détailler les principaux ici, mais si vous voulez voir ce que vous pouvez ajouter, allez ici.

  • id - Il s'agit d'un identifiant unique pour l'élément dans le menu. Vous pouvez l'utiliser pour voir exactement sur quel élément l'utilisateur a cliqué
  • icon - Si vous souhaitez afficher une icône associée à cet élément de menu
  • title - Texte qui sera affiché dans le menu pour cet élément
  • showAsAction - Cet attribut ne doit être utilisé que lors de l'utilisation d'un menu dans une activité qui utilise une barre d'application (ou comme on l'appelle également, la barre d'actions). Il contrôle quand et comment cet élément doit apparaître en tant qu'action dans la barre d'application. Il existe cinq valeurs: always, never, ifRoom, withText et collapseActionView
android:showAsAction="always|never|ifRoom|withText|collapseActionView" 

J'expliquerai la signification de chacune de ces valeurs dans la section suivante.

De plus, vous devez ajouter la méthode de menu onCreate appropriée à votre activité.

//Options Menu @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.options_menu, menu); return super.onCreateOptionsMenu(menu); } //Context Menu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context, menu); }

Menu d'options

Ce menu se trouve généralement en haut de votre application et vous devez y placer des actions qui affectent l'application dans son ensemble. Il peut s'agir des paramètres de l'application ou d'un champ de recherche.

En utilisant la disposition du menu ci-dessus, nous obtenons le menu d'options suivant:

Comme promis, passons en revue les valeurs qui peuvent être données pour l'attribut showAsAction:

  • toujours - sera toujours affiché dans la barre d'action
  • jamais - ne s'affichera jamais, et sera donc disponible via le menu de débordement
  • ifRoom - seulement s'il y a suffisamment d'espace dans la barre d'action, alors il serait affiché. Gardez à l'esprit que, selon la documentation, il y a une limite au nombre d'icônes que vous pouvez avoir dans la barre d'action.
  • withText - inclura le titre de l'élément dans la barre d'action
  • collapseActionView - si cet élément est associé à une vue d'action, il deviendra réductible (à partir de l'API 14 et plus)

Si nous changeons le dernier élément de notre menu en showAsAction = "never" , nous obtenons ce qui suit:

Image pour publication

Menu contextuel

Ce menu apparaît lorsqu'un utilisateur effectue un clic long sur l'un de vos éléments d'interface utilisateur. Les options de ce menu affectent l'élément d'interface utilisateur sur lequel l'utilisateur a cliqué. Il est courant d'utiliser ce type de menu dans des vues de liste ou de grille, où l'interaction de l'utilisateur avec chaque élément peut conduire à une action spécifique.

Imaginez un scénario où vous avez une application avec une image, et que vous souhaitez présenter à l'utilisateur plusieurs choix lorsqu'il clique sur l'image.

Un menu contextuel peut apparaître de deux manières:

  1. Un menu flottant
  2. Une barre d'action en haut de votre application

Nous ne montrerons que comment utiliser la première option, mais vous pouvez en savoir plus sur la deuxième option ici.

Utilisation du XML suivant:

Et en ajoutant le code suivant à notre activité principale:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TYPE_OF_LAYOUT layout = (TYPE_OF_LAYOUT)findViewById(R.id.main_layout); registerForContextMenu(layout); }

Nous obtiendrons ce qui suit:

Menu contextuel

Un menu contextuel est un type de menu qui affiche des éléments dans une liste verticale. Cette liste est jointe à la vue sur laquelle l'utilisateur a cliqué pour appeler ce menu. Il est important de garder à l'esprit que lorsque vous choisissez un menu contextuel, vous ne voulez pas que le choix de l'utilisateur affecte le contenu précédent sur lequel l'utilisateur a appuyé.

Nous utiliserons la même disposition XML de menu qu'avant, mais nous devrons ajouter le code suivant à notre activité:

void showPopupMenu(View view) { PopupMenu popup = new PopupMenu(this, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.actions, popup.getMenu()); popup.show(); }

Nous obtiendrons le même résultat que la capture d'écran précédente, mais sans que l'utilisateur ait besoin d'effectuer un clic long.

Icônes dans les menus contextuels

Maintenant, je sais pourquoi vous êtes probablement ici: vous voulez savoir comment ajouter des icônes aux menus .

Bien que je vais montrer un exemple de la façon de procéder, il est sage de comprendre qu'il s'agit d'une fonctionnalité qui n'est pas activée pour les menus contextuels et peut provoquer un comportement inattendu. Vous pouvez y parvenir en utilisant la réflexion pour activer un indicateur appelé setForceShowIcon .

//popup is an instance of PopupMenu try { Field[] fields = popup.getClass().getDeclaredFields(); for (Field field : fields) { if ("mPopup".equals(field.getName())) { field.setAccessible(true); Object menuPopupHelper = field.get(popup); Class classPopupHelper = Class.forName(menuPopupHelper .getClass().getName()); Method setForceIcons = classPopupHelper.getMethod( "setForceShowIcon", boolean.class); setForceIcons.invoke(menuPopupHelper, true); break; } } } catch (Throwable e) { e.printStackTrace(); }

Je viens de gratter la surface avec les menus Android, mais j'espère que cela suffit pour vous inciter à creuser plus profondément.