Android obtém cor como valor de string

104

Se eu definisse uma cor em recursos

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

é possível definir a cor por seu id, como

view.setTextColor(R.color.someColor);

Também é possível obter o valor da string de cores de colors.xml?

Algo como

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

Se sim, alguém pode dar um exemplo?

Obrigado

Tima
fonte

Respostas:

151

Esta é a sua resposta

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

você vai ter

 colorStr = "#123456"
Tanmay Mandal
fonte
5
primeiro, obrigado. Não pensei em usar getString para cores. Funciona, mas em vez de colorStr = "# 123456" estou recebendo "# ff123456", e isso não é legal :(
Tima
7
Uma substring simples da string de cor retornada para remover o Alpha funciona. getResources (). getString (R.color.my_colour) .substring (3);
scottyab
82
Isso não está mais funcionando, erro 'Recurso esperado do tipo String'
Clive Jefferies
21
@CliveJefferies Você pode adicionar um //noinspection ResourceTypepouco acima de sua declaração.
lordmegamax de
15
getResources().getString(0+R.color.someColor);obras
18446744073709551615
139

Apenas por uma questão de cópia fácil:

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

Ou se você quiser sem a transparência:

"#" + Integer.toHexString(ContextCompat.getColor(getActivity(), R.color.some_color) & 0x00ffffff);
kodi
fonte
8
Funcionou muito bem, no entanto, precisei modificá-lo usando, '#' + Integer.toHexString(getResources().getColor(R.color.someColor);pois mais tarde estava usando emColor.parseColor
gattsbr
4
geColor () precisa de api> 23
Honghe.Wu
1
Você pode usar getColor () obsoleto sem problemas. Apenas exclua o "getColor (...)" e digite-o novamente, use o intellisense para completar a chamada do método com a chamada getColor obsoleta do Android e você está bem.
Wes Winn
Integer.toHexString (ContextCompat.getColor (context, R.color.black) & 0x00ffffff);
AITAALI_ABDERRAHMANE
8
Isso não funcionará se houver 0 no início da cor hexadecimal.
asish
26

As respostas fornecidas acima não são atualizadas.

Tente este, por favor

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

Todas as soluções aqui usando Integer.toHexString()break se você tivesse zeros à esquerda em sua string hexadecimal. Cores como #0affffresultariam em #affff. Em vez disso, use:

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

ou com alfa:

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

Causa getResources().getColornecessidade de api> 23. Portanto, é melhor: apenas para copiar e colar facilmente:

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

Ou se você quiser sem a transparência: `

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

Honghe.Wu
fonte
ContextCompat.getColornão aceita 3 argumentos
Nashe
@Nashe são 2 argumentos, não 3!
Behrouz.M
4

Para API acima de 21, você pode usar

getString(R.color.color_name);

Isso retornará a cor em um formato de string. Para converter isso em uma cor em formato inteiro (às vezes, apenas inteiros são aceitos), então:

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

A expressão acima retorna o equivalente inteiro da cor definida no arquivo color.xml

Samarth S
fonte
2

Adicione @SuppressLint ("ResourceType") se ocorrer um erro. Como abaixo.

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>";
    }
Tuan Nguyen
fonte
1

Não acho que haja funcionalidade padrão para isso. No entanto, você pode transformar o valor de retorno de getColor()hexadecimal e transformar o valor hexadecimal em string.

hex 123456 = int 1193046;

usuario
fonte
1

É assim que eu fiz:

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

Funciona para mim!

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

Se você não quiser usar ContextCompatou SuppressLint, basta adicionar um stringrecurso logo abaixo do seu color.

Ao invés de

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

Usar

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

Seu código fica mais repetitivo, mas é muito mais limpo. Além disso, esquecer de atualizar os stringapós a troca coloré quase impossível, pois eles estão um ao lado do outro.

Formiga
fonte
duplicação é sempre uma má ideia
Lukasz