Android:以编程方式将颜色设置为ProgressBar

Android:以编程方式将颜色设置为ProgressBar,android,colors,android-progressbar,layerdrawable,Android,Colors,Android Progressbar,Layerdrawable,我想以编程方式将颜色设置为进度条primaryProgress,secondaryProgress,因为颜色将根据屏幕的背景颜色进行更改 代码: 编辑: **此处的颜色代码仅用于测试。之后,颜色代码将参考其他部分进行相应更新 secondaryColor.setColorFilter((Color.rgb(255, 0, 0)), PorterDuff.Mode.SRC_OVER); primaryColor.setColorFilter((Color.rgb(0, 255, 2

我想以编程方式将颜色设置为进度条primaryProgress,secondaryProgress,因为颜色将根据屏幕的背景颜色进行更改

代码: 编辑: **此处的颜色代码仅用于测试。之后,颜色代码将参考其他部分进行相应更新

    secondaryColor.setColorFilter((Color.rgb(255, 0, 0)), PorterDuff.Mode.SRC_OVER);
    primaryColor.setColorFilter((Color.rgb(0, 255, 213)), PorterDuff.Mode.SRC_OVER);        

    progressDrawable.setDrawableByLayerId(progressDrawable.getId(2), new ClipDrawable(primaryColor, Gravity.LEFT, ClipDrawable.HORIZONTAL));
    progressDrawable.setDrawableByLayerId(progressDrawable.getId(1), new ClipDrawable(secondaryColor, Gravity.LEFT, ClipDrawable.HORIZONTAL));
    ProgressBar1.setProgressDrawable(progressDrawable); 
    ProgressBar1.setProgress(progress);
    ProgressBar1.setSecondaryProgress(secondaryProgress);
问题: 它用红色下划线表示
primanyColor.setColor
,并报告
方法setColor(int,null)对于类型Drawable
未定义


我如何修改上述代码使其正常工作?谢谢

设置可绘制使用的颜色。比如:


您可以做的是首先通过xml使图层列表可绘制(表示背景为第一层,表示次要进度的可绘制为第二层,表示主要进度的另一可绘制为最后一层),然后通过执行以下操作更改代码上的颜色:

public void setPrimaryProgressColor(int colorInstance) {
      if (progressBar.getProgressDrawable() instanceof LayerDrawable) {
        Log.d(mLogTag, "Drawable is a layer drawable");
        LayerDrawable layered = (LayerDrawable) progressBar.getProgressDrawable();
        Drawable circleDrawableExample = layered.getDrawable(<whichever is your index of android.R.id.progress>);
        circleDrawableExample.setColorFilter(colorInstance, PorterDuff.Mode.SRC_IN);
        progressBar.setProgressDrawable(layered);
    } else {
        Log.d(mLogTag, "Fallback in case it's not a LayerDrawable");
        progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
}
public void setPrimaryProgressColor(int-colorInstance){
if(progressBar.getProgressDrawable()实例的LayerDrawable){
Log.d(mLogTag,“可绘制是一个可绘制的层”);
LayerDrawable layered=(LayerDrawable)progressBar.getProgressDrawable();
Drawable circleDrawableExample=layered.getDrawable();
circleDrawableExample.setColorFilter(colorInstance,PorterDuff.Mode.SRC_-IN);
progressBar.setProgressDrawable(分层);
}否则{
Log.d(mLogTag,“如果它不是一个可分层绘制的文件,那么就要回退”);
progressBar.getProgressDrawable().setColorFilter(color,PorterDuff.Mode.SRC_-IN);
}
}

此方法将为您提供最大的灵活性,让您在xml上声明原始drawable的度量值,之后不需要修改其结构,特别是如果您需要特定于xml文件屏幕文件夹,那么只需通过代码修改颜色即可。无需从头开始重新实例化新的ShapeDrawable。

以下是针对min sdk版本21及更高版本通过编程更改ProgressBar颜色的代码

ProgressBar myProgress = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
myProgress.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));

Do
primaryColor.getPaint().setColor(Color.rgb(Color_normal[0]、Color_normal[1]、Color_normal[2])谢谢。我也试过了,结果出现了错误:
getPaint()方法对于Drawable类型是未定义的
@pearmak:ok,然后使用
primaryColor.setColorFilter
methodmake
ShapeDrawable primaryColor
然后@ρѕρєK:非常感谢!它正在工作!如果您在编辑部分发布这样的答案,这将使我的应用程序在使用ViewHolder时崩溃。3件事:-确保您的progressbar不为空-确保您的progressbar使用的是可在其xml布局上绘制的图层列表-确保您的图层列表在xml中标识了每个项目:是的,progressbar不为空。是的,我的progressbar使用了一个可绘制的图层列表。是的,不幸的是它有两个3:(无论如何谢谢。我用
progressBar.setprogresstinlist(ColorStateList.valueOf(Color.RED));
层列表的完美解决方案
drawable。而不是使用layered.getDrawable(),使用layered.finddrawablebayerid(android.R.id.progress),它的错误更少pronemin sdk是21。
public void setPrimaryProgressColor(int colorInstance) {
      if (progressBar.getProgressDrawable() instanceof LayerDrawable) {
        Log.d(mLogTag, "Drawable is a layer drawable");
        LayerDrawable layered = (LayerDrawable) progressBar.getProgressDrawable();
        Drawable circleDrawableExample = layered.getDrawable(<whichever is your index of android.R.id.progress>);
        circleDrawableExample.setColorFilter(colorInstance, PorterDuff.Mode.SRC_IN);
        progressBar.setProgressDrawable(layered);
    } else {
        Log.d(mLogTag, "Fallback in case it's not a LayerDrawable");
        progressBar.getProgressDrawable().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
}
ProgressBar myProgress = (ProgressBar) findViewById(R.id.pb_listProgressBar);
int colorCodeDark = Color.parseColor("#F44336");
myProgress.setIndeterminateTintList(ColorStateList.valueOf(colorCodeDark));