web-dev-qa-db-fra.com

getColorStateList est obsolète

J'ai un problème ici. Je viens de mettre à jour de sdk 22 à 23 et la version précédente de "getColorStateList ()" est obsolète.

Mon code était comme ça

seekBar.setProgressTintList(getResources().getColorStateList(R.color.bar_green));
valorslide.setTextColor(getResources().getColorStateList(R.color.text_green));

L'ancien "getColorStateList" était

getColorStateList(int id)

Et le nouveau est

getColorStateList(int id, Resources.Theme theme)

Comment utiliser la variable thème? Merci d'avance

18
fkchaud

L'objet Thème est le thème utilisé pour styliser la liste d'états de couleurs. Si vous n'utilisez pas de thèmes spéciaux avec des ressources individuelles, vous pouvez transmettre null ou le thème actuel comme suit:

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));
}

Si vous ne vous souciez pas du thème, vous pouvez simplement passer null:

getColorStateList(R.color.text_green, null)

Voir la documentation pour plus d'explications. Remarque, vous devez uniquement utiliser la nouvelle version sur l’API 23 (Android Marshmallow) et les versions ultérieures.

23
anthonycr

Bien que la réponse d’anthonycr fonctionne, il est beaucoup plus compact de simplement écrire 

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

Exactement si vous les utilisez, vous perdrez tous les styles. Pour une version plus ancienne, vous devez créer ColorStateList de manière dynamique, c’est la principale chance de conserver vos styles.

cela fonctionne pour toutes les versions

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

Vous devez utiliser ContextCompat.getColor (), qui fait partie de la bibliothèque Support V4 (pour que cela fonctionne pour toutes les API précédentes).

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