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

Tima
la source

Réponses:

151

C'est ta réponse

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

tu auras

 colorStr = "#123456"
Mandal Tanmay
la source
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);
kodi
la source
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);
Solidak
la source
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)
Florian M
la source
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 );

Honghe.Wu
la source
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

Samarth S
la source
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>";
    }
Tuan Nguyen
la source
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;

pseudo
la source
1

Voici comment je l'ai fait:

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

Ça marche pour moi!

String.format("#%06x", ContextCompat.getColor(this, R.color.my_color) & 0xffffff)
Carlos Galindo
la source
-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.

Fourmi
la source
la duplication est toujours une mauvaise idée
Lukasz