41

在长时间运行的操作中,我显示了一个弹出对话框(创建自ProgressDialog以防止其他操作发生)。

我已使用 使其不可取消setCancelable(false),因此无法使用后退按钮将其关闭,但令人惊讶的是,搜索硬件按钮会关闭对话框!

更准确地说,显示了全局搜索应用程序,当我回到我的应用程序时,对话框已被关闭。

知道如何防止对话框被关闭吗?

4

4 回答 4

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:我在某处读到对话框中有更多“漏洞”,即您可以在不点击任何按钮的情况下摆脱它。这显然是一个。有人知道其他人吗?

于 2010-09-19T14:30:01.377 回答
36
setCanceledOnTouchOutside(false);
于 2013-09-05T20:05:52.853 回答
4

mProgressDialog.setCancelable(false);为我工作。

于 2016-02-07T20:45:38.713 回答
1

您必须通过 Activity 的onCreateDialog事件来创建对话框,因为这是它们由 Activity 管理的点,并且它们将在 Activity 恢复时恢复。

用于创建由活动为您管理(保存和恢复)的对话框的回调。如果您使用showDialog(int),则活动将第一次调用此方法,然后将其挂起。通过此方法创建的任何对话框都将自动为您保存和恢复,包括它是否正在显示。如果您希望 Activity 为您管理保存和恢复对话框,则应覆盖此方法并处理传递给 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);
 }
}
于 2010-03-23T18:22:52.223 回答