Utilisation de 'onPrepareOptionsMenu ()' sur Android 3.0+

Je suis curieux de savoir comment (le cas échéant) onPrepareOptionsMenu(Menu) (et par extension, onPreparePanel(int, View, Menu)) est utilisé sur Android 3.0 + lors du ciblage API 11 ou supérieur.

Ma pensée est la suivante:

Un Activity ActionBar reçoit son contenu de onCreateOptionsMenu(Menu) où vous pouvez soit gonfler une ressource de menu XML, ajouter des éléments directement, ou une combinaison des deux. Tous les fragments de l'activité recevront également cet appel et auront la possibilité de faire de même.

Pour mettre à jour les éléments de la barre peut soit tenir à l'instance Menu ou appeler invalidateOptionsMenu() qui finira par appeler à nouveau onCreateOptionsMenu(Menu).

Ainsi, onPrepareOptionsMenu(Menu) est-il encore là pour supporter les applications héritées qui ne ciblent pas L'API 11 ou plus récente?

L'appel à getActionBar().hide() et getActionBar().show() déclenche-t-il un appel à onPrepareOptionsMenu(Menu) peut-être?

Est-ce que l'ajout ou la suppression d'un fragment déclenche cela?

21
demandé sur Jake Wharton 2011-05-21 10:37:26

2 réponses

D'après mes tests approfondis, il semble étrangement fonctionner exactement comme sur les versions antérieures à 3.0 de la plate-forme, n'étant invoqué que lorsque le menu de débordement est ouvert. Le rappel ne s'est déclenché sur aucun des événements énumérés dans la question initiale.

Un fait peut-être évident mais remarquable: l'ensemble du menu est accessible sur ce rappel, donc la manipulation d'éléments visibles sur la barre d'action, dans le menu de débordement, et / ou cachés est possible.

10
répondu Jake Wharton 2011-05-25 19:16:34

Sice j'ai récemment eu des questions similaires et perplexe sur celui-ci, je voudrais ajouter pour les lecteurs plus tard: Oui, onPrepareOptionsMenu fonctionne toujours. Cependant, vous devriez simplement invoquer l'implémentation standard pour les périphériques Honeycomb (c'est-à-dire if (android.OS.Construire.VERSION.SDK_INT > = 11) retour super.onPrepareOptionsMenu (menu);) et utilisez invalidateOptionsMenu () (via la réflexion, si nécessaire)et oncreateoptionsmenu () à la place, esp. lors de l'utilisation de showAsAction. Sinon, le menu ne sera pas mis à jour avant il est ouvert. Par exemple, si vous ajoutez des entrées lorsqu'un élément est sélectionné, les éléments apparaissent comme par magie dans la barre d'action lorsque le menu est ouvert, pas lorsque l'élément devient sélectionné. Il en va de même pour la désélection et le masquage des éléments de menu.

4
répondu M. Schenk 2011-08-12 10:50:36