Obtenez un MenuItem
pointage sur un tel élément, appelez- setVisible
le pour ajuster sa visibilité, puis appelez invalidateOptionsMenu()
votre activité pour que le menu ActionBar soit ajusté en conséquence.
Mise à jour: A MenuItem
n'est pas une vue régulière qui fait partie de votre mise en page. C'est quelque chose de spécial, complètement différent. Votre code revient null
pour item
et cela provoque le crash. Ce dont vous avez besoin, c'est de faire:
MenuItem item = menu.findItem(R.id.addAction);
Voici la séquence dans laquelle vous devez appeler: premier appel invalidateOptionsMenu()
puis à l'intérieur onCreateOptionsMenu(Menu)
obtenir une référence au MenuItem (en appelant menu.findItem()
) et appeler setVisible()
dessus
MenuItem
peut êtrenull
parce que vous utilisezgetItem
au lieu defindItem
. Nous ne pourrions jamais savoir, sans voir à la fois votre code et votre journal des plantages.onCreateOptionsMenu
, et définissez la visibilité de l'élément à ce point. Ou conservez la référence jusqu'à ce que vous décidiez si elle doit être visible ou non.invalidateOptionsMenu()
, puis à l'intérieuronCreateOptionsMenu(Menu)
obtenir une référence àMenuItem
(en appelantmenu.findItem()
) et appelersetVisible()
dessus. Les réponses de suhas_sm et de P1r4nh4 présentent la bonne approche.Trouvé un addendum à cette question:
Si vous souhaitez modifier la visibilité de vos éléments de menu lors de vos déplacements, il vous suffit de définir une variable membre dans votre activité pour vous souvenir que vous souhaitez masquer le menu et appeler
invalidateOptionsMenu()
et masquer les éléments dans votreonCreateOptionsMenu(...)
méthode substituée .Dans mon exemple, j'ai caché tous les éléments.
la source
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
La documentation indique: "Vous devez retourner true pour que le menu soit affiché; si vous retournez false, il ne sera pas affiché".onPrepareOptionsMenu()
doit être utilisé pour afficher / masquer la logique au lieu deonCreateOptionsMenu()
car il n'est appelé qu'une seule fois, donc inutile si vous souhaitez modifier les éléments de menu après son initialisation. Alors gonflez dans onCreate, mais affichez / cachez dans onPrepare.Oui.
invalidateOptionsMenu()
lorsque vous souhaitez masquer l'option. Cela appelleraonCreateOptionsMenu()
.onCreateOptionsMenu()
, vérifiez le drapeau / la condition et affichez-le ou masquez-le de la manière suivante:la source
invalidateOptionsMenu
lieu deinvalidateOptions
?onCreateOptionsMenu
Vous pouvez appeler cela:
Mise à jour:
Assurez - vous que votre code ne retourne pas
null
pouritem
ou il peut se bloquer l'application.la source
Je cherchais une réponse avec un peu plus de contexte. Maintenant que je l'ai compris, je vais ajouter cette réponse.
Masquer le bouton par défaut dans le menu xml
Par défaut, le bouton de partage sera masqué, comme défini par
android:visible="false"
.main_menu.xml
Afficher le bouton dans le code
Mais le bouton de partage peut éventuellement être affiché en fonction de certaines conditions.
MainActivity.java
Voir également
la source
invalidateOptionsMenu()
pour rafraîchir le menu.n'a pas fonctionné pour moi. J'ai dû explicitement utiliser
onPrepareOptionsMenu
pour définir un élément invisible.Utilisez donc
onCreateOptionsMenu
pour créer le menu etonPrepareOptionsMenu
changer la visibilité, etc.la source
onPrepareOptionsMenu
semble être le bon endroit pour faire ce type d'opération: "Préparer le menu d'options standard de l'écran à afficher. Ceci est appelé juste avant que le menu ne soit affiché, chaque fois qu'il est affiché . Vous pouvez utiliser cette méthode pour activer / désactiver efficacement des éléments ou autrement modifier dynamiquement le contenu. "invalidateOptionsMenu()
pour rafraîchir le menu.Initialement, définissez la visibilité de l'élément de menu sur false dans le fichier de disposition de menu comme suit:
Vous pouvez ensuite simplement définir la visibilité de l'élément de menu sur false dans votre onCreateOptionsMenu () après avoir gonflé le menu.
la source
Essaye ça:
la source
Cela a fonctionné pour moi à la fois de l'activité et du fragment
la source
La réponse P1r4nh4 fonctionne bien, je viens de la simplifier en utilisant un drapeau booléen:
la source
0
et1
n'est pas un "drapeau booléen", c'est pseudo-booléen. en outre, il n'y a aucune raison d'utiliser un booléen réel ici.Selon le site officiel du développeur Android, OnCreateOptionMenu (menu Menu) n'est pas recommandé pour changer les éléments de menu ou les icônes, la visibilité .. etc. au moment de l'exécution.
Comme recommandé Vous pouvez utiliser cette méthode onOptionsItemSelected (élément MenuItem) pour suivre les entrées utilisateur.
Si vous devez modifier des éléments de menu au moment de l' exécution , vous pouvez utiliser onPrepareOptionsMenu (menu Menu) pour les modifier
la source
setVisible(false)
pour l'élément toujours visible, il ne disparaît que lorsque je clique sur les trois points (Menu lui-même). Si j'utiliseinvalidateOptionsMenu()
dansonPrepareOptionsMenu
les éléments se réorganisent immédiatement, mais ils perdent leurs actions (si je clique sur un élément, cela ne fait rien).définissez une valeur sur une variable et appelez invalidateOptionsMenu ();
par exemple
la source
setVisible(false)
pour l'élément toujours visible, il ne disparaît que lorsque je clique sur les trois points (Menu lui-même). Si j'utiliseinvalidateOptionsMenu()
dansonPrepareOptionsMenu
les éléments se réorganisent immédiatement, mais ils perdent leurs actions (si je clique sur un élément, cela ne fait rien).Vous pouvez utiliser
toolbar.getMenu().clear();
pour masquer tous les éléments de menu à la foisla source
En définissant la visibilité de tous les éléments du menu, le menu de la barre d'applications ou le menu de débordement seront masqués automatiquement.
Exemple
...
...
Avant de passer à un autre fragment, utilisez le code ci-dessous:
la source
https://stackoverflow.com/a/21215280/466363 - répondu par Look Alterno et Sufian
.
ActivityCompat.invalidateOptionsMenu () ne rappelle pas onPrepareOptionsMenu (); il suffit de mettre à jour le menu directement.
Mon someMethod () est appelé depuis plusieurs endroits, avant même onCreateOptionsMenu (), donc je dois vérifier mMenu! = Null.
la source
Si vous avez tout fait comme dans les réponses ci-dessus, mais qu'un élément de menu est toujours visible, vérifiez que vous faites référence à la ressource unique . Par exemple, dans onCreateOptionsMenu ou onPrepareOptionsMenu
Ctrl + Cliquez sur R.id.menu_open et vérifiez qu'il n'existe que dans un fichier de menu. Dans le cas où cette ressource est déjà utilisée n'importe où et chargée dans une activité, elle essaiera de s'y cacher.
la source
La meilleure façon de masquer tous les éléments d'un menu avec une seule commande est d'utiliser "group" sur votre menu xml. Ajoutez simplement tous les éléments de menu qui seront dans votre menu de débordement à l'intérieur du même groupe.
Dans cet exemple, nous avons deux éléments de menu qui s'afficheront toujours (élément normal et recherche) et trois éléments de débordement:
Ensuite, sur votre activité (préférable sur onCreateOptionsMenu), utilisez la commande setGroupVisible pour définir la visibilité de tous les éléments de menu sur false ou true.
Si vous souhaitez utiliser cette commande n'importe où ailleurs dans votre activité, assurez-vous d'enregistrer la classe de menu dans local et vérifiez toujours si le menu est nul, car vous pouvez l'exécuter avant createOptionsMenu:
la source
Pour ceux qui utilisent la bibliothèque Appcompat: si vos sous-classes d'activité ActionBarActivity, vous pouvez appeler supportInvalidateOptionsMenu ()
Vu ici: https://stackoverflow.com/a/19649877/1562524
la source
Je pense qu'une meilleure approche serait d'utiliser une variable membre pour le menu, de l'initialiser dans onCreateOptionsMenu () et d'utiliser simplement setVisible () par la suite, sans invalider le menu d'options.
la source
ce code a fonctionné pour moi
la source
Cette approche a fonctionné pour moi:
la source
Vous essayez d'accéder à un élément de menu d'une activité, qui n'a pas accès à la portée. L'appel à rechercher l'élément de menu retournera null , car la vue n'est liée ni à l'activité ni à la mise en page vous appelez.
Les éléments de menu sont liés à des éléments tels que " Barre de navigation " qui à leur tour sont liés à l'activité correspondante.
Initialisez donc ces vues dans activity (), puis accédez aux éléments de menu avec ces vues.
la source
utilisation
invalidateOptionsMenu()
afin d'appeler
onPrepareOptionsMenu(menu: Menu?)
https://developer.android.com/guide/topics/ui/menus
la source
la source