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)真正最好的答案