2017-10-09 3 views
0

J'essaie de cacher/montrer menuItem mais obtenir NPE. Cela fonctionne dans onPrepareOptionsMenu mais pas dans onCreate. Par défaut, il devrait être invisible.Android MenuItem setVisible

par exemple. dans onCreate mon fragment je voudrais faire quelque chose comme:

if (condition) menuItem.setvisible(true); 

mais ça me fait NPE sur cette ligneMenu.

Activité

@Override 
public boolean onCreateOptionsMenu(Menu menu){ 
    getMenuInflater().inflate(R.menu.inventory_list_toolbar, menu); 
    return true; 
} 

@Override 
protected void onCreate(final Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_start_inventory); 

    mToolbar = findViewById(R.id.inventory_list_toolbar); 
    setSupportActionBar(mToolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 
} 

Fragment:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public void onPrepareOptionsMenu(Menu menu){ 
    super.onPrepareOptionsMenu(menu); 
    menuItem = menu.findItem(R.id.inventory_list_menu_add); 
    menuItem.setVisible(false); 
} 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

Répondre

0
private Menu menu; 

initialiser ensuite comme

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. 
this.menu = menu; 
getMenuInflater().inflate(R.menu.main, menu); 
return true; 
} 

Quand tu veux cacher/montrer l'utilisation du menu

if(menu != null){ 
MenuItem item_up = menu.findItem(R.id.action_up); 
item_up.setVisible(true); 
} 
+0

Veuillez ajouter quelques explications à votre réponse. – ivaigult

+0

Déclare Menu menu; ' Puis l'initialiser comme @Override public boolean onCreateOptionsMenu (menu Menu) { // Inflate le menu; Cela ajoute des éléments à la barre d'action si elle est présente. this.menu = menu; getMenuInflater(). Gonfle (R.menu.main, menu); renvoyer true; } Lorsque vous souhaitez masquer/afficher le menu, utilisez if (menu! = Null) { MenuItem item_up = menu.findItem (R.id.action_up); item_up.setVisible (true); } –

+0

@AkshayChopde: Modifier la réponse avec l'explication, ne pas l'ajouter comme un commentaire –

1

Vous ne pouvez pas masquer le menu de la méthode onCreate car il n'est pas encore gonflé.

Vous devez faire de votre logique onPrepareOptionsMenu méthode:

@Override 
public void onPrepareOptionsMenu(Menu menu) { 

    if (condition) { 
     // do what you want 
     MenuItem menuItem = menu.findItem(R.id.menu_item_id); 
     menuItem.setvisible(true); 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 

Sinon, mettre votre logique onCreateOptionsMenu méthode et appeler invalidateOptionsMenu() lorsque vous avez besoin de rafraîchir quelque chose.

+0

oui, je l'ai fait dans mon fragment et il fonctionne, mais il ne fonctionne pas à partir d'une autre méthode. et comment puis-je faire onPrepareOptionsMenu booléen dans le fragment? – fkvestak

+0

J'ai édité ma réponse, vous ne pouvez pas le faire renvoyer un booléen puisqu'il renvoie le vide. Avez-vous essayé d'appeler 'invalidateOptionsMenu()'? – lubilis

+0

oui, getActivity(). InvalidateOptionsMenu(); partout où je pourrais le mettre, je reçois NPE tout le temps. et dans onPrepare je ne peux rien retourner, il est vide et il est dans le fragment – fkvestak