在安卓中以编程方式设置菜单可见性

62

那么,这就是我想知道的。 我如何在Android中以编程方式设置菜单的可见性? 这是我的菜单:

public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
}

public boolean onOptionsItemSelected (MenuItem item){
    switch (item.getItemId()){
        case R.id.menuregistrar:
            break;
        case R.id.menusalir:
            break;
    }
    return true;
}

但是这段代码并不在onCreate方法中,所以我不知道如何在程序中设置一个项目的可见性或隐藏性(在我的情况下,一旦我注册了我的应用程序,我希望“menuregistrar”变为不可见且永久不可见)。

6个回答

160

将此方法放置在您的Activity中。

public boolean onPrepareOptionsMenu(Menu menu)
{
    MenuItem register = menu.findItem(R.id.menuregistrar);      
    if(userRegistered) 
    {           
        register.setVisible(false);
    }
    else
    {
        register.setVisible(true);
    }
    return true;
}

更简短的写法:

MenuItem register = menu.findItem(R.id.menuregistrar);      
register.setVisible(!userRegistered);  //userRegistered is boolean, pointing if the user has registered or not.
return true;

3
两个提示:
  1. 你可以通过编写 register.setVisible(userNotRegistered); 来简化它。
  2. 布尔变量通常为肯定形式,即 if(!userRegistered)if(!UsersNotRegistered) 很难理解:如果用户是“未”-“未注册”吗?
- W.K.S
4
如果用户已经打开了菜单,您可能还希望执行 invalidateOptionsMenu(); 以刷新菜单。 - rundavidrun
有没有一种方法可以将菜单项设置为GONE?因为它占用空间但又看不见... - Federico Alvarez
它对我不起作用。它找不到菜单项。 - Allfarid Morales García

10

我会进一步简化Adil的解决方案,具体如下:

public boolean onPrepareOptionsMenu(Menu menu)
{
    MenuItem registrar = menu.findItem(R.id.menuregistrar);      
    registrar.setVisible(!isRegistered);
    return true;
}

1
很好,但是一些新用户可能会因为匆忙想要尽快解决问题而无法理解,所以我扩展了它以展示实际发生的情况。 :) - Adil Soomro
1
@AdilSoomro,这段代码比你的答案更简单(如果“他们很匆忙”更方便),所以我建议编辑原始答案。 - Stan

6

只需执行一项操作,从此行中获取菜单项的ID:

Menu menu =navigationView.getMenu();

MenuItem nav_dashboard = menu.findItem(R.id.nav_dashboard);

然后按照以下代码行将其可见性设置为您需要的方式:

nav_dashboard.setVisible(true/false);

5

菜单对象具有一个属性,可使用setVisible(boolean)设置菜单项的可见性。

示例:

private Menu menu_change_language;
...

...

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    ...
    ...
    menu_change_language = menu;
    ...
    ...

    return super.onCreateOptionsMenu(menu);
}

使用下面的代码隐藏菜单项:

if(menu_change_language != null){                 
    menu_change_language.findItem(R.id.menu_change_language)
       .setVisible(false);
}

如果您想在某些特定操作后显示菜单,这将非常有用。谢谢。 - Arslan Maqbool
如果您觉得这个答案有用,请投票或推广它。谢谢。 - Hantash Nadeem

4

使用 public boolean onPrepareOptionsMenu (Menu menu) 方法,每次按下菜单按钮时都会调用它,在其中进行相关操作。或者在不同的活动中使用您的 onCreateOptionsMenu() 方法来填充不同的菜单 - 这个方法只被调用一次。

祝好


2
onPrepareOptionsMenu 也会在调用 invalidateOptionsMenu 时被调用,因此它可能会被调用多次。 - javahead76
@javahead76 这个调用仅在 Build.VERSION.SDK_INT >= 11 的情况下才能起作用。 - Sergey Benner

4

如果您想在每次单击菜单时更改onOptionsItemSelected内部的可见性

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   item.setVisible(true);
   return true;
}

或者是菜单中你没有点击的选项

private Menu globalMenuItem;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
   getMenuInflater().inflate(R.menu."menu Xml Name", menu);
   globalMenuItem = menu;
   return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
   globalMenuItem.findItem(R.id."id of the menu item").setVisible(true);
   return true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接