getColorStateList已被弃用

时间:2015-09-02 17:43:41

标签: android android-theme

我在这里遇到问题。我刚从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变量?提前致谢

5 个答案:

答案 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