Предотвратить отклонение ProgressDialog при нажатии на кнопку поиска - PullRequest
41 голосов
/ 23 марта 2010

В длительной операции я показываю всплывающее диалоговое окно (созданное из ProgressDialog для предотвращения выполнения других операций).

Я сделал его неотменяемым с помощью setCancelable(false), поэтому я не могу закрыть его с помощью кнопки "Назад", но, как ни удивительно, кнопка поиска оборудования закрывает диалоговое окно!

Точнее, отображается приложение глобального поиска, и когда я возвращаюсь к своему приложению, диалоговое окно было закрыто.

Есть идеи, как предотвратить закрытие диалога?

Ответы [ 4 ]

45 голосов
/ 19 сентября 2010

Это работает (обратите внимание, я положил его на построитель диалогов):

.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: я где-то читал, что в диалоге есть больше «дыр», то есть вы можете избавиться от него, не нажимая на кнопки. Это был видимо один. Кто-нибудь знает о других?

35 голосов
/ 06 сентября 2013
setCanceledOnTouchOutside(false);
4 голосов
/ 07 февраля 2016

mProgressDialog.setCancelable(false); работал для меня.

1 голос
/ 23 марта 2010

Вы должны создать свои диалоговые окна с помощью события onCreateDialog действия, поскольку именно в этом месте они управляются действием, и они будут восстановлены после возобновления действия.

Обратный вызов для создания диалогов, которые управляются (сохраняются и восстанавливаются) для вас действием. Если вы используете showDialog(int), действие будет вызывать этот метод в первый раз, а затем будет зависать от него. Любое диалоговое окно, созданное этим методом, будет автоматически сохранено и восстановлено для вас, в том числе отображается ли оно. Если вы хотите, чтобы действие управляло сохранением и восстановлением диалогов для вас, вы должны переопределить этот метод и обработать все идентификаторы, которые передаются в showDialog (int). Если вы хотите подготовить свой диалог до его показа, переопределите 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);
 }
}
...