Androidで戻るボタンを押したときにAlertDialogボックスが閉じないようにしようとしています。私は両方の人気のあるメソッド このスレッドで に従い、System.out.printlnで両方のケースでコードが実行されることがわかります。ただし、戻るボタンstillはダイアログボックスを閉じます。
何が間違っているのでしょうか?最終的には、ダイアログボックスを閉じる戻るボタンが表示されないようにします。これは、アプリの初回実行時に表示される免責事項であり、ユーザーに[同意する]ボタンを押してアプリを続行するための注文。
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;
}
});
[戻る]ボタンが(アクティビティに依存せずに)ダイアログを閉じるのを防ぐには、次のコードのみを実行します。
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;
}
});
DialogFragment
を使用する場合、ダイアログではなく、フラグメントでsetCancelable()
を呼び出す必要があります。
_@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
dialog = new ProgressDialog(getActivity());
dialog.setIndeterminate(true);
dialog.setMessage(...);
setCancelable(false);
return dialog;
}
_
dialog.setCancelable()
を呼び出しても効果はないようです。 DialogFragment
はダイアログのキャンセル可能性の設定に注意を払っていないようです。
setCancelable(false)
を使用します
SampleDialog sampleDialog = SampleDialog.newInstance();
sampleDialog.setCancelable(false);
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName());
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();
}
}
これだけが私のために働いた:
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);
行も追加したため、ダイアログの外側をタップしても閉じられません。