Android 从onCreateDialog创建的ProgressDialog在第二次运行时停止设置动画

Android 从onCreateDialog创建的ProgressDialog在第二次运行时停止设置动画,android,progressdialog,Android,Progressdialog,我在onCreateDialog()中创建了一个ProgressDialog,如下所示: protected Dialog onCreateDialog(int id) { if (id == DIALOG_PROGRESS_ID) { ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage(getResources().getString(R.string.MyLabel));

我在
onCreateDialog()
中创建了一个
ProgressDialog
,如下所示:

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\u PROGRESS\u 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回答,但仔细考虑后,我认为这不是解决我问题的一个很好的方法)

好吧,一个不太酷的解决方法是编辑参数,而不是像示例中那样声明int private。当然,您失去了打开onCreateDialog的能力,但您似乎并没有这样做:

showDialog(++DIALOG_PROGRESS_ID);

当然,如果对话框多次显示,可能会出现内存错误。不漂亮,但应该有用。

哈!知道了。。。他也在为此挣扎。但呼吁:

removeDialog(DIALOG_PROGRESS_ID)
紧接着

dismissDialog(...)

将其从活动的(假定的)对话框缓存中删除,并强制调用
onCreateDialog
。在
onCreateDialog
中创建一个新的ProgressDialog,微调器每次都会设置动画(至少对我来说是这样)。

我不想在下次显示时删除Dialog来重新创建它。 因此,我使用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;
    }
}
你也可以试试

if (progressDialog != null) {
    progressDialog.dismiss();
    progressDialog = null;
}

我正在切换实际代码,我将其编辑为问题的相关位。您提出了一个我没有真正考虑的好观点:如果我们每次都强制调用onCreateDialog(),那么我们就会强制Android缓存所有这些对话框。吼叫声Android充满了这些粗糙的边缘。无需调用
dismissDialog
方法-您只需调用
removeDialog
,因为
如果显示对话框,它会将其作为清理的一部分来消除(来自JavaDoc)真正最好的答案