我试图在运行的后台执行任务时隐藏操作栏菜单项一段时间
activity
。
首先在活动的
onPrepareOptionsMenu
方法中,我将 MenuItem
实例作为字段检索。
public void onPrepareOptionsMenu(final Menu menu) {
super.onPrepareOptionsMenu(menu);
// Retrieve and show the contextual settings menu item
mContextualSettings = menu.findItem(R.id.item_menu_contextual_settings);
mContextualSettings.setVisible(true);
}
后来我使用该字段使其不可见并再次可见(通过使用 setVisible 方法)。
我想知道这是否是一个好方法,或者我应该以某种方式使用
invalidateOptionsMenu()
使其再次可见?我会遇到空指针异常吗?
谢谢。
我将 MenuItem 实例作为字段检索。 [...] 我想知道这是否是一个好方法,或者我应该以某种方式使用 invalidateOptionsMenu() 使其再次可见?
这不是推荐的方法来完成您正在尝试的操作。您最好使用
supportInvalidateOptionsMenu()
触发 onPrepareOptionsMenu()
并使用 boolean
字段或方法进行检查,然后直接设置项目的可见性。
我会遇到空指针异常吗?
在最新版本的 Android 中,可以在通过
onPrepareOptionsMenu()
膨胀 Menu
之前调用 onCreateOptionsMenu()
。因此,您应该始终对 menu.findItem()
的结果执行空检查,或者以其他方式防止这种情况(也许通过检查 menu.getSize() > 0
是否存在)。
// instance variable
public Menu option_Menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_container, menu);
option_Menu = menu;
option_Menu.findItem(R.id.skip).setVisible(false);
return super.onCreateOptionsMenu(menu);
}
// when task is completed you can show your menu just by calling this method
public void setMenuVisible(boolean visible, int id) {
if (option_Menu != null) {
option_Menu.findItem(id).setVisible(visible);
}
}
因为
supportInvalidateOptionsMenu
现在是deprecated
。您可以有一个可见性切换字段。调用 invalidateOptionsMenu
触发 onCreateOptionsMenu
,然后切换那里的可见性。
boolean isVisible = false;
public void onPrepareOptionsMenu(final Menu menu) {
super.onPrepareOptionsMenu(menu);
// Retrieve and show the contextual settings menu item
mContextualSettings = menu.findItem(R.id.item_menu_contextual_settings);
mContextualSettings.setVisible(isVisible);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isVisible = toggleVisibility(); // logic that determines the visibility
getActivity().invalidateOptionsMenu()
}
用这个方法
MenuItem menuItem = menu.findItem(R.id.menu_done);
menuItem.setVisible(true); //visible
menuItem.setVisible(false); //gone
return true;`