Android erhält Farbe als Zeichenfolgenwert

104

Wenn ich eine Farbe in Ressourcen definiert habe

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

Es ist möglich, die Farbe anhand der ID festzulegen, z

view.setTextColor(R.color.someColor);

Ist es auch möglich, den Wert der Farbzeichenfolge aus color.xml abzurufen?

Etwas wie

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

Wenn ja, kann jemand ein Beispiel geben?

Danke dir

Tima
quelle

Antworten:

151

Das ist deine Antwort

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

Sie erhalten

 colorStr = "#123456"
Tanmay Mandal
quelle
5
zuerst danke. Ich hätte nicht gedacht, getString für Farben zu verwenden. Es funktioniert, aber anstelle von colorStr = "# 123456" bekomme ich "# ff123456", und das ist nicht schön :(
Tima
7
Eine einfache Teilzeichenfolge der zurückgegebenen Farbzeichenfolge zum Entfernen des Alpha funktioniert. getResources (). getString (R.color.my_colour) .substring (3);
Scottyab
82
Dies funktioniert nicht mehr, Fehler 'Erwartete Ressource vom Typ String'
Clive Jefferies
21
@CliveJefferies Sie können //noinspection ResourceTypedirekt über Ihrer Anweisung hinzufügen .
Lordmegamax
15
getResources().getString(0+R.color.someColor);Werke
18446744073709551615
139

Nur um der einfachen Copypasta willen:

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

Oder wenn Sie es ohne Transparenz wollen:

"#" + Integer.toHexString(ContextCompat.getColor(getActivity(), R.color.some_color) & 0x00ffffff);
Kodi
quelle
8
Dies funktionierte großartig, aber ich musste dies ändern, indem '#' + Integer.toHexString(getResources().getColor(R.color.someColor);ich es verwendete , da ich es später inColor.parseColor
gattsbr
4
geColor () braucht api> 23
Honghe.Wu
1
Sie können das veraltete getColor () problemlos verwenden. Löschen Sie einfach "getColor (...)" und geben Sie es erneut ein. Verwenden Sie Intellisense, um den Methodenaufruf mit dem veralteten getColor-Aufruf von Android abzuschließen, und Sie sind gut.
Wes Winn
Integer.toHexString (ContextCompat.getColor (context, R.color.black) & 0x00ffffff);
AITAALI_ABDERRAHMANE
8
Dies funktioniert nicht, wenn die Hex-Farbe zuerst 0 enthält.
Asish
26

Die oben angegebenen Antworten werden nicht aktualisiert.

Probieren Sie mal das hier an

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

Alle Lösungen hier verwenden Integer.toHexString()break, wenn Sie führende Nullen in Ihrer Hex-Zeichenfolge haben würden. Farben wie #0affffwürden ergeben #affff. Verwenden Sie stattdessen Folgendes:

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

oder mit alpha:

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

Ursache getResources().getColorbraucht API> 23. Das ist also besser: Nur zum einfachen Kopieren und Einfügen:

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

Oder wenn Sie es ohne Transparenz wollen: `

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

Honghe.Wu
quelle
ContextCompat.getColornimmt nicht 3 Argumente
Nashe
@Nashe es sind 2 Argumente, nicht 3!
Behrouz.M
4

Für API über 21 können Sie verwenden

getString(R.color.color_name);

Dadurch wird die Farbe in einem Zeichenfolgenformat zurückgegeben. Um dies in eine Farbe im Ganzzahlformat umzuwandeln (manchmal werden nur Ganzzahlen akzeptiert), gehen Sie wie folgt vor:

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

Der obige Ausdruck gibt das ganzzahlige Äquivalent der in der Datei color.xml definierten Farbe zurück

Samarth S.
quelle
2

Fügen Sie @SuppressLint ("ResourceType") hinzu, wenn ein Fehler auftritt. Wie unten.

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

Ich glaube nicht, dass es dafür Standardfunktionen gibt. Sie können jedoch den Rückgabewert von getColor()in hex und den hexadezimalen Wert in string umwandeln.

hex 123456 = int 1193046;

Nick
quelle
1

So habe ich es gemacht:

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

Für mich geht das!

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

Wenn Sie nicht verwenden möchten , ContextCompatoder SuppressLintfügen Sie einfach eine stringRessource direkt unter color.

Anstatt

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

Verwenden

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

Ihr Code wiederholt sich zwar, ist aber viel sauberer. Außerdem ist es fast unmöglich , das Aktualisieren stringnach dem Ändern zu vergessen, colorda sie direkt nebeneinander liegen.

Ameise
quelle
Vervielfältigung ist immer eine schlechte Idee
Lukasz