防止“后退”按钮关闭对话框

我试图防止一个 AlertDialog 框关闭时,按下后退按钮在 Android。我已经使用了这两种流行的方法 在这条线上,并且使用 System.out.println,我可以看到在这两种情况下代码都会执行。但是,后退按钮 还是会关闭该对话框。

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

65091 次浏览

只需使用 setCancelable()功能:

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

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


虽然任何不想接受你的服务条款的用户都可以按下 home 按钮,但是根据 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;
}
});

为了防止后退按钮关闭一个对话框(不依赖于活动) ,只需要下面的代码:

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

使用 setCancelable(false)

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

只有这招对我管用:

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);行,这样在对话框外面点击也不会导致它被关闭。

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

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


return dialog;
}

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

在 JQueryMobile 中,一个弹出窗口向 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();
}
}

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

例如:

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

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

继续吧:

 ProgressDialog progressDialog = new ProgressDialog(ChatActivity.this);
progressDialog.setMessage("sending video...");
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setCancelable(false);
progressDialog.show();

对于科特林,你可以简单地这样做:

alertDialog.setOnKeyListener(DialogInterface.OnKeyListener { _: DialogInterface?, keyCode: Int, _: KeyEvent? -> keyCode == KeyEvent.KEYCODE_BACK })