Is there any way to get a color-int from a color resource?
I am trying to get the individual red, blue and green components of a color defined in the resource (R.color.myColor) so that I can set the values of three seekbars to a specific level.
You can use:
getResources().getColor(R.color.idname);
Check here on how to define custom colors:
http://sree.cc/google/android/defining-custom-colors-using-xml-in-android
EDIT(1): Since getColor(int id)
is deprecated now, this must be used :
ContextCompat.getColor(context, R.color.your_color);
(added in support library 23)
EDIT(2):
Below code can be used for both pre and post Marshmallow (API 23)
ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme
ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme
Based on the new Android Support Library (and this update), now you should call:
ContextCompat.getColor(context, R.color.name.color);
According to the documentation:
public int getColor (int id)
This method was deprecated in API level 23. Use getColor(int, Theme) instead
It is the same solution for getResources().getColorStateList(id)
:
You have to change it like this:
ContextCompat.getColorStateList(getContext(),id);
EDIT 2019
Regarding ThemeOverlay
use the context of the closest view:
val color = ContextCompat.getColor(
closestView.context,
R.color.name.color
)
So this way you get the right color based on your ThemeOverlay.
Specially needed when in same activity you use different themes, like dark/light theme. If you would like to understand more about Themes and Styles this talk is suggested: Developing Themes with Style
https://i.stack.imgur.com/se7Wr.png
Theme
can be passed as null, so just call getColor(R.color.my_color, null)
if you're unsure what theme to pass in.
Define your color
values/color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- color int as #AARRGGBB (alpha, red, green, blue) -->
<color name="orange">#fff3632b</color>
...
<color name="my_view_color">@color/orange</color>
</resources>
Get the color int and set it
int backgroundColor = ContextCompat.getColor(context, R.color.my_view_color);
// Color backgroundColor = ... (Don't do this. The color is just an int.)
myView.setBackgroundColor(backgroundColor);
See also
How to set background color of a View
Color docs
Color Style Design docs
getResources()
in an Activity
or Fragment
?
getResources()
outside of an Activity or Fragment.
getResources()
is also available as a public API on anything implementing Context and also on Views.
Best Approach
As @sat answer, good approach for getting color is
ResourcesCompat.getColor(getResources(), R.color.your_color, null);
or use below way when you don't have access to getResources()
method.
Context context = getContext(); // like Dialog class
ResourcesCompat.getColor(context.getResources(), R.color.your_color, null);
What i do is
public void someMethod(){
...
ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
}
It is most simple to use anywhere in your app! Even in Util class or any class where you don't have Context or getResource()
Problem (When you don't have Context)
When you don't have Context
access, like a method in your Util
class.
Assume below method without Context.
public void someMethod(){
...
// can't use getResource() without Context.
}
Now you will pass Context
as a parameter in this method and use getResources().
public void someMethod(Context context){
...
context.getResources...
}
So here is a Bonus unique solution by which you can access resources from anywhere like Util class
. Add Resources
to your Application
class or Create one if does not exist.
import android.app.Application;
import android.content.res.Resources;
public class App extends Application {
private static App mInstance;
private static Resources res;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
res = getResources();
}
public static App getInstance() {
return mInstance;
}
public static Resources getResourses() {
return res;
}
}
Add name field to your manifest.xml
<application
tag. (If not added already)
<application
android:name=".App"
...
>
...
</application>
Now you are good to go. Use ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);
anywhere in app.
If your current min. API level is 23, you can simply use getColor()
like we are using for getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()
If you want below API level 23
, just use this:
textView.setTextColor(getResources().getColor(R.color.green));
But note that getResources().getColor()
is deprecated in API Level 23
. In that case replace above with:
textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`
ContextCompat: Helper for accessing features in Context
If You want, you can constraint with SDK_INT
like below:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
Found an easier way that works as well:
Color.parseColor(getString(R.color.idname);
I updated to use ContextCompat.getColor(context, R.color.your_color);
but sometimes (On some devices/Android versions. I'm not sure) that causes a NullPointerExcepiton.
So to make it work on all devices/versions, I fall back on the old way of doing it, in the case of a null pointer.
try {
textView.setTextColor(ContextCompat.getColor(getActivity(), R.color.text_grey_dark));
}
catch(NullPointerException e) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getContext().getColor(R.color.text_grey_dark));
}
else {
textView.setTextColor(getResources().getColor(R.color.text_grey_dark));
}
}
Resources.getColor(int, Theme)
if you can? You should not catch runtime exceptions.
For more information on another use-case that may help surface this question in search results, I wanted to apply alpha to a color defined in my resources.
Using @sat's correct answer:
int alpha = ... // 0-255, calculated based on some business logic
int actionBarBackground = getResources().getColor(R.color.actionBarBackground);
int actionBarBackgroundWithAlpha = Color.argb(
alpha,
Color.red(actionbarBackground),
Color.green(actionbarBackground),
Color.blue(actionbarBackground)
);
Accessing colors from a non-activity class can be difficult. One of the alternatives that I found was using enum
. enum
offers a lot of flexibility.
public enum Colors
{
COLOR0(0x26, 0x32, 0x38), // R, G, B
COLOR1(0xD8, 0x1B, 0x60),
COLOR2(0xFF, 0xFF, 0x72),
COLOR3(0x64, 0xDD, 0x17);
private final int R;
private final int G;
private final int B;
Colors(final int R, final int G, final int B)
{
this.R = R;
this.G = G;
this.B = B;
}
public int getColor()
{
return (R & 0xff) << 16 | (G & 0xff) << 8 | (B & 0xff);
}
public int getR()
{
return R;
}
public int getG()
{
return G;
}
public int getB()
{
return B;
}
}
Most Recent working method:
getColor(R.color.snackBarAction)
ContextCompat.getColor(context, R.color.your_color);
in activity
ContextCompat.getColor(actvityname.this, R.color.your_color);
in fragment
ContextCompat.getColor(getActivity(), R.color.your_color);
for example:
tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))
In kotlin just use this in your activity
R.color.color_name
ex-
mytextView.setTextColor(R.color.red_900)
Should pass resolved color instead of resource id here: getResources().getColor(R.color.Black)
or if you have a function(string text,string color) and you need to pass the Resource Color String you can do as follow
String.valueOf(getResources().getColor(R.color.enurse_link_color))
Success story sharing
android.R.color.some_color
too e.g.:getResources().getColor(android.R.color.holo_blue_bright)
(at least, on API 17)