Android obtient la couleur comme valeur de chaîne


104

Si j'ai défini une couleur dans les ressources

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

il est possible de définir la couleur par son identifiant, comme

view.setTextColor(R.color.someColor);

Est-il également possible d'obtenir la valeur de la chaîne de couleur à partir de colors.xml?

Quelque chose comme

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

Si oui, quelqu'un peut-il donner un exemple?

Je vous remercie

Réponses:


151

C'est ta réponse

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

tu auras

 colorStr = "#123456"

5
d'abord, merci. Je n'ai pas pensé à utiliser getString pour les couleurs. Cela fonctionne, mais au lieu de colorStr = "# 123456" j'obtiens "# ff123456", et ce n'est pas gentil :(
Tima

7
Une simple sous-chaîne de la chaîne de couleur retournée pour supprimer l'Alpha fonctionne. getResources (). getString (R.color.my_colour) .substring (3);
scottyab

82
Cela ne fonctionne plus, erreur 'Ressource attendue de type String'
Clive Jefferies

21
@CliveJefferies Vous pouvez ajouter //noinspection ResourceTypejuste au-dessus de votre relevé.
lordmegamax

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

139

Juste pour le plaisir de la copypasta facile:

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

Ou si vous le voulez sans la transparence:

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

8
Cela fonctionnait très bien, mais j'avais besoin de modifier cela en utilisant '#' + Integer.toHexString(getResources().getColor(R.color.someColor);car plus tard je l'utilisais dansColor.parseColor
gattsbr

4
geColor () a besoin d'une api> 23
Honghe.Wu

1
Vous pouvez utiliser le getColor () obsolète sans problème. Supprimez simplement "getColor (...)" et tapez-le à nouveau, utilisez intellisense pour terminer l'appel de méthode avec l'appel getColor obsolète pour Android et vous êtes bon.
Wes Winn

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

8
Cela ne fonctionnera pas s'il y a 0 au début de la couleur hexadécimale.
asish

26

Les réponses fournies ci-dessus ne sont pas mises à jour.

S'il vous plaît, essayez celui-la

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

23

Toutes les solutions ici utilisent Integer.toHexString()break si vous aviez des zéros non significatifs dans votre chaîne hexadécimale. Des couleurs comme cela #0affffdonneraient #affff. Utilisez plutôt ceci:

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

ou avec alpha:

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

9

Cause getResources().getColorneed api> 23. Donc c'est mieux: juste pour faciliter le copier-coller:

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

Ou si vous le voulez sans la transparence: `

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


ContextCompat.getColorne prend pas 3 arguments
Nashe

@Nashe c'est 2 arguments, pas 3!
Behrouz.M

4

Pour les API supérieures à 21, vous pouvez utiliser

getString(R.color.color_name);

Cela renverra la couleur dans un format de chaîne. Pour convertir cela en une couleur au format entier (parfois seuls les entiers sont acceptés), alors:

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

L'expression ci-dessus renvoie l'équivalent entier de la couleur définie dans le fichier color.xml


2

Ajoutez @SuppressLint ("ResourceType") si une erreur se produit. Comme ci-dessous.

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

Je ne pense pas qu'il existe une fonctionnalité standard pour cela. Vous pouvez cependant transformer la valeur de retour de getColor()à hexadécimal et transformer la valeur hexadécimale en chaîne.

hex 123456 = int 1193046;


1

Voici comment je l'ai fait:

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

1

Ça marche pour moi!

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

-4

Si vous ne souhaitez pas utiliser ContextCompatou SuppressLint, ajoutez simplement une stringressource juste sous votre color.

Au lieu de

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

Utilisation

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

Votre code devient plus répétitif, mais il est beaucoup plus propre. De plus, il est presque impossible d' oublier de mettre à jour stringaprès le changement colorcar ils sont juste à côté de l'autre.


la duplication est toujours une mauvaise idée
Lukasz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.