如何正确使用setProgressDrawable()?

时间:2010-02-17 13:09:01

标签: android progress-bar

我在将新Drawable设置为ProgressBar时遇到问题。

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

有人可以解释这种行为吗?我该如何解决这个问题?

4 个答案:

答案 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. 设置进度可绘制边界
  3. 设置新的进度可绘制
  4. 设置新进度

答案 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(棒棒糖)下面。