Android设备配置更改(例如"将硬键盘滑回")将始终调用PhoneWindow.onConfigurationChanged(),然后调用reopenMenu().这将导致当前正在运行的活动的菜单重新打开,以防它显示.
我在我的onPrepareOptionsMenu()覆盖中实现了对我的菜单的锁定.用户每次想要查看菜单时都必须输入代码.我不希望再次要求用户输入代码,而菜单仍然因为配置更改而仍然处于运行状态.因此,我想知道,有什么方法可以检查当前前景活动的菜单是否已经显示?知道这一点,如果菜单已经启动,我可以绕过询问访问代码.
我的自定义解决方法的实现是用我自己的标志menuShowing,这是我设置onPrepareOptionsMenu和重置onOptionsItemSelected和onKeyDown如果单击后退按钮.
EDIT:屏幕方向配置更改似乎不会触发此行为.然而,硬键盘滑动确实如此.
在有人提出更好的“一通”答案之前,这里是我在问题中提到的自定义解决方法实现,在 Sam 提示的帮助下,以防有人需要相同的功能:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (showingMenu) {
// The menu button was clicked or the hard keyboard was
// slid open/closed while the menu was already showing
return true;
}
// Otherwise, either the menu was clicked or openOptionsMenu() was called
if (codeEntered) {
// Code was entered and then openOptionsMenu() was called
showingMenu = true;
// Menu will now be shown
return true;
} else {
// The menu button was clicked, ask for code
askForCode();
// Don't show menu yet
return false;
}
}
@Override
public void onOptionsMenuClosed(Menu menu) {
showingMenu = false;
codeEntered = false;
}
private void askForCode() {
codeEntered = getUserInput();
if (codeEntered)
openOptionsMenu();
}
Run Code Online (Sandbox Code Playgroud)
getUserInput()AlertDialog实际上是在 an和 anEditText的帮助下发生的TextWatcher,但实现细节超出了这个问题的范围,除非有人感兴趣。