Android获取颜色作为字符串值


104

如果我在资源中定义了颜色

<resources>
    <color name="someColor">#123456</color>
</resources>

可以通过其ID设置颜色,例如

view.setTextColor(R.color.someColor);

是否还可以从colors.xml获取颜色字符串值?

就像是

colorStr = getColor(R.color.someColor);
// -> colorStr = "#123456"

如果可以,有人可以举个例子吗?

谢谢

Answers:


151

这是你的答案

colorStr=getResources().getString(R.color.someColor);

你会得到

 colorStr = "#123456"

5
首先,谢谢。我没想到使用getString作为颜色。它的工作原理,但不是colorStr =“#123456”我得到“#ff123456”,这是不是很好:(
梯玛

7
返回的颜色字符串的简单子字符串可以删除Alpha。getResources()。getString(R.color.my_colour).substring(3);
scottyab

82
这不再起作用,错误“字符串类型的预期资源”
Clive Jefferies

21
@CliveJefferies您可以//noinspection ResourceType在语句的上方添加。
lordmegamax

15
getResources().getString(0+R.color.someColor);作品
18446744073709551615 '16

139

只是为了方便copypasta:

"#" + Integer.toHexString(ContextCompat.getColor(getActivity(), R.color.some_color));

或者,如果您希望没有透明度:

"#" + Integer.toHexString(ContextCompat.getColor(getActivity(), R.color.some_color) & 0x00ffffff);

8
这很好,但是我需要通过使用来修改它,'#' + Integer.toHexString(getResources().getColor(R.color.someColor);因为后来我在Color.parseColor
gattsbr

4
geColor()需要api> 23
Honghe.Wu

1
您可以使用不推荐使用的getColor()没问题。只需删除“ getColor(...)”并再次键入,使用intellisense即可完成Android不推荐使用的getColor调用来完成方法调用,您就很好。
Wes Winn

Integer.toHexString(ContextCompat.getColor(context,R.color.black)&0x00ffffff);
AITAALI_ABDERRAHMANE

8
如果十六进制颜色的第一个为0,则此功能将无效。
asish

26

上面提供的答案未更新。

请试试这个

String colorHex = "#" + Integer.toHexString(ContextCompat.getColor(getActivity(), R.color.dark_sky_blue) & 0x00ffffff);

23

Integer.toHexString()如果您的十六进制字符串中有前导零,则此处所有解决方案都使用break。像#0affff这样的颜色会导致#affff。使用此代替:

String.format("#%06x", ContextCompat.getColor(this, R.color.your_color) & 0xffffff)

或使用Alpha:

String.format("#%08x", ContextCompat.getColor(this, R.color.your_color) & 0xffffffff)

9

导致getResources().getColor需要api>23。所以这更好:只是为了方便复制和粘贴:

Integer.toHexString( ContextCompat.getColor( getContext(), R.color.someColor ) );

或者,如果您希望没有透明度:`

Integer.toHexString( ContextCompat.getColor( getContext(), R.color.someColor ) & 0x00ffffff );


ContextCompat.getColor不接受3个论点
Nashe

@Nashe是2个参数,而不是3个!
Behrouz.M,

4

对于21以上的API,您可以使用

getString(R.color.color_name);

这将以字符串格式返回颜色。要将其转换为整数格式的颜色(有时仅接受整数),然后:

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

上面的表达式返回与color.xml文件中定义的颜色等效的整数


2

如果发生错误,请添加@SuppressLint(“ ResourceType”)。像吼叫

private String formatUsernameAction(UserInfo userInfo, String action) {
        String username = userInfo.getUsername();
        @SuppressLint("ResourceType") String usernameColor = getContext().getResources().getString(R.color.background_button);
        return "<font color=\""+usernameColor+"\">" + username
                + "</font> <font color=\"#787f83\">" + action.toLowerCase() + "</font>";
    }

1

我认为没有标准功能。但是,您可以将返回值从转换getColor()为十六进制,然后将十六进制值转换为字符串。

十六进制123456 = int 1193046;


1

这是我的方法:

String color = "#" + Integer.toHexString(ContextCompat.getColor
(getApplicationContext(), R.color.yourColor) & 0x00ffffff);


-4

如果您不想使用ContextCompatSuppressLint,只需在的string下方添加资源color

代替

<color name="text_color">#FFFFFF</color>

<color name="text_color">#FFFFFF</color>
<string name="text_color_string">#FFFFFF</string>

您的代码确实重复了很多,但是更加简洁。此外,string更改后忘记更新color几乎是不可能的,因为它们彼此相邻。


复制始终是个坏主意
Lukasz
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.