it-swarm.com.ru

getColorStateList устарел

У меня проблема здесь. Я только что обновил с 22 до 23 SDK, и предыдущая версия "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? заранее спасибо

18
fkchaud

Объект 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)

Смотрите документацию для более подробного объяснения. Обратите внимание, вам нужно использовать только новую версию API 23 (Android Marshmallow) и выше.

23
anthonycr

В то время как ответ anthonycr работает, гораздо проще написать 

ContextCompat.getColorStateList(context, R.color.haml_Indigo_blue);
41
user1354603

Точно, если вы используете их, вы потеряете все стили. Для более старой версии вы должны динамически создавать 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;
} 
0
Vahe Gharibyan

Вам необходимо использовать ContextCompat.getColor (), который является частью библиотеки Support V4 (поэтому она будет работать для всех предыдущих API).

ContextCompat.getColor(context, R.color.my_color)
0
saravanan