2012-11-08 29 views
9

Tôi có một AsyncTask để xử lý một quá trình cập nhật một cách hợp lý dài chạy, và tôi muốn có một hộp thoại tiến bộ cho thấy, theo thứ tự:Làm cách nào để chuyển đổi hộp thoại tiến trình giữa xác định và không xác định?

  1. "Bắt đầu cập nhật" (dành cho ngắn gọn giây)
  2. "Tải bản cập nhật" (không có thanh tiến trình — Tôi không biết cập nhật sẽ lớn như thế nào trước khi tải xuống)
  3. "Lưu dữ liệu cập nhật" (với thanh tiến trình 0-100%)
  4. "Lưu hình ảnh cập nhật" (với Thanh tiến trình 0-100%)
  5. "Cập nhật xong" (cho một br ief giây trước khi hộp thoại biến mất)

Tôi đang gặp sự cố khi chuyển đổi hộp thoại tiến trình giữa xác định (thanh tiến trình hiển thị) và không xác định (không có thanh tiến trình).

Các mã trong AsyncTask tôi sau:

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); 
    } 
} 

tôi đã cố gắng chuyển đổi qua lại quyết tâm với setIndeterminate() — vấn đề ở đây là sự tiến bộ show thoại "NaN" và "0%" ở dưới cùng của hộp thoại mặc dù không còn thanh "" ở chế độ không xác định.

Sau đó, tôi đã thử sử dụng setProgressNumberFormat()setProgressPercentFormat() chỉ để ẩn các số — nhưng không có thứ nào trong số này được hỗ trợ trong Android dưới 3.0.

Sau đó, tôi đã thử sử dụng setProgressStyle() để chuyển đổi giữa STYLE_SPINNER và STYLE_HORIZONTAL — gọi setProgressStyle() trong số onProgressUpdate() dường như khiến ứng dụng của tôi gặp sự cố.

Có cách nào dễ dàng để chuyển đổi hộp thoại tiến trình giữa chế độ xác định và không xác định không?

Trả lời

3

Có thể là một ý tưởng hay khi đóng hộp thoại tiến trình và mở hộp thoại khác, với kiểu khác.

+1

OK, đó dường như làm việc - tôi đã giả định rằng tôi sẽ không thể để tái tạo một ProgressDialog "on the fly", nhưng có vẻ như làm việc tốt cho rằng onProgressUpdate() chạy trên thread UI. Tôi thiết lập một cờ boolean "newDialog" cho mỗi "giai đoạn" mới của bản cập nhật và nếu tôi thấy cờ đó được đặt trong onProgressUpdate() của tôi: bỏ qua hộp thoại cũ; tạo một hộp thoại mới với kiểu đã chọn của tôi (xoay tròn hoặc ngang); hiển thị hộp thoại mới; đặt newDialog trở lại false. Cảm ơn vì tiền hỗ trợ. – George

-1

Bạn có thể thay đổi mã của bạn như thế này:

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); 
    } 
} 
Các vấn đề liên quan