Android mendapatkan warna sebagai nilai string


104

Jika saya menentukan warna dalam sumber daya

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

itu mungkin untuk mengatur warna dengan id-nya, seperti

view.setTextColor(R.color.someColor);

Apakah mungkin juga untuk mendapatkan nilai string warna dari colors.xml?

Sesuatu seperti

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

Jika ya, adakah yang bisa memberi contoh?

Terima kasih

Jawaban:


151

Inilah jawaban Anda

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

kamu akan mendapatkan

 colorStr = "#123456"

5
pertama terima kasih. Saya tidak berpikir untuk menggunakan getString untuk warna. Ini berfungsi, tetapi alih-alih colorStr = "# 123456" saya mendapatkan "# ff123456", dan ini tidak bagus :(
Tima

7
Substring sederhana dari string warna yang dikembalikan untuk menghapus karya Alpha. getResources (). getString (R.color.my_colour) .substring (3);
scottyab

82
Ini tidak berfungsi lagi, kesalahan 'Sumber daya yang diharapkan dari tipe String'
Clive Jefferies

21
@CliveJefferies Anda dapat menambahkan //noinspection ResourceTypetepat di atas pernyataan Anda.
lordmegamax

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

139

Hanya demi copypasta yang mudah:

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

Atau jika Anda menginginkannya tanpa transparansi:

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

8
Ini bekerja dengan baik, namun saya perlu memodifikasi ini dengan menggunakan '#' + Integer.toHexString(getResources().getColor(R.color.someColor);karena kemudian saya menggunakannya diColor.parseColor
gattsbr

4
geColor () membutuhkan api> 23
Honghe.Wu

1
Anda bisa menggunakan getColor () yang tidak digunakan lagi tanpa masalah. Hapus saja "getColor (...)" dan ketikkan lagi, gunakan intellisense untuk menyelesaikan panggilan metode dengan panggilan getColor Android yang tidak digunakan lagi dan Anda baik-baik saja.
Wes Winn

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

8
Ini tidak akan berfungsi jika pertama kali ada 0 dari warna hex.
asish

26

Jawaban yang diberikan di atas tidak diperbarui.

Silakan coba yang ini

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

23

Semua solusi di sini menggunakan Integer.toHexString()jeda jika Anda memiliki nol di depan dalam string hex Anda. Warna-warna seperti itu #0affffakan menghasilkan #affff. Gunakan ini sebagai gantinya:

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

atau dengan alfa:

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

9

Penyebab getResources().getColorperlu api> 23. Jadi ini lebih baik: Hanya demi kemudahan salin & tempel:

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

Atau jika Anda menginginkannya tanpa transparansi: `

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


ContextCompat.getColortidak mengambil 3 argumen
Nashe

@Nashe itu 2 argumen, bukan 3!
Behrouz.M

4

Untuk API di atas 21 Anda bisa menggunakan

getString(R.color.color_name);

Ini akan mengembalikan warna dalam format string. Untuk mengubahnya menjadi warna dalam format integer (terkadang hanya integer yang diterima) maka:

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

Ekspresi di atas mengembalikan padanan integer dari warna yang ditentukan dalam file color.xml


2

Tambahkan @SuppressLint ("ResourceType") jika terjadi kesalahan. Seperti di bawah.

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

Saya rasa tidak ada fungsi standar untuk itu. Namun Anda dapat mengubah pengembalian nilai dari getColor()menjadi hex dan mengubah nilai hex menjadi string.

hex 123456 = int 1193046;


1

Beginilah cara saya melakukannya:

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

1

Ini berhasil untuk saya!

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

-4

Jika Anda tidak ingin menggunakan ContextCompatatau SuppressLint, cukup tambahkan stringsumber daya tepat di bawah color.

Dari pada

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

Menggunakan

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

Kode Anda memang menjadi lebih berulang tetapi jauh lebih bersih. Selain itu, lupa untuk memperbarui stringperubahan setelah colorhampir tidak mungkin karena mereka berada tepat di samping satu sama lain.


duplikasi selalu merupakan ide yang buruk
Lukasz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.