Bumped vào vấn đề này bản thân mình và tôi cố gắng làm cho nó làm việc :)
tôi đã sử dụng AsyncTask
để xử lý nền nhiệm vụ/chủ đề, nhưng ý tưởng nên giống như sử dụng Runnable/Handler
(mặc dù AsyncTask
không cảm thấy đẹp hơn).
Vì vậy, đây là những gì tôi đã làm ... đặt setContentView(R.layout.my_screen);
theo phương pháp onPostExecute
! (. Tức là thay vì phương pháp onCreate
)
Vì vậy, mã trông giống như sau:
public class MyScreen extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.my_screen); !!! Don't setContentView here... (see bottom)
new MySpecialTask().execute();
}
private int somethingThatTakesALongTime() {
int result;
// blah blah blah
return result;
}
private void updateTheUiWithResult(int result) {
// Some code that changes the UI
// For exampe:
TextView myTextView = (TextView) findViewById(R.id.result_text);
myTextView.setText("Result is: " + result);
ProgressBar anyProgressBar = (ProgressBar) findViewById(R.id.custom_progressbar);
anyProgressBar.setProgressDrawable(res.getDrawable(R.drawable.progressbar_style));
anyProgressBar.setMax(100);
anyProgressBar.setProgress(result);
}
private class MySpecialTask extends AsyncTask<String, Void, Integer> {
ProgressDialog mProgressDialog;
@Override
protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(MyScreen.this, "", "Calculating...\nPlease wait...", true);
}
@Override
protected Integer doInBackground(String... strings) {
return somethingThatTakesALongTime();
}
@Override
protected void onPostExecute(Integer result) {
mProgressDialog.dismiss();
setContentView(R.layout.my_screen); // setContent view here... then it works...
updateTheUiWithResult(result);
}
}
}
Thành thật mà nói, tại sao bạn cần phải gọi setContentView
trong onPostExecute
Tôi không có ý tưởng ... nhưng làm như vậy có nghĩa là bạn có thể đặt kiểu tùy biến cho các quán bar tiến bộ của bạn (và họ không biến mất vào bạn!)
Thông thường, bạn sửa đổi tiến trình thông qua 'setProgress()'. Thay thế hoàn toàn 'Drawable' là không bình thường, thậm chí còn kỳ quặc hơn để thực hiện nó từ một' Handler' sau khi thanh đã được trả về. Bạn đang cố gắng đạt được điều gì ở đây? – CommonsWare
Tôi muốn thay đổi màu sắc của thanh công cụ khi giá trị đã đạt đến một giá trị nhất định. – Martin
Bạn đã bao giờ tìm thấy câu trả lời chưa? Tôi hiện có cùng một vấn đề (hơn một năm sau). Đây có phải chỉ là một lỗi lớn khó chịu? – Peanut