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

时间:2010-09-29 11:49:35

标签: android progressdialog

我在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 个答案:

答案 0 :(得分:15)

哈!得到它......也在努力解决这个问题。但是打电话:

removeDialog(DIALOG_PROGRESS_ID)

后立即

dismissDialog(...)

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

答案 1 :(得分:1)

我不想删除Dialog以在下次显示时重新创建它。 所以,我通过使用onCreateDialog和onPrepareDialog解决了这个问题:

1)在onCreateDialog中,我通常会创建ProgressDialog。 2)在onPrepareDialog中,我引用了其中的progressBar并强制重启:

@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;
    }
}

答案 2 :(得分:0)

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

showDialog(++DIALOG_PROGRESS_ID);

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

答案 3 :(得分:0)

你也可以试试。

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