2010-09-29 51 views
6

onCreateDialog()创建ProgressDialog像这样: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_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回答,但琢磨之后,我不认为这是一个很好的解决了我的问题)

回答

15

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

removeDialog(DIALOG_PROGRESS_ID) 

后立即

dismissDialog(...) 

从该活动的(假定)对话框缓存中删除,并强制onCreateDialog通话。在onCreateDialog中创建一个新的ProgressDialog,并且每次(至少对我来说)微调器都是动画的。

+2

不需要调用'dismissDialog'方法 - 你可以直接调用'removeDialog',因为'如果显示对话框,它将会把它作为清理的一部分去除(来自JavaDoc) – Idolon 2011-04-29 09:05:22

0

好了,不那么酷的解决方法是编辑的参数,而不是像示例中那样声明int是私有的。当然,你失去对onCreateDialog切换的能力,但你似乎并没有那样做呢:

showDialog(++DIALOG_PROGRESS_ID); 

当然,如果所示的对话框无数次,你可以有内存错误。不漂亮,但应该工作。

+0

我在切换实际的代码,我将其编辑到问题的相关位。您提到了一个我没有真正考虑的好点:如果我们每次都强制onCreateDialog()被调用,我们强制Android缓存所有这些对话框。哎呀! Android充满了这些粗糙的边缘。 – ageektrapped 2010-09-29 12:00:49

1

我不喜欢删除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; 
    } 
} 
0

你也可以试试。

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