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

Respuestas:


151

Esta es tu respuesta

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

conseguirás

 colorStr = "#123456"

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);

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);

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)

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 );


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


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>";
    }

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;


1

Así es como lo he hecho:

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

1

¡Esto funciona para mi!

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

-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.


la duplicación es siempre una mala idea
Lukasz
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.