79

我试图阻止在 Android 中按下后退按钮时关闭 AlertDialog 框。我在这个线程中遵循了两种流行的方法,并且使用 System.out.println 我可以看到在这两种情况下代码都会执行。但是,后退按钮仍会关闭对话框。

我可能做错了什么?最终,我试图阻止后退按钮关闭对话框 - 这是第一次运行应用程序时显示的免责声明,我不希望用户有任何选择,只能按下“接受”按钮命令应用程序继续。

4

7 回答 7

182

只需使用以下setCancelable()功能:

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

这可以防止后退按钮关闭对话框,但如果您选择使用它,“否定”按钮会保持不变。


虽然任何不想接受您的服务条款的用户都可以按下主页按钮,但根据 Squonk 的评论,这里还有两种方法可以防止他们“退出”用户协议。一个是简单的“拒绝”按钮,另一个覆盖对话框中的后退按钮:

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;
           }
       });
于 2012-08-27T22:50:13.890 回答
24

为了防止后退按钮关闭一个Dialog(不依赖于Activity),只需以下代码:

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;
    }
});
于 2015-01-23T13:29:09.483 回答
20

使用时,DialogFragment您需要调用setCancelable()片段,而不是对话框:

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

    return dialog;
}

调用dialog.setCancelable()似乎没有效果。似乎DialogFragment没有注意到对话框的可取消性设置。

于 2017-08-31T08:47:23.680 回答
4

采用setCancelable(false)

SampleDialog sampleDialog = SampleDialog.newInstance();
sampleDialog.setCancelable(false);
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName());
于 2016-02-29T17:35:40.213 回答
1

只有这对我有用:

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);线,因此在对话框之外点击也不会导致它被关闭。

于 2016-07-16T12:15:10.760 回答
1

在 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();
    }
}
于 2018-05-17T17:06:04.493 回答
0

添加setCancelable(false)以阻止后退按钮关闭对话框。

例如 :

AlertDialog.Builder builder = AlertDialog.Builder(this)
Dialog dialog = builder.create()
dialog.setCancelable(false)
dialog.setCanceledOnTouchOutside(false)

这将防止用户在按下后退按钮或在对话窗口外触摸时取消对话

于 2020-08-10T11:13:20.783 回答