从颜色资源中获取color-int


447

有没有办法从颜色资源中获取颜色信息?我正在尝试获取资源(R.color.myColor)中定义的颜色的红色,蓝色和绿色各个成分,以便可以将三个搜寻栏的值设置为特定级别。

Answers:


927

您可以使用:

getResources().getColor(R.color.idname);

在此处检查如何定义自定义颜色:

http://sree.cc/google/android/defining-custom-colors-using-xml-in-android

EDIT(1): 由于getColor(int id)现在已弃用,因此必须使用:

ContextCompat.getColor(context, R.color.your_color);

(添加到支持库23中)

编辑(2):

以下代码可用于棉花糖的制作前后(API 23)

ResourcesCompat.getColor(getResources(), R.color.your_color, null); //without theme

ResourcesCompat.getColor(getResources(), R.color.your_color, your_theme); //with theme

7
那么android.R.color.some_color :-(
Blundell 2012年

17
@Blundell嗯,不知道,如果您现在需要它,但这也适用于android.R.color.some_color例如:(getResources().getColor(android.R.color.holo_blue_bright)至少在API 17上)
ataulm 2013年

30
现在不建议使用getColor(),可以使用:ContextCompat.getColor(context,R.color.your_color);
里卡多

2
我知道您不是进行编辑的人,但是ContextCompat和之间有什么区别ResourcesCompat?如果没有实际的区别,那么从答案中删除其中之一就可以减少混乱。
Suragch '16

14
为什么Google觉得有必要为这个糟糕的应用程序精简库淘汰一个非常好的功能。糟透了,两者都有。
Andrew S

116

基于新的Android支持库(和更新),现在您应该调用:

ContextCompat.getColor(context, R.color.name.color);

根据文档

public int getColor (int id)

API级别23中不推荐使用此方法。使用getColor(int,Theme)代替

这是相同的解决方案 getResources().getColorStateList(id)

您必须像这样更改它:

ContextCompat.getColorStateList(getContext(),id);

编辑2019

关于ThemeOverlay使用最接近视图的上下文:

val color = ContextCompat.getColor(
  closestView.context,
  R.color.name.color
)

这样,您就可以根据ThemeOverlay获得正确的颜色。

在同一活动中使用不同主题(例如暗/亮主题)时特别需要。如果您想了解有关主题和样式的更多信息,建议您进行以下讨论:使用样式开发主题

Nick Butcher-柏林Droidcon-开发具有风格的主题


10
对于那些想知道如何在作为新方法的主题填充,Theme可作为null传入,所以才打电话getColor(R.color.my_color, null),如果你不能确定通过什么主题。
w3bshark

嗯...这是每个人都说的,但我无法使它正常工作。我必须初始化上下文吗?目前,我收到“无法解析符号“上下文”的信息”
ColdTuna

为了确保您做对了,请尝试在活动的onCreate内调用它,而不是获取上下文,您需要调用getContext()或仅调用“ this”
Ultimo_m

35

定义你的颜色

值/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并进行设置

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);

也可以看看


1
您只能getResources()Activity或中使用Fragment吗?
Zapnologica

2
@Zapnologica,看到的答案,这个问题上使用的想法getResources()的活动或片段之外。
Suragch

1
@Zapnologica号 getResources()还可以在实现Context的任何视图和视图上作为公共API使用。
2015年

7

最佳方法

作为@sat的答案,获得颜色的好方法是

ResourcesCompat.getColor(getResources(), R.color.your_color, null);

或在无法访问方法时使用以下方式getResources()

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);
}

在您的应用程序中的任何地方使用最简单!即使在Util类或您没有Context或getResource()的任何类中

问题(当您没有上下文时)

您无权Context访问时,就像您的方法Util类中。

假设下面的方法没有上下文。

public void someMethod(){
    ...
    // can't use getResource() without Context.
}

现在,您将Context在此方法中作为参数传递并使用getResources().

public void someMethod(Context context){
    ...
    context.getResources...
}

因此,这里有一个独特Bonus奖励解决方案,您可以通过它从任何地方访问资源Util class。添加Resources到您的Application班级中,如果不存在则创建一个。

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;
    }

}

将名称字段添加到manifest.xml <application标签。(如果尚未添加)

<application
        android:name=".App"
        ...
        >
        ...
    </application>

现在你很好。ResourcesCompat.getColor(App.getRes(), R.color.your_color, null);在应用程序中的任何地方使用。


5

我已更新为使用,ContextCompat.getColor(context, R.color.your_color);但有时(在某些设备/ Android版本上。我不确定)会导致NullPointerExcepiton。

因此,要使其在所有设备/版本上都能正常工作,在使用空指针的情况下,我会采用旧的方法。

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));
    }
}

为什么不在所有情况下都使用旧版本,或者如果您仍在检查版本,请尽可能使用新API Resources.getColor(int, Theme)?您不应捕获运行时异常。
ataulm

我想就是强迫症。在我看来,ContextCompat似乎是实现此目标的未来方法,因此也是正确的方法。所以我的方法是正确地做。如果失败(在旧设备上或其他设备上),请以旧方法进行操作。为什么我不应该在运行时捕获异常?
ninjachippie

1

有关可能有助于在搜索结果中显示此问题的另一个用例的更多信息,我想将alpha应用于资源中定义的颜色。

使用@sat的正确答案:

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)
);

1

找到了一种更有效的简便方法:

Color.parseColor(getString(R.color.idname);

有趣的是,没有意识到您可以通过这种方式获得颜色作为字符串。我不认为这是比较容易的,但它们也同样吸引😅
ataulm

0

从非活动类访问颜色可能很困难。我发现的替代方法之一是使用enumenum提供了很大的灵活性。

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;
  }
}


0

如果您当前的分钟。API级别为23,您可以getColor()像我们用于一样简单地使用getString()

//example
textView.setTextColor(getColor(R.color.green));
// if context is not available(ex: not in activity) use with context.getColor()

如果要低于API级别23,请使用以下命令:

textView.setTextColor(getResources().getColor(R.color.green));

但是请注意,getResources().getColor()API Level中已不建议使用23。在这种情况下,将上面替换为:

textView.setTextColor(ContextCompat.getColor(this /*context*/, R.color.green)) //Im in an activity, so I can use `this`

ContextCompat:用于访问以下功能的帮助器Context

如果需要,可以使用SDK_INT如下约束:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    textView.setTextColor(getColor(R.color.green));
} else {
    textView.setTextColor(getResources().getColor(R.color.green));
}

0
ContextCompat.getColor(context, R.color.your_color);

活动中

ContextCompat.getColor(actvityname.this, R.color.your_color);

零碎地

ContextCompat.getColor(getActivity(), R.color.your_color);

例如:

tvsun.settextcolour(ContextCompat.getColor(getActivity(), R.color.your_color))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.