web-dev-qa-db-ja.com

戻るボタンでダイアログボックスが閉じないようにします

Androidで戻るボタンを押したときにAlertDialogボックスが閉じないようにしようとしています。私は両方の人気のあるメソッド このスレッドで に従い、System.out.printlnで両方のケースでコードが実行されることがわかります。ただし、戻るボタンstillはダイアログボックスを閉じます。

何が間違っているのでしょうか?最終的には、ダイアログボックスを閉じる戻るボタンが表示されないようにします。これは、アプリの初回実行時に表示される免責事項であり、ユーザーに[同意する]ボタンを押してアプリを続行するための注文。

64
CaptainProg

setCancelable() 機能を使用するだけです:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);

これにより、[戻る]ボタンでダイアログが閉じられなくなりますが、[ネガティブ]ボタンを使用する場合はそのまま残されます。


利用規約に同意したくないユーザーはホームボタンを押すことができますが、Squonkのコメントを踏まえると、ユーザー同意を「取り消す」ことを防ぐための2つの方法があります。 1つは単純な「拒否」ボタンで、もう1つはダイアログの「戻る」ボタンをオーバーライドします。

builder.setNegativeButton("Refuse", new OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {
               finish();
           }
       })
       .setOnKeyListener(new OnKeyListener() {
           @Override
           public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
               if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)
                   finish();
               return false;
           }
       });
153
Sam

[戻る]ボタンが(アクティビティに依存せずに)ダイアログを閉じるのを防ぐには、次のコードのみを実行します。

alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        // Prevent dialog close on back press button
        return keyCode == KeyEvent.KEYCODE_BACK;
    }
});
17
falvojr

DialogFragmentを使用する場合、ダイアログではなく、フラグメントでsetCancelable()を呼び出す必要があります。

_@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    dialog = new ProgressDialog(getActivity());
    dialog.setIndeterminate(true);
    dialog.setMessage(...);
    setCancelable(false);

    return dialog;
}
_

dialog.setCancelable()を呼び出しても効果はないようです。 DialogFragmentはダイアログのキャンセル可能性の設定に注意を払っていないようです。

10
Ognyan

setCancelable(false)を使用します

SampleDialog sampleDialog = SampleDialog.newInstance();
sampleDialog.setCancelable(false);
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName());
1
David

JQuery Mobileでは、ポップアップがURLにハッシュを追加します。次のコードでは、開いたときにポップアップを閉じ、閉じたときにアプリに戻ることができます。カスタムUIフレームワークにも同じロジックを使用できます。

@Override
public void onBackPressed() {

    // check if modal is open #&ui-state=dialog

    if (webView.getVisibility() == View.VISIBLE && webView.getUrl().contains("#&ui-state=dialog")) {
        // don't pass back button action
        if (webView.canGoBack()) {
            webView.goBack();
        }
    } else {
        // pass back button action
        super.onBackPressed();
    }
}
0

これだけが私のために働いた:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(title);
builder.setMessage(content);

/**
 * Make it when the Back button is pressed, the dialog isn't dismissed.
 */
builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            Utilities.makeToast(getContext(), "There is no way back!");
            return true; // Consumed
        }
        else {
            return false; // Not consumed
        }
    }
});

Dialog dialog = builder.create();

/**
 * Make it so touching on the background activity doesn't close the dialog
 */
dialog.setCanceledOnTouchOutside(false);

return dialog;

ご覧のとおり、dialog.setCanceledOnTouchOutside(false);行も追加したため、ダイアログの外側をタップしても閉じられません。

0