如何在确定和不确定之间切换进度对话框?

10

我有一个AsyncTask来处理一个相当长时间的更新过程,并且我想要一个进度对话框,按顺序显示:

  1. "开始更新"(持续一秒钟)
  2. "下载更新"(没有进度条 - 在下载之前我不知道更新的大小)
  3. "正在保存更新数据"(带有0-100%的进度条)
  4. "正在保存更新图像"(带有0-100%的进度条)
  5. "更新完成"(在对话框消失之前持续一秒钟)

我遇到了在确定模式(进度条出现)和不确定模式(没有进度条)之间切换进度对话框的问题。

以下是我的AsyncTask中的代码:

private final ProgressDialog progressDialog;

public SynchronizeTask(Activity activity)
{
    progressDialog = new ProgressDialog(activity);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
}

protected void onPreExecute() {
    progressDialog.setMessage("Starting update...");
    progressDialog.setCancelable(false);
    progressDialog.show();
}

...lots of code here...

// all of these are set from doInBackground()
private String progressMsg;
private int progressTotal;
private int progressProgress;

protected void onProgressUpdate(Void... values) {
    progressDialog.setMessage(progressMsg);
    if (progressTotal > 0) {
        progressDialog.setIndeterminate(false);
        progressDialog.setMax(progressTotal);
        progressDialog.setProgress(progressProgress);
    } else {
        progressDialog.setIndeterminate(true);
        progressDialog.setMax(0);
        progressDialog.setProgress(0);
    }
}

我尝试使用setIndeterminate()来切换确定模式,但问题在于进度对话框即使在不确定模式下没有“条形”也会显示“NaN”和“0%”。

然后我尝试使用setProgressNumberFormat()setProgressPercentFormat()来隐藏数字,但这两个方法都不支持Android 3.0以下的版本。

然后我尝试使用setProgressStyle()在STYLE_SPINNER和STYLE_HORIZONTAL之间切换 - 在我的onProgressUpdate()中调用setProgressStyle()似乎导致我的应用程序崩溃。

有没有简单的方法可以在确定模式和不确定模式之间切换进度对话框?

2个回答

3

关闭一个进度对话框并打开另一个,样式不同,可能是个好主意。


1
好的,看起来这个方法可行 - 我原本以为我不能在运行时创建一个ProgressDialog,但是由于onProgressUpdate()在UI线程上运行,所以它似乎可以正常工作。我为每个新的“阶段”更新设置了一个布尔标志“newDialog”,如果我在onProgressUpdate()中看到该标志被设置,我会:关闭旧对话框;使用我选择的样式(旋转或水平)创建一个新对话框;显示新对话框;将newDialog重新设置为false。感谢您的提示。 - George

-1

你可以将你的代码改为这样:

protected void onProgressUpdate(Void... values) {
    progressDialog.setMessage(progressMsg);
    if (progressTotal > 0) {
        progressDialog.setIndeterminate(false);
        progressDialog.setProgressNumberFormat("%1d/%2d");
        progressDialog.setProgressPercentFormat(NumberFormat.getPercentInstance());
        progressDialog.setMax(progressTotal);
        progressDialog.setProgress(progressProgress);
    } else {
        progressDialog.setIndeterminate(true);
        progressDialog.setProgressNumberFormat(null);
        progressDialog.setProgressPercentFormat(null);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接