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?
À 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 .
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é.
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.
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)
// ...
}
Pour Drawable
ContextCompat.getDrawable(getApplicationContext(),R.drawable.back_arrow)
Pour la couleur
ContextCompat.getColor(getApplicationContext(),R.color.red)
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é.
La réponse la plus courte est:
ContextCompat.getColor(context, R.color.colorAccent);
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);
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));
}
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
}
}
Utilisez ceci:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getResources().getColor(id, context.getTheme());
} else {
return context.getResources().getColor(id);
}
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
.
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))
Même si getColor()
est obsolète en Marshmallow, la méthode de remplacementgetColor(int, Theme)
est disponible. Qui peut être utilisé comme alternative à ContextCompat.getColor(context, R.color.your_color);
reportez-vous à this pour plus d'informations.
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;
}
Si vous n'avez pas nécessairement besoin des ressources, utilisez parseColor(String)
:Color.parseColor("#cc0066")
Par ici:
fab.setBackgroundTintList(ColorStateList.valueOf(ContextCompat.getColor(this, R.color.badge_participants_counter_color)));
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).