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

Tima
sumber

Jawaban:

151

Inilah jawaban Anda

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

kamu akan mendapatkan

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

Honghe.Wu
sumber
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

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

Nick
sumber
1

Beginilah cara saya melakukannya:

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

Ini berhasil untuk saya!

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

Semut
sumber
duplikasi selalu merupakan ide yang buruk
Lukasz