Android отримує колір як значення рядка


104

Якщо я визначив колір у ресурсах

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

можна встановити колір за його id, наприклад

view.setTextColor(R.color.someColor);

Чи також можна отримати значення рядкового кольору з кольорів.xml?

Щось на зразок

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

Якщо так, чи може хтось навести приклад?

Дякую

Відповіді:


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
Це більше не працює, помилка 'Очікуваний ресурс типу 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, і ви добре.
Уес Вінн

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 це 2 аргументи, а не 3!
Бероуз.М

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майже неможливо, оскільки вони знаходяться прямо поруч.


дублювання завжди погана ідея
Лукаш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.