Android รับสีเป็นค่าสตริง


104

ถ้าฉันกำหนดสีในทรัพยากร

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

เป็นไปได้ที่จะกำหนดสีตามรหัสเช่น

view.setTextColor(R.color.someColor);

เป็นไปได้ไหมที่จะรับค่าสตริงสีจาก colors.xml

สิ่งที่ต้องการ

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

ถ้ามีใครช่วยยกตัวอย่างได้ไหม

ขอบคุณ

คำตอบ:


151

นี่คือคำตอบของคุณ

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

คุณจะได้รับ

 colorStr = "#123456"

5
ก่อนอื่นขอขอบคุณ ฉันไม่คิดว่าจะใช้ getString สำหรับสี มันใช้งานได้ แต่แทนที่จะเป็น colorStr = "# 123456" ฉันได้รับ "# ff123456" และสิ่งนี้ไม่ดี :(
Tima

7
สตริงย่อยอย่างง่ายของสตริงสีที่ส่งคืนเพื่อลบงาน Alpha getResources (). getString (R.color.my_colour) .substring (3);
scottyab

82
สิ่งนี้ไม่ทำงานอีกต่อไปข้อผิดพลาด 'ทรัพยากรที่คาดไว้ของประเภท String'
Clive Jefferies

21
@CliveJefferies คุณสามารถเพิ่ม//noinspection ResourceTypeด้านบนข้อความของคุณ
lordmegamax

15
getResources().getString(0+R.color.someColor);ผลงาน
18446744073709551615

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 เพื่อทำการเรียกเมธอดให้เสร็จสมบูรณ์ด้วยการโทร getColor ที่เลิกใช้ Android แล้วคุณก็สบายดี
Wes Winn

Integer.toHexString (ContextCompat.getColor (บริบท, 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()ตัวแบ่งหากคุณมีเลขศูนย์นำหน้าในสตริงเลขฐานสิบหกของคุณ สีที่ชอบจะส่งผลให้#0affff #affffใช้สิ่งนี้แทน:

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

หรือด้วยอัลฟา:

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

สำหรับ API ที่สูงกว่า 21 คุณสามารถใช้ได้

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

หากคุณไม่ต้องการใช้ContextCompatหรือSuppressLintเพียงแค่เพิ่มstringทรัพยากรในcolorไฟล์.

แทน

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

ใช้

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

รหัสของคุณซ้ำซากมากขึ้น แต่ก็สะอาดกว่ามาก นอกจากนี้การลืมอัปเดตstringหลังเปลี่ยนcolorนั้นแทบจะเป็นไปไม่ได้เลยเพราะมันอยู่ติดกัน


การทำซ้ำเป็นความคิดที่ไม่ดีเสมอ
Lukasz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.