8

Android デバイスの構成の変更 (たとえば、「ハード キーボードを元に戻す」など) は常に を呼び出しPhoneWindow.onConfigurationChanged()、次にそれが を呼び出しますreopenMenu()。これにより、現在実行中のアクティビティのメニューが表示されている場合に、そのメニューが再度開かれます。

onPrepareOptionsMenu()オーバーライドに実装されているメニューにロックがあります。ユーザーは、メニューを表示するたびにコードを入力する必要があります。構成が変更されたためにメニューがまだ表示されている間に、ユーザーがコードを再度入力するように求められることは望ましくありません。したがって、現在のフォアグラウンド アクティビティのメニューが既に表示されているかどうかを確認する方法はありますか? これを知っていれば、メニューが既に表示されている場合は、アクセス コードを要求することを回避できます。

私のカスタム回避策の実装は、戻るボタンがクリックされた場合にmenuShowing設定onPrepareOptionsMenuおよびリセットする独自の flag を使用することです。onOptionsItemSelectedonKeyDown

EDIT:画面の向きの構成を変更しても、この動作はトリガーされないようです。ただし、ハード キーボード スライドは使用できます。

4

2 に答える 2

3

誰かがより良い「ワンコール」の答えを思いつくまで、誰かが同じ機能を必要とする場合に備えて、サムのヒントの助けを借りて、質問で言及したカスタム回避策の実装を次に示します。

@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()実際には anAlertDialogと anの助けを借りて発生しEditTextます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 に答える