ProgressDialog, созданный из onCreateDialog, останавливает анимацию при втором запуске

Я создаю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, но, подумав, я не думаю, что это очень хорошее решение моей проблемы)

Ответы на вопрос(2)

Я не люблю удалять диалог, чтобы воссоздать его при следующем показе. Итак, я решаю эту проблему с помощью 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;
    }
}
Решение Вопроса

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

removeDialog(DIALOG_PROGRESS_ID)

незамедлительно после

dismissDialog(...)

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

 Idolon29 апр. 2011 г., 11:05
Не нужно звонитьdismissDialog метод - вы можете просто позвонитьremoveDialog, посколькуIf the dialog is showing, it will dismiss it as part of the clean up (из JavaDoc)

Ваш ответ на вопрос