La Resources.getColor(int id)
méthode est obsolète.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Que devrais-je faire?
La Resources.getColor(int id)
méthode est obsolète.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Que devrais-je faire?
Réponses:
À partir de la bibliothèque de support Android 23,
une nouvelle méthode getColor () a été ajoutée à ContextCompat
.
Sa description du JavaDoc officiel:
Renvoie une couleur associée à un ID de ressource particulier
À partir de M, la couleur renvoyée sera stylisée pour le thème du contexte spécifié.
Alors, appelez simplement :
ContextCompat.getColor(context, R.color.your_color);
Vous pouvez vérifier le 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 dependencies
tableau dans votre application build.gradle
(remarque: elle 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 stylisée pour le thème du contexte spécifié
M
, la couleur retournée sera stylisée pour le thème du contexte spécifié. "
ContextCompat
classe provient de SupportV4. AppcompatV7 fonctionne également car il repose sur SupportV4. Comme on dit sur la documentation de la bibliothèque de soutien , This library depends on the v4 Support Library. If you are using Ant or Eclipse, make sure you include the v4 Support Library as part of this library's classpath.
. Il est donc logique de ne pas mettre AppcompatV7
la réponse.
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 très bien et que le code obsolète getColor
ne peut pas disparaître de l'API <23.
Et voici ce que j'utilise dans Kotlin:
/**
* Returns a color associated with a particular resource ID.
*
* Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].
*/
@Suppress("DEPRECATION")
@ColorInt
fun getColorHelper(context: Context, @ColorRes id: Int) =
if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);
Dans Android Marshmallow, de nombreuses méthodes sont obsolètes.
Par exemple, pour utiliser la couleur
ContextCompat.getColor(context, R.color.color_name);
Aussi pour obtenir une utilisation tirable
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Pour tous les utilisateurs de Kotlin:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
. La variable "it" peut être n'importe quoi, mais elle doit être un contexte .
it
est dans ce cas le context
, puisque j'utilise context?.let {
pour vérifier si le context
n'est pas nul. La fonction getColor()
accepte uniquement un contexte non nul. En savoir plus ici let
et comment l'utiliser: kotlinlang.org/docs/reference/scope-functions.html#let
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 la getColor(Resources, int, Theme)
méthode de la à ResourcesCompat
partir 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 celle getColor(Context, int)
de la ContextCompat
depuis que vous demandez Resources
. Avant le niveau 23 de l'API, le thème ne sera pas appliqué et la méthode appelle getColor(int)
mais vous n'aurez pas l'avertissement obsolète. Le thème peut également être null
.
Si vous n'avez pas nécessairement besoin des ressources, utilisez parseColor(String)
:
Color.parseColor("#cc0066")
Si votre min. Le niveau d'API est 23, vous pouvez simplement utilisergetColor()
comme nous utilisons pour obtenir des ressources de chaîne en getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
Vous pouvez contraindre pour les niveaux d'API inférieurs à 23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
mais pour rester simple, vous pouvez faire comme ci-dessous la réponse acceptée:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
Des ressources .
Depuis ContextCompat AndroidX .
Je suis frustré aussi. Mon besoin était très simple. Tout ce que je voulais, c'était la couleur ARGB des ressources, j'ai donc é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;
}