我试图防止在Android中按下“后退”按钮时关闭AlertDialog框。我已经遵循了该线程中的两个流行方法,并且使用System.out.println可以看到在两种情况下代码都可以执行。但是,后退按钮仍会关闭对话框。
我可能做错了什么?最终,我试图防止后退按钮关闭对话框-这是在应用程序首次运行时显示的免责声明,我不希望用户有任何选择,只能在其中按下“接受”按钮。以便该应用继续运行。
我试图防止在Android中按下“后退”按钮时关闭AlertDialog框。我已经遵循了该线程中的两个流行方法,并且使用System.out.println可以看到在两种情况下代码都可以执行。但是,后退按钮仍会关闭对话框。
我可能做错了什么?最终,我试图防止后退按钮关闭对话框-这是在应用程序首次运行时显示的免责声明,我不希望用户有任何选择,只能在其中按下“接受”按钮。以便该应用继续运行。
Toast
,而是将它们锁定并使用thwHOME
按钮依靠它们出去。
Answers:
只需使用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;
}
});
DialogFragment
,您应该调用setCancelable
它而不是调用它Dialog
本身
为了防止后退按钮关闭对话框(不取决于活动),请使用以下代码:
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;
}
});
WebView
在我的应用程序上加载一个。我必须检查canGoBack()
并关闭对话框,如果它是错误的。
使用时,DialogFragment
您需要调用setCancelable()
片段,而不是对话框:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
dialog = new ProgressDialog(getActivity());
dialog.setIndeterminate(true);
dialog.setMessage(...);
setCancelable(false);
return dialog;
}
通话dialog.setCancelable()
似乎没有效果。似乎DialogFragment
没有注意到对话框的可取消性设置。
只有这对我有用:
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);
一行,因此在对话框外点击不会导致它也被关闭。
在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 = AlertDialog.Builder(this)
Dialog dialog = builder.create()
dialog.setCancelable(false)
dialog.setCanceledOnTouchOutside(false)
这将防止用户在按下后退按钮或触摸对话框窗口外时取消对话框
BACK
按钮,则请确保下次他们启动该应用程序时一次又一次出现您的许可/免责声明对话框,直到他们接受或从设备中删除该应用程序为止。如果您选择使用Sam建议的方法,则必须提供“拒绝”按钮,但是下次他们启动应用程序时重新创建许可/免责声明。