我在将新Drawable设置为ProgressBar时遇到问题。
如果我在onCreate()方法中使用setProgressDrawable(),那么效果很好。但是当我尝试在Handler post回调中调用相同的方法时,它不起作用,并且进度条消失。
有人可以解释这种行为吗?我该如何解决这个问题?
答案 0 :(得分:14)
downloadingBar.setProgress(0);
Drawable progressDrawable = getResources().getDrawable(R.drawable.download_progressbar_pause_bg);
progressDrawable.setBounds(downloadingBar.getProgressDrawable().getBounds());
downloadingBar.setProgressDrawable(progressDrawable);
downloadingBar.setProgress(mCurrentPercent);
答案 1 :(得分:2)
我自己陷入了这个问题,我设法让它发挥作用:)
我使用AsyncTask
来处理后台任务/线程,但这个想法应该与使用Runnable/Handler
相同(尽管AsyncTask
确实感觉更好)。
所以,这就是我做的......把setContentView(R.layout.my_screen);
放在onPostExecute
方法中! (即代替onCreate
方法)
所以代码看起来像这样:
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);
}
}
}
说实话,为什么你需要在setContentView
中调用onPostExecute
我不知道......但这样做意味着你可以为进度条设置自定义样式(并且它们不会消失在你身上!)
答案 2 :(得分:0)
也许你把代码放在一个不是主线程的线程中。 如果您想使用UI,则必须在主线程中执行此操作:)
答案 3 :(得分:0)
我也遇到了同样的问题,但在我的情况下,这是由于使用了Drawable.mutate()方法。当我删除该方法时,它开始工作正常。我也注意到这个问题存在于api level-21(棒棒糖)下面。