Android ottiene il colore come valore di stringa


104

Se definissi un colore nelle risorse

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

è possibile impostare il colore dal suo ID, come

view.setTextColor(R.color.someColor);

È anche possibile ottenere il valore della stringa di colore da colors.xml?

Qualcosa di simile a

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

Se sì, qualcuno può fare un esempio?

Grazie

Risposte:


151

Questa è la tua risposta

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

otterrete

 colorStr = "#123456"

5
in primo luogo, grazie. Non ho pensato di usare getString per i colori. Funziona, ma invece di colorStr = "# 123456" ricevo "# ff123456" e questo non è carino :(
Tima

7
Una semplice sottostringa della stringa di colore restituita per rimuovere Alpha funziona. . getResources () getString (R.color.my_colour) .Substring (3);
scottyab

82
Questo non funziona più, errore "Risorsa prevista di tipo String"
Clive Jefferies

21
@CliveJefferies Puoi aggiungere //noinspection ResourceTypeappena sopra la tua dichiarazione.
lordmegamax

15
getResources().getString(0+R.color.someColor);opere
18446744073709551615

139

Solo per il bene di una facile copia della pasta:

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

O se lo vuoi senza la trasparenza:

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

8
'#' + Integer.toHexString(getResources().getColor(R.color.someColor);Color.parseColor
Funzionava

4
geColor () necessita di api> 23
Honghe.Wu

1
Puoi usare il deprecato getColor () senza problemi. Elimina semplicemente "getColor (...)" e digita di nuovo, usa intellisense per completare la chiamata al metodo con la chiamata getColor deprecata di Android e sei a posto.
Wes Winn

Integer.toHexString (ContextCompat.getColor (context, R.color.black) & 0x00ffffff);
AITAALI_ABDERRAHMANE

8
Questo non funzionerà se all'inizio c'è 0 del colore esadecimale.
asish

26

Le risposte fornite sopra non vengono aggiornate.

Provi questo, per favore

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

23

Tutte le soluzioni qui usando Integer.toHexString()break se avessi zeri iniziali nella tua stringa esadecimale. Colori simili #0affffrisulterebbero #affff. Usa questo invece:

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

Perché è getResources().getColornecessaria un'api> 23. Quindi è meglio: solo per un facile copia e incolla:

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

O se lo vuoi senza la trasparenza: `

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


ContextCompat.getColornon accetta 3 argomenti
Nashe

@Nashe sono 2 argomenti, non 3!
Behrouz.M

4

Per API superiori a 21 puoi usare

getString(R.color.color_name);

Questo restituirà il colore in un formato stringa. Per convertirlo in un colore in formato intero (a volte sono accettati solo numeri interi), quindi:

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

L'espressione precedente restituisce l'equivalente intero del colore definito nel file color.xml


2

Aggiungi @SuppressLint ("ResourceType") se si verifica un errore. Come muggito.

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

Non penso che ci sia funzionalità standard per questo. È tuttavia possibile modificare il valore del ritorno dagetColor() a esadecimale e trasformare il valore esadecimale in stringa.

hex 123456 = int 1193046;


1

Ecco come l'ho fatto:

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

1

Per me funziona!

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

-4

Se non vuoi usare ContextCompato SuppressLint, aggiungi semplicemente una stringrisorsa sotto il tuocolor .

Invece di

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

Uso

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

Il tuo codice diventa più ripetitivo ma è molto più pulito. Inoltre, dimenticare di aggiornare il stringdopo il cambio colorè quasi impossibile poiché sono uno accanto all'altro.


la duplicazione è sempre una cattiva idea
Lukasz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.