8

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

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

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

EDIT:似乎屏幕方向配置更改不会触发此行为。但是,硬键盘幻灯片可以。

4

2 回答 2

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();
}

getUserInput()AlertDialog实际上是在 an和 anEditText的帮助下发生的,TextWatcher但实施细节超出了这个问题的范围,除非有人感兴趣。

于 2012-05-16T22:29:31.793 回答
0

在我的情况下

  @Override
  public void onPanelClosed(int featureId, Menu menu) {
    showingMenu = false;
    super.onPanelClosed(featureId, menu);
}
于 2015-04-23T09:45:51.707 回答