6

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 实例,但动画已停止工作。

我试图重新设置 indeterminate in 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

4 回答 4

15

哈!明白了……也在为此苦苦挣扎。但是调用:

removeDialog(DIALOG_PROGRESS_ID)

之后立马

dismissDialog(...)

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

于 2010-11-30T10:18:35.893 回答
1

我不喜欢 removeDialog 在下次放映时重新创建它。所以,我通过使用 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;
    }
}
于 2011-07-18T11:40:22.473 回答
1

你也可以试试。

if (progressDialog != null) {
    progressDialog.dismiss();
    progressDialog = null;
}
于 2012-05-30T08:14:25.353 回答
0

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

showDialog(++DIALOG_PROGRESS_ID);

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

于 2010-09-29T11:57:47.010 回答