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
Простая подстрока возвращаемой цветовой строки для удаления альфа работает. getResources (). getString (R.color.my_colour) .substring (3);
scottyab
82
Это больше не работает, ошибка «Ожидаемый ресурс типа String»
Клайв Джеффрис,
21
@CliveJefferies Вы можете добавить //noinspection ResourceTypeпрямо над вашим заявлением.
lordmegamax
15
getResources().getString(0+R.color.someColor);работает
18446744073709551615 02
140

Просто ради легкой копипасты:

"#" + 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 (context, R.color.black) & 0x00ffffff);
AITAALI_ABDERRAHMANE
8
Это не сработает, если вначале шестнадцатеричного цвета будет 0.
asish
26

Приведенные выше ответы не обновляются.

Примерьте вот это

String colorHex = "#" + Integer.toHexString(ContextCompat.getColor(getActivity(), R.color.dark_sky_blue) & 0x00ffffff);
солидак
источник
24

Все решения здесь используют Integer.toHexString()break, если у вас будут ведущие нули в вашей шестнадцатеричной строке. Цвета вроде #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 );

Honghe.Wu
источник
ContextCompat.getColorне принимает 3 аргумента
Наше
@ Наше это 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>";
    }
Туан Нгуен
источник
2

Меня устраивает!

String.format("#%06x", ContextCompat.getColor(this, R.color.my_color) & 0xffffff)
Карлос Галиндо
источник
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практически невозможно, так как они находятся рядом друг с другом.

Муравей
источник
дублирование - всегда плохая идея
Лукаш