web-dev-qa-db-fra.com

getColor (int id) déconseillé sur Android 6.0 Marshmallow (API 23)

La méthode Resources.getColor(int id) est obsolète.

@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
    return getColor(id, null);
}

Que devrais-je faire?

667
araks

À partir de Android Bibliothèque de support 23,
une nouvelle méthode getColor () a été ajoutée à ContextCompat.

Sa description de la JavaDoc officielle:

Renvoie une couleur associée à un identifiant de ressource particulier

À partir de M, la couleur renvoyée sera stylée pour le thème du contexte spécifié.


Donc, il suffit d'appeler :

ContextCompat.getColor(context, R.color.your_color);


Vous pouvez vérifier la ContextCompat.getColor()code source sur GitHub .

1288
araks

tl; dr:

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

Explication:

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

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

Si vous n'utilisez pas déjà la bibliothèque de support, vous devrez ajouter la ligne suivante au tableau dependencies de votre application build.gradle (remarque: . Cette option est facultative si vous utilisez déjà la bibliothèque appcompat (V7) ):

compile 'com.Android.support:support-v4:23.0.0' # or any version above

Si vous vous souciez des thèmes, la documentation précise que:

À partir de M, la couleur renvoyée sera stylée pour le thème du contexte spécifié.

481
Melvin

Je ne veux pas inclure la bibliothèque de support uniquement pour getColor, donc j'utilise quelque chose comme

public static int getColorWrapper(Context context, int id) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return context.getColor(id);
    } else {
        //noinspection deprecation
        return context.getResources().getColor(id);
    }
}

Je suppose que le code devrait fonctionner correctement et que getColor (obsolète) _ ne peut pas disparaître de l'API <23.

42
Alex Vang

Dans Android Marshmallow, de nombreuses méthodes sont obsolètes.

Par exemple, pour obtenir des couleurs, utilisez

ContextCompat.getColor(context, R.color.color_name);

Aussi pour obtenir une utilisation dessinable

ContextCompat.getDrawable(context, R.drawable.drawble_name);

Pour tous les utilisateurs de Kotlin:

context?.let {
    val color = ContextCompat.getColor(it, R.color.colorPrimary)
    // ...
}
26
Spipau

Pour Drawable

ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow)

Pour la couleur

 ContextCompat.getColor(getApplicationContext(),R.color.red)
17
Tarun Voora

Vous pouvez utiliser:

if (Build.VERSION.SDK_INT >= 23) {
    return ctx.getColor(R.color.YOURCOLOR);
} else {
    return ctx.getRecources().getColor(R.color.YOURCOLOR);
}

Testé sur Android Marshmallow. Ça a marché.

8
user6765242

La réponse la plus courte est:

ContextCompat.getColor(context, R.color.colorAccent);
7
Samira Ekrami

La méthode getColor () est obsolète dans l'API 23 et a été introduite dans ContextCompat. Avant d'utiliser la méthode getColor () à l'aide de ContextCompat, ajoutez les dépendances dans le script build.gradle, qui est:

dependencies{

    // Other stuff

    compile 'com.Android.support:support-v4:23.0.0'
}

Ensuite, la méthode getColor () peut être utilisée comme suit:

int colorcode = ContextCompat.getColor(getApplicationContext(), R.color.your_color);
7
singh.indolia

Code avec support multi API:

if (Build.VERSION.SDK_INT < 23) {
    view.setBackgroundColor(getResources().getColor(Android.R.color.white));
} else {
    view.setBackgroundColor(getContext().getColor(Android.R.color.white));
}
6
Dmitry

Dans votre RecyclerView à Kotlin

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun bind(t: YourObject, listener: OnItemClickListener.YourObjectListener) = with(itemView) {
        textViewcolor.setTextColor(ContextCompat.getColor(itemView.context, R.color.colorPrimary))
        textViewcolor.text = t.name
    }
}
2
Irvin Joao

Utilisez ceci:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    return context.getResources().getColor(id, context.getTheme());
} else {
    return context.getResources().getColor(id);
}
2
Trinadh Koya

Utilisez la méthode getColor(Resources, int, Theme) de la ResourcesCompat de la bibliothèque de support Android.

int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);

Je pense que cela reflète mieux votre question que la getColor(Context, int) de la ContextCompat puisque vous posez des questions sur Resources. Avant le niveau 23 de l'API, le thème ne serait pas appliqué et la méthode passerait par getColor(int), mais vous ne recevrez pas l'avertissement déconseillé. Le thème peut aussi être null.

2
Pedro

Dans Mono/xamarin.Android, j'avais le même problème et le code suivant fonctionnait parfaitement:

ContextCompat.GetColor (context, Resource.Color.myColor)

Dans mon cas, le contexte est mon activité (Android.Support.V7.App.AppCompatActivity), de sorte qu'un exemple d'utilisation réelle est:

var color = new Android.Graphics.Color(ContextCompat.GetColor(this, Resource.Color.myColor))    
2
Daniele D.

Même si getColor() est obsolète en Marshmallow, la méthode de remplacement
getColor(int, Theme) est disponible. Qui peut être utilisé comme alternative à ContextCompat.getColor(context, R.color.your_color);

reportez-vous à this pour plus d'informations.

1
war_Hero

Je suis aussi frustré. Mon besoin était très simple. Tout ce que je voulais, c'était la couleur ARGB des ressources, alors j'ai écrit une méthode statique simple.

protected static int getARGBColor(Context c, int resId)
        throws Resources.NotFoundException {

    TypedValue color = new TypedValue();
    try {
        c.getResources().getValue(resId, color, true);
    }
    catch (Resources.NotFoundException e) {
        throw(new Resources.NotFoundException(
                  String.format("Failed to find color for resourse id 0x%08x",
                                resId)));
    }
    if (color.type != TYPE_INT_COLOR_ARGB8) {
        throw(new Resources.NotFoundException(
                  String.format(
                      "Resourse id 0x%08x is of type 0x%02d. Expected TYPE_INT_COLOR_ARGB8",
                      resId, color.type))
        );
    }
    return color.data;
}
0
steven smith

Si vous n'avez pas nécessairement besoin des ressources, utilisez parseColor(String) :
Color.parseColor("#cc0066")

0
N. Osil

Par ici:

fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.badge_participants_counter_color)));
0
Joolah

Avec cette méthode mentionnée ci-dessus: getColor (context, R.color.your_color); Comment obtenir le "contexte" n'est pas clair. Cela ne fonctionnera pas en mettant simplement le contexte là dans mon cas, Android studio 3.2. Je trouve que cela fonctionne pour moi. .setTextColor (Color.RED).

0
Harry