Android lấy màu làm giá trị chuỗi


104

Nếu tôi xác định một màu trong tài nguyên

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

có thể đặt màu theo id của nó, như

view.setTextColor(R.color.someColor);

Cũng có thể lấy giá trị chuỗi màu từ Colors.xml?

Cái gì đó như

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

Nếu có, ai có thể cho một ví dụ?

Cảm ơn bạn

Câu trả lời:


151

Đây là câu trả lời của bạn

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

bạn sẽ nhận được

 colorStr = "#123456"

5
đầu tiên, cảm ơn bạn. Tôi không nghĩ sẽ sử dụng getString cho màu sắc. Nó hoạt động, nhưng thay vì colorStr = "# 123456", tôi nhận được "# ff123456", và điều này không tốt :(
Tima

7
Một chuỗi con đơn giản của chuỗi màu được trả về để loại bỏ các tác phẩm Alpha. getResources (). getString (R.color.my_colour) .substring (3);
scottyab

82
Điều này không hoạt động nữa, lỗi 'Tài nguyên mong đợi của loại Chuỗi'
Clive Jefferies

21
@CliveJefferies Bạn có thể thêm //noinspection ResourceTypengay phía trên bảng sao kê của mình.
Lordmegamax

15
getResources().getString(0+R.color.someColor);hoạt động
18446744073709551615 02/02/16

139

Chỉ vì lợi ích của copypasta dễ dàng:

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

Hoặc nếu bạn muốn nó mà không có sự minh bạch:

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

8
Điều này làm việc rất tốt, tuy nhiên tôi cần phải thay đổi điều này bằng cách sử dụng '#' + Integer.toHexString(getResources().getColor(R.color.someColor);từ năm sau, tôi đã sử dụng nó trongColor.parseColor
gattsbr

4
geColor () cần api> 23
Honghe.Wu

1
Bạn có thể sử dụng getColor () không dùng nữa, không vấn đề gì. Chỉ cần xóa "getColor (...)" và gõ lại, sử dụng intellisense để hoàn thành lệnh gọi phương thức với lệnh gọi getColor không được dùng nữa của Android và bạn đã ổn.
Wes Winn

Integer.toHexString (ContextCompat.getColor (ngữ cảnh, R.color.black) & 0x00ffffff);
AITAALI_ABDERRAHMANE

8
Điều này sẽ không hoạt động nếu có 0 ở đầu tiên của màu hex.
asish

26

Các câu trả lời được cung cấp ở trên không được cập nhật.

Hãy thử cái này

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

23

Tất cả các giải pháp ở đây bằng cách sử dụng Integer.toHexString()break nếu bạn có các số 0 đứng đầu trong chuỗi hex của mình. Màu sắc như thế #0affffnào sẽ dẫn đến #affff. Sử dụng cái này thay thế:

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

hoặc với alpha:

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

9

Nguyên nhân getResources().getColorcần api> 23. Vì vậy, điều này tốt hơn: Chỉ vì lợi ích của việc sao chép và dán dễ dàng:

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

Hoặc nếu bạn muốn nó mà không có sự minh bạch:

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


ContextCompat.getColorkhông lấy 3 đối số
Nashe

@Nashe nó là 2 đối số, không phải 3!
Behrouz.M

4

Đối với API trên 21, bạn có thể sử dụng

getString(R.color.color_name);

Thao tác này sẽ trả về màu ở định dạng chuỗi. Để chuyển đổi màu đó thành màu ở định dạng số nguyên (đôi khi chỉ chấp nhận số nguyên), hãy:

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

Biểu thức trên trả về giá trị tương đương số nguyên của màu được xác định trong tệp color.xml


2

Thêm @SuppressLint ("ResourceType") nếu xảy ra lỗi. Như dưới đây.

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

Tôi không nghĩ rằng có chức năng tiêu chuẩn cho điều đó. Tuy nhiên, bạn có thể chuyển giá trị trả về từ getColor()hex và chuyển giá trị hex thành chuỗi.

hex 123456 = int 1193046;


1

Đây là cách tôi đã thực hiện:

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

1

Nó hoạt động cho tôi!

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

-4

Nếu bạn không muốn sử dụng ContextCompathoặc SuppressLint, chỉ cần thêm một stringtài nguyên ngay bên dưới của bạn color.

Thay vì

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

Sử dụng

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

Mã của bạn lặp đi lặp lại nhiều hơn nhưng nó sạch hơn nhiều. Bên cạnh đó, việc cố gắng cập nhật stringsau khi thay đổi colorlà gần như không thể vì chúng ở ngay cạnh nhau.


sao chép luôn là một ý tưởng tồi
Lukasz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.