ProgressDialog, созданный из onCreateDialog, останавливает анимацию при втором запуске - PullRequest
6 голосов
/ 29 сентября 2010

Я создаю ProgressDialog в onCreateDialog() примерно так:

protected Dialog onCreateDialog(int id) {
  if (id == DIALOG_PROGRESS_ID)
  {
      ProgressDialog dialog = new ProgressDialog(this);
      dialog.setMessage(getResources().getString(R.string.MyLabel));
      dialog.setCancelable(false);
      dialog.setIndeterminate(true);
      return dialog;
  }
}

Android в своей мудрости (или серьезном отсутствии) решает кэшировать каждое диалоговое окно, созданное с помощью onCreateDialog (). Из-за этого любой последующий вызов showDialog(DIALOG_PROGRESS_ID) приводит к использованию того же экземпляра ProgressDialog, но анимация перестала работать.

Я пытался восстановить неопределенность в onPrepareDialog(), но это ничего не дает. Также нет очевидного метода вызова экземпляра диалога, который будет сбрасывать анимацию.

protected void onPrepareDialog(int id, Dialog dialog)
{
  //This doesn't do anything
  if (id == DIALOG_PROGRESS_ID)
     ((ProgressDialog)dialog).setIndeterminate(true);
  super.onPrepareDialog(id, dialog);
}

РЕДАКТИРОВАТЬ: Но, возможно, есть способ получить сам ProgressBar и начать его анимацию? поэтому я попробовал следующее после того, как задал этот вопрос:

@Override
protected void onPrepareDialog(int id, Dialog dialog)
{
  if (id == DIALOG_PROGRESS_ID)
  {
     ProgressBar p = (ProgressBar) dialog.findViewById(android.R.id.progress);
     if (p.getAnimation() != null)
        p.startAnimation(p.getAnimation());
  }
  super.onPrepareDialog(id, dialog);

}

Но это не сработало либо !

Итак, кто-нибудь знает, есть ли способ перезапустить анимацию на ProgressDialog? Если нет, могу ли я заставить каждый вызов showDialog () вызывать onCreateDialog ()? (на этот второй вопрос ответил @TuomasR, но, подумав, я не думаю, что это очень хорошее решение моей проблемы)

Ответы [ 4 ]

15 голосов
/ 30 ноября 2010

Ха! Понял ... тоже боролся с этим. Но звонит:

removeDialog(DIALOG_PROGRESS_ID)

сразу после

dismissDialog(...)

удаляет его из (предполагаемого) диалогового кэша для Activity и принудительно вызывает onCreateDialog. Создайте новый ProgressDialog в onCreateDialog, и вращатель анимирует каждый раз (по крайней мере для меня).

1 голос
/ 18 июля 2011

Я не люблю удалять диалог, чтобы воссоздать его при следующем показе. Итак, я решаю эту проблему с помощью onCreateDialog и onPrepareDialog:

1) В onCreateDialog я обычно создаю ProgressDialog. 2) В onPrepareDialog я ссылаюсь на индикатор выполнения внутри него и принудительно перезагружаюсь:

@Override
protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
    switch (id){

        .....

        case DIALOG_PROGRESS_ID:
            ProgressBar p = (ProgressBar) dialog.findViewById(android.R.id.progress);
            p.setVisibility(View.GONE);
            p.setVisibility(View.VISIBLE);
        break;
    }
}
0 голосов
/ 30 мая 2012

Вы также можете попробовать.

if (progressDialog != null) {
    progressDialog.dismiss();
    progressDialog = null;
}
0 голосов
/ 29 сентября 2010

Ну, не очень крутой обходной путь - редактировать параметры, а не объявлять int private, как в примерах. Конечно, вы теряете возможность включать onCreateDialog, но вы все равно этого не делаете:

showDialog(++DIALOG_PROGRESS_ID);

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

...