如何正确使用setProgressDrawable()?

我有问题与设置一个新的Drawable到我的ProgressBar。

如果我在onCreate()方法中使用setProgressDrawable(),那么效果很好。 但是,当我尝试调用Handler后callback中相同的方法它不起作用,进度条消失。

有人可以解释这种行为吗? 我怎么解决这个问题?

Solutions Collecting From Web of "如何正确使用setProgressDrawable()?"

碰到这个问题我自己,我设法得到它的工作:)

我使用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); } } } 

说实话,为什么你需要在onPostExecute调用setContentView我不知道…但这样做意味着你可以为你的进度条设置自定义样式(而且它们不会消失在你身上!)

 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. 设置进度可绘制的界限
  3. 设置新的进度drawable
  4. 设定新的进展

也许你把代码放在一个不是主线程的线程中。 如果你想使用UI,你必须在主线程中做到这一点:)

我也面临同样的问题,但在我的情况下,这是由于使用Drawable.mutate()方法。 当我删除该方法,它开始工作正常。 我也注意到这个问题存在于api level-21(棒棒糖)之下。