如何以编程方式检查我的活动菜单是否在特定时刻显示?

Ste*_*nca 7 android menu

Android设备配置更改(例如"将硬键盘滑回")将始终调用PhoneWindow.onConfigurationChanged(),然后调用reopenMenu().这将导致当前正在运行的活动的菜单重新打开,以防它显示.

我在我的onPrepareOptionsMenu()覆盖中实现了对我的菜单的锁定.用户每次想要查看菜单时都必须输入代码.我不希望再次要求用户输入代码,而菜单仍然因为配置更改而仍然处于运行状态.因此,我想知道,有什么方法可以检查当前前景活动的菜单是否已经显示?知道这一点,如果菜单已经启动,我可以绕过询问访问代码.

我的自定义解决方法的实现是用我自己的标志menuShowing,这是我设置onPrepareOptionsMenu和重置onOptionsItemSelectedonKeyDown如果单击后退按钮.

EDIT:屏幕方向配置更改似乎不会触发此行为.然而,硬键盘滑动确实如此.

Ste*_*nca 3

在有人提出更好的“一通”答案之前,这里是我在问题中提到的自定义解决方法实现,在 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,但实现细节超出了这个问题的范围,除非有人感兴趣。