我在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回答,但在思考之后我不认为这是我问题的一个很好的解决方案)
答案 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;
}