The Resources.getColor(int id)
Metode telah usang.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Apa yang harus saya lakukan?
The Resources.getColor(int id)
Metode telah usang.
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
Apa yang harus saya lakukan?
Jawaban:
Mulai dari Android Support Library 23,
metode getColor () baru telah ditambahkan ContextCompat
.
Penjelasannya dari JavaDoc resmi:
Mengembalikan warna yang terkait dengan ID sumber daya tertentu
Mulai dari M, warna yang dikembalikan akan ditata untuk tema Konteks yang ditentukan.
Jadi, panggil saja :
ContextCompat.getColor(context, R.color.your_color);
Anda dapat memeriksa ContextCompat.getColor()
kode sumber di GitHub .
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
Penjelasan:
Anda perlu menggunakan ContextCompat.getColor () , yang merupakan bagian dari Perpustakaan Dukungan V4 (ini akan bekerja untuk semua API sebelumnya).
ContextCompat.getColor(context, R.color.my_color)
Jika Anda belum menggunakan Perpustakaan Dukungan, Anda harus menambahkan baris berikut ke dependencies
array di dalam aplikasi Anda build.gradle
(catatan: itu opsional jika Anda sudah menggunakan perpustakaan appcompat (V7) ):
compile 'com.android.support:support-v4:23.0.0' # or any version above
Jika Anda peduli dengan tema, dokumentasi menetapkan bahwa:
Mulai dari M, warna yang dikembalikan akan ditata untuk tema Konteks yang ditentukan
M
, warna yang dikembalikan akan ditata untuk tema Konteks yang ditentukan. "
ContextCompat
kelasnya berasal dari SupportV4. AppcompatV7 berfungsi juga karena mengandalkan SupportV4. Seperti yang mereka katakan pada dokumentasi Support Perpustakaan , This library depends on the v4 Support Library. If you are using Ant or Eclipse, make sure you include the v4 Support Library as part of this library's classpath.
. Jadi masuk akal untuk tidak memasukkan AppcompatV7
jawaban.
Saya tidak ingin menyertakan pustaka Dukungan hanya untuk getColor , jadi saya menggunakan sesuatu seperti
public static int getColorWrapper(Context context, int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getColor(id);
} else {
//noinspection deprecation
return context.getResources().getColor(id);
}
}
Saya kira kode harus bekerja dengan baik, dan yang usang getColor
tidak dapat hilang dari API <23.
Dan inilah yang saya gunakan di Kotlin:
/**
* Returns a color associated with a particular resource ID.
*
* Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].
*/
@Suppress("DEPRECATION")
@ColorInt
fun getColorHelper(context: Context, @ColorRes id: Int) =
if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);
Di Android Marshmallow banyak metode yang usang.
Misalnya, untuk mendapatkan penggunaan warna
ContextCompat.getColor(context, R.color.color_name);
Juga untuk menggunakan drawable
ContextCompat.getDrawable(context, R.drawable.drawble_name);
Untuk semua pengguna Kotlin di luar sana:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
. Variabel "itu" bisa berupa apa saja, tetapi harus berupa Konteks .
it
dalam hal ini context
, karena saya gunakan context?.let {
untuk memeriksa apakah context
tidak nol. Fungsi getColor()
hanya menerima konteks yang bukan nol. Baca lebih lanjut di sini tentang let
dan bagaimana menggunakannya: kotlinlang.org/docs/reference/scope-functions.html#let
Di RecyclerView Anda di Kotlin
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(t: YourObject, listener: OnItemClickListener.YourObjectListener) = with(itemView) {
textViewcolor.setTextColor(ContextCompat.getColor(itemView.context, R.color.colorPrimary))
textViewcolor.text = t.name
}
}
Gunakan getColor(Resources, int, Theme)
metode dari ResourcesCompat
dari Perpustakaan Dukungan Android.
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
Saya pikir itu mencerminkan pertanyaan Anda lebih baik daripada getColor(Context, int)
yang ContextCompat
sejak Anda tanyakan Resources
. Sebelum API level 23, tema tidak akan diterapkan dan metode ini memanggil, getColor(int)
tetapi Anda tidak akan memiliki peringatan yang sudah usang. Temanya juga mungkin null
.
Jika Anda tidak perlu sumber dayanya, gunakan parseColor(String)
:
Color.parseColor("#cc0066")
Jika mingetColor()
Anda saat ini. Level API 23, Anda cukup menggunakan seperti yang kami gunakan untuk mendapatkan sumber daya string dengan getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
Anda dapat membatasi untuk Tingkat API di bawah 23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
tetapi untuk membuatnya sederhana, Anda dapat melakukan seperti di bawah ini sebagai jawaban yang diterima:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
Dari Sumber Daya .
Dari ContextCompat AndroidX .
Saya juga frustrasi. Kebutuhan saya sangat mudah. Yang saya inginkan adalah warna ARGB dari sumber daya, jadi saya menulis metode statis sederhana.
protected static int getARGBColor(Context c, int resId)
throws Resources.NotFoundException {
TypedValue color = new TypedValue();
try {
c.getResources().getValue(resId, color, true);
}
catch (Resources.NotFoundException e) {
throw(new Resources.NotFoundException(
String.format("Failed to find color for resourse id 0x%08x",
resId)));
}
if (color.type != TYPE_INT_COLOR_ARGB8) {
throw(new Resources.NotFoundException(
String.format(
"Resourse id 0x%08x is of type 0x%02d. Expected TYPE_INT_COLOR_ARGB8",
resId, color.type))
);
}
return color.data;
}