Android obtiene color como valor de cadena

104

Si definiera un color en recursos

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

es posible establecer el color por su identificación, como

view.setTextColor(R.color.someColor);

¿También es posible obtener el valor de la cadena de color de colors.xml?

Algo como

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

Si es así, ¿alguien puede dar un ejemplo?

Gracias

Tima
fuente

Respuestas:

151

Esta es tu respuesta

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

conseguirás

 colorStr = "#123456"
Tanmay Mandal
fuente
5
primero, gracias. No pensé en usar getString para los colores. Funciona, pero en lugar de colorStr = "# 123456" obtengo "# ff123456", y esto no es agradable :(
Tima
7
Funciona una simple subcadena de la cadena de color devuelta para eliminar el Alfa. getResources (). getString (R.color.my_colour) .substring (3);
scottyab
82
Esto ya no funciona, error 'Recurso esperado de tipo String'
Clive Jefferies
21
@CliveJefferies Puede agregar //noinspection ResourceTypejusto encima de su declaración.
lordmegamax
15
getResources().getString(0+R.color.someColor);trabaja
18446744073709551615
139

Solo por el simple hecho de copiarpasta:

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

O si lo quieres sin la transparencia:

"#" + Integer.toHexString(ContextCompat.getColor(getActivity(), R.color.some_color) & 0x00ffffff);
kodi
fuente
8
Esto funcionó muy bien, sin embargo, necesitaba modificar esto usando '#' + Integer.toHexString(getResources().getColor(R.color.someColor);ya que más tarde lo estaba usando enColor.parseColor
gattsbr
4
geColor () necesita api> 23
Honghe.Wu
1
Puede utilizar getColor () obsoleto sin problema. Simplemente elimine "getColor (...)" y escríbalo de nuevo, use intellisense para completar la llamada al método con la llamada getColor obsoleta de Android y listo.
Wes Winn
Integer.toHexString (ContextCompat.getColor (contexto, R.color.black) & 0x00ffffff);
AITAALI_ABDERRAHMANE
8
Esto no funcionará si hay 0 al principio del color hexadecimal.
asish
26

Las respuestas proporcionadas anteriormente no están actualizadas.

Por favor, pruebe este

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

Todas las soluciones aquí usan Integer.toHexString()break si tuviera ceros a la izquierda en su cadena hexadecimal. Los colores como #0affffresultarían #affff. Use esto en su lugar:

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

o con alfa:

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

Cause getResources().getColorneed api> 23. Entonces esto es mejor: solo por el simple hecho de copiar y pegar:

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

O si lo quieres sin la transparencia: `

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

Honghe.Wu
fuente
ContextCompat.getColorno toma 3 argumentos
Nashe
@Nashe son 2 argumentos, no 3!
Behrouz.M
4

Para API por encima de 21 puede usar

getString(R.color.color_name);

Esto devolverá el color en formato de cadena. Para convertir eso a un color en formato entero (a veces solo se aceptan números enteros), entonces:

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

La expresión anterior devuelve el equivalente entero del color definido en el archivo color.xml

Samarth S
fuente
2

Agregue @SuppressLint ("ResourceType") si ocurre un error. Como un bramido.

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
fuente
1

No creo que exista una funcionalidad estándar para eso. Sin embargo, puede convertir el valor devuelto de getColor()a hexadecimal y convertir el valor hexadecimal a una cadena.

hex 123456 = int 1193046;

Mella
fuente
1

Así es como lo he hecho:

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

¡Esto funciona para mi!

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

Si no desea utilizar ContextCompato SuppressLint, simplemente agregue un stringrecurso justo debajo de su color.

En vez de

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

Utilizar

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

Su código se vuelve más repetitivo pero es mucho más limpio. Además, olvidarse de actualizar el stringafter change colores casi imposible ya que están uno al lado del otro.

Hormiga
fuente
la duplicación es siempre una mala idea
Lukasz