为什么我的 MenuItem 没有被隐藏?
Why my MenuItem is not being hidden?
我试图隐藏菜单的 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
的变量。在该变量中,我可以看到我试图隐藏的项目没有出现。不过,它出现在应用程序上。
所以,我不明白为什么它没有出现在菜单可见变量上,但它仍然显示在应用程序上。
我错过了什么吗?
提前致谢!
invalidateOptionsMenu();
,再次调用onCreateOptionsMenu
。来自文档
Declare that the options menu has changed, so should be recreated. The
onCreateOptionsMenu(Menu) method will be called the next time it needs
to be displayed.
因此,将您的项目设置为 false 后,您将再次膨胀菜单的布局
我想这不是更好的方法,但我无法使用 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;
}
其中 typeUser
是我从 Login Activity
发送的 String
,我在其中根据已登录的用户设置了一个包。
我还创建了两个 activity_main
布局,更改 XML 上 NavigationView
的菜单选项:
app:menu="@menu/activity_main_admin"
或 app:menu="@menu/activity_main_user"
,取决于布局。
最后,我还创建了一个条件来根据已登录的用户在 MainActivity
的 onCreate
方法上设置布局。这是执行此操作的代码:
if("admin".equals(typeUser)){
setContentView(R.layout.admin);
}else{
setContentView(R.layout.user);
}
我试图隐藏菜单的 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
的变量。在该变量中,我可以看到我试图隐藏的项目没有出现。不过,它出现在应用程序上。
所以,我不明白为什么它没有出现在菜单可见变量上,但它仍然显示在应用程序上。
我错过了什么吗?
提前致谢!
invalidateOptionsMenu();
,再次调用onCreateOptionsMenu
。来自文档
Declare that the options menu has changed, so should be recreated. The onCreateOptionsMenu(Menu) method will be called the next time it needs to be displayed.
因此,将您的项目设置为 false 后,您将再次膨胀菜单的布局
我想这不是更好的方法,但我无法使用 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;
}
其中 typeUser
是我从 Login Activity
发送的 String
,我在其中根据已登录的用户设置了一个包。
我还创建了两个 activity_main
布局,更改 XML 上 NavigationView
的菜单选项:
app:menu="@menu/activity_main_admin"
或 app:menu="@menu/activity_main_user"
,取决于布局。
最后,我还创建了一个条件来根据已登录的用户在 MainActivity
的 onCreate
方法上设置布局。这是执行此操作的代码:
if("admin".equals(typeUser)){
setContentView(R.layout.admin);
}else{
setContentView(R.layout.user);
}