Android 如何正确使用setProgressDrawable()?

Android 如何正确使用setProgressDrawable()?,android,progress-bar,Android,Progress Bar,我在为ProgressBar设置新的Drawable时遇到问题 如果在onCreate()方法中使用setProgressDrawable(),效果会很好。但是,当我尝试在处理程序后回调中调用相同的方法时,它不起作用,progressbar不显示 有人能解释一下这种行为吗?如何解决这个问题?也许你把代码放在一个非主线程的线程中。 如果你想使用UI,你必须在主线程中这样做:)我自己遇到了这个问题,我设法让它工作:) 我使用了来处理后台任务/线程,但其思想应该与使用Runnable/Handler相

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

如果在onCreate()方法中使用setProgressDrawable(),效果会很好。但是,当我尝试在处理程序后回调中调用相同的方法时,它不起作用,progressbar不显示


有人能解释一下这种行为吗?如何解决这个问题?

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

我自己遇到了这个问题,我设法让它工作:)

我使用了来处理后台任务/线程,但其思想应该与使用
Runnable/Handler
相同(尽管
AsyncTask
在我看来感觉更好)

所以,这就是我所做的。。。放置
setContentView(R.layout.my_屏幕)
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);
    }
}
}
public class MyScreen扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//setContentView(R.layout.my_屏幕);!!!不要在此处设置ContentView…(参见底部)
新建MySpecialTask().execute();
}
private int something attaches alongtime(){
int结果;
//废话废话
返回结果;
}
私有void updateTheUiWithResult(int结果){
//一些更改UI的代码
//例如:
TextView myTextView=(TextView)findViewById(R.id.result\u text);
setText(“结果为:”+Result);
ProgressBar anyProgressBar=(ProgressBar)findViewById(R.id.custom\u ProgressBar);
anyProgressBar.setProgressDrawable(res.getDrawable(R.drawable.progressbar_样式));
anyProgressBar.setMax(100);
anyProgressBar.setProgress(结果);
}
私有类MySpecialTask扩展了AsyncTask{
进程对话框;
@凌驾
受保护的void onPreExecute(){
mProgressDialog=ProgressDialog.show(MyScreen.this,“,”正在计算…\n请稍候…,true);
}
@凌驾
受保护的整数doInBackground(字符串…字符串){
返回某物AttacheSalongTime();
}
@凌驾
受保护的void onPostExecute(整数结果){
mProgressDialog.disclose();
setContentView(R.layout.my_screen);//在这里设置内容视图……然后它就可以工作了。。。
使用结果更新UI(结果);
}
}
}
老实说,为什么需要在
onPostExecute
中调用
setContentView
,我不知道。。。但这样做意味着您可以为进度条设置自定义样式(并且它们不会在您身上消失!)

  • 首先,您应该将进度重置为零
  • 设置可绘制的进度界限
  • 将新进度设置为可绘制
  • 取得新进展

  • 我也面临同样的问题,但在我的例子中,这是由于使用了Drawable.mutate()方法。当我删除该方法时,它开始正常工作。我还注意到这个问题存在于api级别21(棒棒糖)以下。

    通常,您可以通过
    setProgress()
    修改进度。完全替换
    可绘制的
    是不寻常的,在已经渲染条之后,从
    处理程序
    执行此操作更为奇怪。你想在这里实现什么?当值达到某个值时,我想更改progresbar的颜色。你找到答案了吗?我现在也有同样的问题(一年多以后)。这只是一只讨厌的大虫子吗?它在一根线里。但是我使用了Handler.post(new Runnable(),因此操作将由UI线程处理。更新progressbar值非常有效。(但不是更改可绘制的)这只是我的经验,如果活动中的某些视图类似于对话框(可能progressbar相同)显示一次,您不能再更改它们。例如:您在onCreateDialog方法中创建一个不包含消息的AlertDialog。然后,在onPrepareDialog方法中,您设置消息-->消息将不显示。我记得,这与缓存类似。这是因为
    onPostExecute
    与UI在同一线程中运行,而
    doInBackground
    是在后台线程中运行的,无法直接绘制到UI。它似乎可以工作!(我跳过了边界的事情,因为该方法甚至不存在于
    ProgressBar
    )中。这种黑客行为在任何地方都有记录吗?getDrawable()现在已弃用更新API>>Drawable progressDrawable=ContextCompat.getDrawable(context,R.Drawable.download\u progressbar\u pause\u bg);谢谢,在这个@ThinkDeep上浪费了一些时间我看到了faceicon。这是什么意思?
    downloadingBar.setProgress(0); 
    
    Drawable progressDrawable = getResources().getDrawable(R.drawable.download_progressbar_pause_bg);
    
    progressDrawable.setBounds(downloadingBar.getProgressDrawable().getBounds()); 
    
    downloadingBar.setProgressDrawable(progressDrawable); 
    
    downloadingBar.setProgress(mCurrentPercent);