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