Bagaimana Anda mendapatkan objek Drawable dari id sumber daya dalam paket android?

156

Saya perlu mendapatkan objek Drawable untuk ditampilkan pada tombol gambar. Apakah ada cara untuk menggunakan kode di bawah ini (atau sesuatu seperti itu) untuk mendapatkan objek dari paket android.R.drawable. *?

misalnya jika drawableId adalah android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)
Blaskovicz
sumber

Jawaban:

222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);
Pete Houston
sumber
Saya juga menemukan bahwa menggunakan konteks aplikasi tampaknya berhasil, terima kasih.
Blaskovicz
20
Pada API 22. getDrawable(int id)sudah usang. Gunakan getDrawable(int id, Resources.Theme theme)sebagai gantinya. Metode ini getTheme()harus membantu.
Isaac Zais
1
Saya punya sedikit keraguan. Dalam kode ini "Metode getDrawable (int) dari tipe Resources sudah usang". Menurut satu jawaban SO 1. Apakah salah menggunakan metode atau kelas yang ditinggalkan di Jawa? Dari definisi usang: "Unsur program beranotasi @Deprecated adalah salah satu yang tidak disarankan oleh pemrogram, biasanya karena berbahaya, atau karena ada alternatif yang lebih baik." Apa alternatif yang lebih baik untuk ini.
Pembunuh
107

Pada API 21 , Anda harus menggunakan getDrawable(int, Theme)metode alih-alih getDrawable(int), karena memungkinkan Anda untuk mengambil drawableobjek yang terkait dengan tertentu resource IDuntuk yang diberikan screen density/theme. Memanggil deprecated getDrawable(int)metode ini sama dengan memanggil getDrawable(int, null).

Anda harus menggunakan kode berikut dari perpustakaan dukungan sebagai gantinya:

ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

Menggunakan metode ini setara dengan menelepon:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}
Muhammad Soliman
sumber
context.getDrawable(id);tampaknya setara denganresources.getDrawable(id, context.getTheme());
ErickBergmann
Ini dapat dilakukan dalam satu baris jika Anda memiliki perpustakaan dukungan:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col
9

Pada API 21, Anda juga dapat menggunakan:

   ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

Dari pada ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

Zain
sumber
2
Bisakah Anda memberikan penjelasan lebih lanjut untuk pilihan ini
Nyandika
3

cara terbaik adalah

 button.setBackgroundResource(android.R.drawable.ic_delete);

ATAU ini untuk Gambar kiri dan sesuatu seperti itu untuk kanan dll.

int imgResource = R.drawable.left_img;
button.setCompoundDrawablesWithIntrinsicBounds(imgResource, 0, 0, 0);

dan

getResources().getDrawable() sekarang sudah ditinggalkan

Inzimam Tariq IT
sumber
0

Dari API 21 getDrawable(int id)sudah usang. Jadi sekarang Anda perlu menggunakannya

ResourcesCompat.getDrawable(context.getResources(), R.drawable.img_user, null)

Tapi Cara terbaik untuk melakukannya adalah: Anda harus membuat satu kelas umum untuk mendapatkan gambar dan warna karena jika ada hal yang berubah atau usang di masa depan maka Anda tidak perlu mengubah di mana-mana dalam proyek Anda. Anda hanya perlu mengubah metode ini

object ResourceUtils {
    fun getColor(context: Context, color: Int): Int {
        return ResourcesCompat.getColor(context.getResources(), color, null)
    }

    fun getDrawable(context: Context, drawable: Int): Drawable? {
        return ResourcesCompat.getDrawable(context.getResources(), drawable, null)
    }
}

gunakan metode ini seperti:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);
Sanjayrajsinh
sumber
0

Mengikuti solusi untuk programmer Kotlin (dari API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
Jens van de Mötter
sumber