Cara membuat Drawable from resource


283

Saya memiliki gambar res/drawable/test.png(R.drawable.test).
Saya ingin meneruskan gambar ini ke fungsi yang menerima Drawable, misalnya mButton.setCompoundDrawables().

Jadi bagaimana saya bisa mengubah sumber daya gambar ke Drawable?

Jawaban:


567

Aktivitas Anda harus memiliki metode getResources. Melakukan:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );

2
Jika Anda menginginkan ini di luar kelas Activity, Anda harus menemukan cara lain untuk mencapai Konteks tempat getResources () tinggal; jawaban ini merekomendasikan untuk meneruskannya ke konstruktor
rymo

50
Pada API versi 21 metode ini sudah usang dan Anda harus diganti dengan: Drawable drawable = ResourcesCompat.getDrawable (getResources (), page.getImageId (), null);
Boren

3
@ Boren apakah itu sama dengan menggunakan ContextCompat.getDrawable (ini, R.drawable.icon) ;?
Zach

2
Tidak ada saran di atas yang berfungsi jika R.drawable.icon adalah gambar vektor.
FractalBob

4
JANGAN GUNAKAN INI JIKA ANDA MENGGUNAKAN VECTOR DRAWABLE. Gunakan AppCompatResources.getDrawable (konteks, R.drawable.icon) sebagai gantinya.
Dhaval Patel

136

Kode ini sudah usang:

Drawable drawable = getResources().getDrawable( R.drawable.icon );

Gunakan ini sebagai gantinya:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);

11
Ketahuilah bahwa ini akan menerapkan tema dari konteks yang diberikan. Jika Anda ingin memastikan tidak ada tema yang digunakan, Anda dapat menggunakan ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(di mana param ke-3 adalah instance Tema opsional).
vaughandroid

23

The getDrawable (int id)Metode disusutkan sebagai API 22.

Sebaliknya, Anda harus menggunakan getDrawable (int id, Resources.Theme theme)untuk API 21+

Kode akan terlihat seperti ini.

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
} else {
    myDrawable = context.getResources().getDrawable(id);
}

mengapa tidak lulus nol untuk setiap api? Plus: Apakah Anda yakin bahwa null adalah opsi terbaik?
Jonathanrz

1
GetDrawable (int id, Resources.Theme theme) tidak muncul sampai API 21.
Chris Stillwell

ataugetResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone

13

Saya hanya ingin menambahkan bahwa jika Anda mendapatkan pesan "usang" saat menggunakan getDrawable (...), Anda harus menggunakan metode berikut dari pustaka dukungan.

ContextCompat.getDrawable(getContext(),R.drawable.[name])

Anda tidak harus menggunakan getResources () saat menggunakan metode ini.

Ini setara dengan melakukan sesuatu seperti

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
} else {
    mDrawable = getResources().getDrawable(R.id.[name]);
}

Ini berfungsi baik pada versi pre dan post Lollipop.


4

Dapatkan Drawable dari sumber daya vektor terlepas dari, apakah vektornya atau tidak:

AppCompatResources.getDrawable(context, R.drawable.icon);

Catatan:
ContextCompat.getDrawable(context, R.drawable.icon); akan menghasilkan android.content.res.Resources$NotFoundExceptionsumber daya vektor.


3

Jika Anda mencoba untuk mendapatkan gambar dari tampilan tempat gambar diatur sebagai,

ivshowing.setBackgroundResource(R.drawable.one);

maka drawable hanya akan mengembalikan nilai nol dengan kode berikut ...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

Jadi, lebih baik mengatur gambar dengan kode berikut, jika Anda ingin mengambil gambar dari tampilan tertentu.

 ivshowing.setImageResource(R.drawable.one);

hanya dengan drawable yang akan kita konversi dengan tepat.


1

Jika Anda mewarisi dari sebuah fragmen yang dapat Anda lakukan:

Drawable drawable = getActivity().getDrawable(R.drawable.icon)

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.