当我点击搜索按钮时,如何防止ProgressDialog被关闭?(Android)

42

在一个长时间运行的操作中,我使用ProgressDialog创建了一个弹出对话框来防止其他操作进行。

我使用setCancelable(false)使其不可取消,所以不能使用返回按钮关闭它,但令人惊讶的是,搜索硬件按钮可以关闭对话框!

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

有什么办法可以防止对话框被关闭吗?


覆盖搜索按钮功能怎么样?@Override public boolean onSearchRequested() { return true; } - Jan S.
令人惊讶的是,这并不起作用(至少在2.3上测试过)。即使返回false也不起作用。 - cottonBallPaws
5个回答

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:我在某个地方读到过对话框中存在更多的“漏洞”,即你可以在不点击任何按钮的情况下将其关闭。这显然就是其中之一。有人知道其他漏洞吗?


当我运行这个程序时,我遇到了编译器错误,但是删除@Override并将onKey的声明更改为public boolean onKey(DialogInterface arg0, int arg1, KeyEvent arg2)对我有用 - 谢谢! - Mohamed Hafez
@MohamedHafez 也许你可以更换编译器/IDE,以便检查Java 1.6而不是1.5呢? - parkerfath
@QQQuestions 有任何想法为什么 getRepeatCount() == 0 必须在那里吗? - parkerfath

37
setCanceledOnTouchOutside(false);

4

mProgressDialog.setCancelable(false); 对我有用。


1

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

用于创建由Activity管理(保存和还原)对话框的回调。如果您使用showDialog(int),则Activity将在第一次调用此方法后继续保留它。通过此方法创建的任何对话框都将自动保存和还原,包括它是否正在显示。如果您希望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);
 }
}

我已经尝试过了,但是当我按下搜索按钮时,对话框仍然被关闭了。 - Randy Sugianto 'Yuku'
你回到应用程序时呢? - Pentium10
进度对话框不再存在了 :( - Randy Sugianto 'Yuku'

0
只需要使用这个代码:

progressDialog.setMessage("请稍等..."); progressDialog.setCancelable(false); progressDialog.show();

该代码与编程有关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接