在长时间运行的操作中,我正在显示一个弹出对话框(从ProgressDialog
创建以防止其他操作发生)。
我使用setCancelable(false)
使其无法取消,因此我无法使用后退按钮关闭它,但令人惊讶的是,搜索硬件按钮会取消对话框!
更确切地说,显示全局搜索应用程序,当我回到我的应用程序时,对话框已被解除。
知道如何防止对话被解雇吗?
答案 0 :(得分:45)
这有效(注意我把它放在对话框构建器上):
.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_SEARCH && event.getRepeatCount() == 0) {
return true; // Pretend we processed it
}
return false; // Any other keys are still processed as normal
}
})
也许甚至可以抓住正面和负面按钮,仅处理这些按钮,对任何其他按键都返回true。如果你能想出来就会好奇......
PS:我在某个地方读到了对话框中有更多的“漏洞”,即你可以摆脱它而不用敲击它上面的任何按钮。这显然是一个。有人知道其他人吗?答案 1 :(得分:35)
setCanceledOnTouchOutside(false);
答案 2 :(得分:4)
mProgressDialog.setCancelable(false);
为我工作。
答案 3 :(得分:1)
您必须通过活动的onCreateDialog事件创建对话框,因为这是活动管理的对象,并且在活动恢复时将恢复它们。
回调创建活动管理(保存和恢复)的对话框。如果您使用showDialog(int)
,活动将首次调用此方法,然后挂起。将自动保存并恢复此方法创建的任何对话框,包括是否显示。如果您希望活动为您管理保存和恢复对话框,则应覆盖此方法并处理传递给showDialog(int)的任何ID。如果您希望在显示对话框之前准备好对话框,请覆盖onPrepareDialog(int, Dialog)
。
使用示例:
public class MyClass extends Activity {
// ........ //
static final int DATE_DIALOG_ID = 1;
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
mDay);
}
return null;
}
public void launchSetDate() {
showDialog(DATE_DIALOG_ID);
}
}