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.
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
android.R.color.some_color
too e.g.: getResources().getColor(android.R.color.holo_blue_bright)
(at least, on API 17) –
Donavon int getMyColor() { ... }
. You can keep the color in a variable if the verbosity is impacting clarity of your code - I wouldn't do it for performance reasons though –
Donavon getResources().getColor(R.color.idname, null);
instead –
Derry ContextCompat
and ResourcesCompat
? If there is no practical difference, it would be less confusing if you removed one of them from your answer. –
Stier 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
Theme
can be passed as null, so just call getColor(R.color.my_color, null)
if you're unsure what theme to pass in. –
Derry 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>
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);
getResources()
in an Activity
or Fragment
? –
Benavidez getResources()
outside of an Activity or Fragment. –
Stier getResources()
is also available as a public API on anything implementing Context and also on Views. –
Donavon Found an easier way that works as well:
Color.parseColor(getString(R.color.idname));
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);
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()
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));
}
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. –
Donavon 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)
);
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))
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)
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))
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)
–
Clos © 2022 - 2024 — McMap. All rights reserved.