为什么我的MenuItem没有隐藏?

时间:2016-12-07 12:52:07

标签: android menu menuitem

我试图隐藏MenuItem我的菜单,但没有成功。

这是我现在的代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    getMenuInflater().inflate(R.menu.main_menu, menu);

    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu){

    MenuItem item = menu.findItem(R.id.lastOption);
    item.setVisible(false);

    invalidateOptionsMenu();

    return true;
}

但是当我运行应用程序时它仍会显示该选项。

试图找出这种行为发生的原因,我试图为我的代码设置一些断点,发现menu变量有一个名为mVisibleItems的变量。在那个变量中,我可以看到我试图隐藏的项目没有出现。但它出现在应用程序中。

所以,我无法理解为什么如果菜单上没有显示可见变量,它仍会显示在应用程序上。

我错过了什么吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

invalidateOptionsMenu();,再次致电onCreateOptionsMenu。从文档

  

声明选项菜单已更改,因此应重新创建。该   onCreateOptionsMenu(Menu)方法将在下次需要时调用   待显示。

因此,在将项目设置为false后,您再次夸大菜单布局

答案 1 :(得分:0)

我认为这不是更好的方法,但我不能使用onPrepareOptionsMenu

由于我需要两种类型的菜单,具体取决于已登录的用户(管理员或用户),我最终会为我的应用程序创建两种类型的菜单。一个有一些选项,一个没有普通用户不需要的选项。然后,在onCreateOptionsMenu上,我根据已登录的用户对我需要的菜单进行了充气。

这是代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    if("admin".equals(typeUser)){
        getMenuInflater().inflate(R.menu.activity_main_admin, menu);
    }else{
        getMenuInflater().inflate(R.menu.activity_main_user, menu);
    }

    return true;
}

其中typeUserString我从Login Activity发送的,我在其中根据已登录的用户设置了一个包。

我还创建了两个activity_main布局,更改了XML上NavigationView的菜单选项:

app:menu="@menu/activity_main_admin"app:menu="@menu/activity_main_user",具体取决于布局。

最后,我还创建了一个条件,根据已登录的用户在onCreate MainActivity方法上设置布局。这是执行此操作的代码:

if("admin".equals(typeUser)){
    setContentView(R.layout.admin);
}else{
    setContentView(R.layout.user);
}