我在这里遇到问题。我刚从sdk 22更新到23,以及之前版本的" getColorStateList()"已被弃用。
我的代码就像这样
seekBar.setProgressTintList(getResources().getColorStateList(R.color.bar_green));
valorslide.setTextColor(getResources().getColorStateList(R.color.text_green));
旧版" getColorStateList"是
getColorStateList(int id)
新的是
getColorStateList(int id, Resources.Theme theme)
如何使用Theme变量?提前致谢
答案 0 :(得分:41)
虽然anthonycr的答案有效,但只需编写
即可ContextCompat.getColorStateList(context, R.color.haml_indigo_blue);
答案 1 :(得分:24)
Theme对象是用于设置颜色状态列表样式的主题。如果您没有对个人资源使用任何特殊主题,您可以传递null
或当前主题,如下所示:
TextView valorslide; // initialize
SeekBar seekBar; // initialize
Context context = this;
Resources resources = context.getResources();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
seekBar.setProgressTintList(resources.getColorStateList(R.color.bar_green, context.getTheme()));
valorslide.setTextColor(resources.getColorStateList(R.color.text_green, context.getTheme()));
} else {
seekBar.setProgressTintList(resources.getColorStateList(R.color.bar_green));
valorslide.setTextColor(resources.getColorStateList(R.color.text_green));
}
如果你不关心主题,你可以传递null:
getColorStateList(R.color.text_green, null)
See the documentation for more explanation.注意,您只需要在API 23(Android Marshmallow)及更高版本上使用新版本。
答案 2 :(得分:0)
您需要使用ContextCompat.getColor(),它是Support V4库的一部分(因此它适用于所有以前的API)。
ContextCompat.getColor(context, R.color.my_color)
答案 3 :(得分:0)
如果确实使用它们,将会丢失所有样式。对于较旧的版本,应动态创建ColorStateList
,这是保持样式的主要机会。
这适用于所有版本
layout.setColorStateList(buildColorStateList(this,
R.attr.colorPrimaryDark, R.attr.colorPrimary)
);
public ColorStateList buildColorStateList(Context context, @AttrRes int pressedColorAttr, @AttrRes int defaultColorAttr){
int pressedColor = getColorByAttr(context, pressedColorAttr);
int defaultColor = getColorByAttr(context, defaultColorAttr);
return new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_pressed},
new int[]{} // this should be empty to make default color as we want
}, new int[]{
pressedColor,
defaultColor
}
);
}
@ColorInt
public static int getColorByAttr(Context context, @AttrRes int attrColor){
if (context == null || context.getTheme() == null)
return -1;
Resources.Theme theme = context.getTheme();
TypedValue typedValue = new TypedValue();
theme.resolveAttribute(attrColor, typedValue,true);
return typedValue.data;
}
答案 4 :(得分:0)
还有一种更新的方法:
AppCompatResources.getColorStateList(context, R.color.bar_green)
这一直是对ColorStateList缓存的虚假引用,该缓存已膨胀,并且如果未能加载其中,它会退回到ContextCompat.getColorStateList
。