Android pobiera kolor jako wartość ciągu

104

Jeśli zdefiniowałem kolor w zasobach

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

można ustawić kolor według jego identyfikatora, np

view.setTextColor(R.color.someColor);

Czy można również pobrać wartość ciągu kolorów z colors.xml?

Coś jak

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

Jeśli tak, czy ktoś może podać przykład?

Dziękuję Ci

Tima
źródło

Odpowiedzi:

151

To jest twoja odpowiedź

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

dostaniesz

 colorStr = "#123456"
Tanmay Mandal
źródło
5
po pierwsze, dziękuję. Nie pomyślałem o użyciu getString dla kolorów. Działa, ale zamiast colorStr = "# 123456" dostaję "# ff123456", a to nie jest miłe :(
Tima
7
Prosty podciąg zwracanego ciągu koloru służący do usuwania dzieł Alpha. getResources (). getString (R.kolor.my_colour) .substring (3);
scottyab
82
To już nie działa, błąd „Oczekiwany zasób typu String”
Clive Jefferies
21
@CliveJefferies Możesz dodać //noinspection ResourceTypetuż nad swoim oświadczeniem.
lordmegamax
15
getResources().getString(0+R.color.someColor);działa
18446744073709551615
140

Tylko ze względu na łatwą copypastę:

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

Lub jeśli chcesz to bez przezroczystości:

"#" + Integer.toHexString(ContextCompat.getColor(getActivity(), R.color.some_color) & 0x00ffffff);
kodi
źródło
8
To działało świetnie, ale musiałem to zmodyfikować, używając, '#' + Integer.toHexString(getResources().getColor(R.color.someColor);ponieważ później Color.parseColor
używałem
4
geColor () need api> 23
Honghe.Wu
1
Możesz użyć przestarzałej metody getColor () bez problemu. Po prostu usuń "getColor (...)" i wpisz go ponownie, użyj funkcji Intellisense, aby zakończyć wywołanie metody z przestarzałym wywołaniem getColor w systemie Android i wszystko jest w porządku.
Wes Winn
Integer.toHexString (ContextCompat.getColor (kontekst, R.color.black) & 0x00ffffff);
AITAALI_ABDERRAHMANE
8
To nie zadziała, jeśli na początku koloru szesnastkowego jest 0.
asish
26

Odpowiedzi podane powyżej nie są aktualizowane.

Spróbuj tego

String colorHex = "#" + Integer.toHexString(ContextCompat.getColor(getActivity(), R.color.dark_sky_blue) & 0x00ffffff);
solidak
źródło
24

Wszystkie rozwiązania tutaj wykorzystujące Integer.toHexString()przerwanie, jeśli w ciągu szesnastkowym mają zera wiodące. Kolory, #0affffktóre przyniosłyby efekt #affff. Użyj tego zamiast tego:

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

lub z alfa:

String.format("#%08x", ContextCompat.getColor(this, R.color.your_color) & 0xffffffff)
Florian M
źródło
9

Przyczyna getResources().getColorpotrzeba api> 23. Więc to jest lepsze: tylko ze względu na łatwe kopiowanie i wklejanie:

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

Lub jeśli chcesz, aby był bez przejrzystości: `

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

Honghe.Wu
źródło
ContextCompat.getColornie przyjmuje 3 argumentów
Nashe
@Nashe to 2 argumenty, a nie 3!
Behrouz.M
4

Dla API powyżej 21 możesz użyć

getString(R.color.color_name);

To zwróci kolor w postaci łańcucha. Aby przekonwertować to na kolor w formacie liczb całkowitych (czasami akceptowane są tylko liczby całkowite), należy:

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

Powyższe wyrażenie zwraca całkowity odpowiednik koloru zdefiniowanego w pliku color.xml

Samarth S
źródło
2

Dodaj @SuppressLint („ResourceType”), jeśli wystąpi błąd. Jak poniżej.

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
źródło
2

Mi to pasuje!

String.format("#%06x", ContextCompat.getColor(this, R.color.my_color) & 0xffffff)
Carlos Galindo
źródło
1

Myślę, że nie ma do tego standardowej funkcjonalności. Możesz jednak zmienić zwracaną wartość z getColor()na hex i zmienić wartość szesnastkową na łańcuch.

hex 123456 = int 1193046;

Nacięcie
źródło
1

Oto jak to zrobiłem:

String color = "#" + Integer.toHexString(ContextCompat.getColor
(getApplicationContext(), R.color.yourColor) & 0x00ffffff);
dginelli
źródło
-4

Jeśli nie chcesz używać ContextCompatlub SuppressLint, po prostu dodaj stringzasób bezpośrednio pod swoim color.

Zamiast

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

Posługiwać się

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

Twój kod staje się bardziej powtarzalny, ale jest znacznie czystszy. Poza tym zapomnienie o aktualizacji stringpo zmianie colorjest prawie niemożliwe, ponieważ znajdują się one tuż obok siebie.

Mrówka
źródło
powielanie to zawsze zły pomysł
Łukasz