The Resources.getColor(int id)
method has been deprecated.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
What should I do?
Starting from Android Support Library 23,
a new getColor() method has been added to ContextCompat
.
Its description from the official JavaDoc:
Returns a color associated with a particular resource ID Starting in M, the returned color will be styled for the specified Context's theme.
So, just call:
ContextCompat.getColor(context, R.color.your_color);
You can check the ContextCompat.getColor()
source code on GitHub.
tl;dr:
ContextCompat.getColor(context, R.color.my_color)
Explanation:
You will need to use ContextCompat.getColor(), which is part of the Support V4 Library (it will work for all the previous APIs).
ContextCompat.getColor(context, R.color.my_color)
If you don't already use the Support Library, you will need to add the following line to the dependencies
array inside your app build.gradle
(note: it's optional if you already use the appcompat (V7) library):
compile 'com.android.support:support-v4:23.0.0' # or any version above
If you care about themes, the documentation specifies that:
Starting in M, the returned color will be styled for the specified Context's theme
M
, the returned color will be styled for the specified Context's theme."
ContextCompat
class comes from SupportV4. AppcompatV7 works too as it relies on SupportV4. As they say on the Support Library documentation, 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.
. So it makes sense not to put AppcompatV7
in the answer.
I don't want to include the Support library just for getColor, so I'm using something like
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);
}
}
I guess the code should work just fine, and the deprecated getColor
cannot disappear from API < 23.
And this is what I'm using in 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);
In Android Marshmallow many methods are deprecated.
For example, to get color use
ContextCompat.getColor(context, R.color.color_name);
Also to get drawable use
ContextCompat.getDrawable(context, R.drawable.drawble_name);
For all the Kotlin users out there:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
. The variable "it" could be anything, but it needs to be a Context.
it
is in this case the context
, since I use context?.let {
to check if the context
is not null. The function getColor()
only accepts a non-null context. Read more here about let
and how to use it: kotlinlang.org/docs/reference/scope-functions.html#let
In Kotlin, you can do:
ContextCompat.getColor(requireContext(), R.color.stage_hls_fallback_snackbar)
if requireContext() is accessible from where you are calling the function. I was getting an error when trying
ContextCompat.getColor(context, R.color.stage_hls_fallback_snackbar)
in activity used ContextCompat
ContextCompat.getColor(context, R.color.color_name)
in Adaper
private Context context;
context.getResources().getColor()
In Your RecyclerView in 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
}
}
If your current min. API level is 23, you can simply use getColor()
like we are using to get string resources by getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
You can constraint for API Levels below 23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
but to keep it simple, you can do like below as accepted answer:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
From Resources.
From ContextCompat AndroidX.
Use the getColor(Resources, int, Theme)
method of the ResourcesCompat
from the Android Support Library.
int white = ResourcesCompat.getColor(getResources(), R.color.white, null);
I think it reflect better your question than the getColor(Context, int)
of the ContextCompat
since you ask about Resources
. Prior to API level 23, the theme will not be applied and the method calls through to getColor(int)
but you'll not have the deprecated warning. The theme also may be null
.
The best equivalent is using ContextCompat.getColor
and ResourcesCompat.getColor
. I made some extension functions for quick migration:
@ColorInt
fun Context.getColorCompat(@ColorRes colorRes: Int) = ContextCompat.getColor(this, colorRes)
@ColorInt
fun Fragment.getColorCompat(@ColorRes colorRes: Int) = activity!!.getColorCompat(colorRes)
@ColorInt
fun Resources.getColorCompat(@ColorRes colorRes: Int) = ResourcesCompat.getColor(this, colorRes, null)
I got frustrated too. My need was very straightforward. All I wanted was the ARGB color from the resources, so I wrote a simple static method.
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;
}
Success story sharing