Android getResources (). GetDrawable () API usang 22


699

Dengan Android 22 API baru getResources().getDrawable()sekarang sudah usang. Sekarang pendekatan terbaik adalah menggunakan saja getDrawable().

Apa yang berubah?


Bisakah Anda menentukan pertanyaan Anda? Benar bahwa metode getDrawable (int id)kelas Resourcessudah usang. Anda sekarang harus menggunakan metode getDrawable (int id, Resources.Theme theme)dengan parameter tema baru.
kode monyet

1
ContextCompat.getDrawable (konteks, R.color.color_name)
Ashokchakravarthi Nagarajan

Anda dapat melihat posting blog saya tentang hal ini untuk penjelasan yang lebih menyeluruh tentang mengapa keduanya Resources#getDrawable(int)dan Resources#getColor(int)sudah usang.
Alex Lockwood

1
Google harus melakukan perbaikan cepat untuk setiap fungsi yang tidak digunakan lagi. Saya membuat posting tentang itu di sini: code.google.com/p/android/issues/detail?id=219495
pengembang android

Jawaban:


1027

Anda memiliki beberapa opsi untuk menangani penghinaan ini dengan cara yang benar (dan bukti masa depan ), tergantung pada jenis gambar apa yang Anda muat:


A) dapat digambar dengan atribut tema

ContextCompat.getDrawable(getActivity(), R.drawable.name);

Anda akan mendapatkan Drawable yang ditata sesuai yang diperintahkan tema Aktivitas Anda. Ini mungkin yang Anda butuhkan.


B) dapat digambar tanpa atribut tema

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

Anda akan mendapatkan drawable unstyled Anda dengan cara lama. Harap Catatan: ResourcesCompat.getDrawable()ini tidak ditinggalkan!


EXTRA) dapat digambar dengan atribut tema dari tema lain

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

Aplikasi saya mogok menggunakan saran B. Tidak suka panggilan Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null);
FractalBob

Saya menyatakan seperti ini: public static void setImageButtonEnabled (Konteks ctxt, boolean diaktifkan, item ImageButton, int iconResId) {item.setEnabled (diaktifkan); Drawable originalIcon = ResourcesCompat.getDrawable (ctxt.getResources (), iconResId, null); Ikon yang dapat ditarik = diaktifkan? originalIcon: convertDrawableToGrayScale (originalIcon); item.setImageDrawable (ikon); } dan menyebutnya seperti ini: Utility.setImageButtonEnabled (getContext (), false, back, R.drawable.arrow_left);
FractalBob

Lebih tepatnya, kerusakan itu tampaknya terjadi karena ikon saya adalah gambar vektor.
FractalBob

1
versi xamarin: ResourcesCompat.GetDrawable (Resources, Resource.Drawable.name, null);
Brian

Saya menambahkan satu kata lagi kepada Anda , ContextCompat.getColor (konteks, warna) juga dapat membantu Anda ...
BertKing

746

Sunting: lihat posting blog saya pada subjek untuk penjelasan yang lebih lengkap


Anda harus menggunakan kode berikut dari perpustakaan dukungan sebagai gantinya:

ContextCompat.getDrawable(context, R.drawable.***)

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);
}

Pada API 21, Anda harus menggunakan getDrawable(int, Theme)metode alih-alih getDrawable(int), karena memungkinkan Anda untuk mengambil objek yang dapat digambar yang terkait dengan ID sumber daya tertentu untuk kepadatan / tema layar yang diberikan. Memanggil getDrawable(int)metode yang sudah usang sama dengan memanggil getDrawable(int, null).


8
Saya pikir OP juga merujuk pada getDrawable (int id)metode Contextkelas. Ini sama dengan getResources().getDrawable(id, getTheme());dan juga menggunakan API baru.
kode monyet

9
Menurut dokumentasi, min API level 21 diperlukan untuk digunakan getDrawable(int, Resources.Theme).
Pangeran

@Prince Metode ini ditambahkan dalam API 21 tetapi tidak dihentikan sampai API 22. :)
Alex Lockwood

Android doc juga merekomendasikan penggunaan metode Context :: getDrawable (int) tetapi karena diperkenalkan hanya di API 21 tampaknya ContextCompat adalah pilihan terbaik.
goRGon

Jawaban ini tidak berfungsi dengan file .svg, dalam versi yang lebih lama dari API 21. Ada bug di perpustakaan.
Jorge Rodríguez

141

Ganti baris ini: getResources().getDrawable(R.drawable.your_drawable)

dengan ResourcesCompat.getDrawable(getResources(), R.drawable.your_drawable, null)

EDIT

ResourcesCompatjuga sudah usang sekarang. Tetapi Anda dapat menggunakan ini:

ContextCompat.getDrawable(this, R.drawable.your_drawable)(Ini thiskonteksnya)

untuk lebih jelasnya ikuti tautan ini: ContextCompat


2
Thats sekarang sudah tidak lagi digunakan: plus.google.com/+BenjaminWeiss/posts/M1dYFaobyBM
Xyaren


2
Itu tidak mengatakan dalam tautan yang ResourcesCompatsudah usang. Seharusnya bekerja dengan baik.
Jacob R

apa yang harus ditulis dalam "drawable Anda" jika saya ingin memasukkan gambar ke tampilan daftar pada mengklik daftar barang yang disimpan dalam
drawable

29

getResources().getDrawable() sudah tidak digunakan lagi di API level 22. Sekarang kita harus menambahkan tema:

getDrawable (int id, Resources.Theme theme) (Ditambahkan di API level 21)

Ini adalah sebuah contoh:

myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));

Ini adalah contoh cara memvalidasi untuk versi yang lebih baru:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage, getApplicationContext().getTheme()));
   } else { 
     myImgView.setImageDrawable(getResources().getDrawable(R.drawable.myimage));
}

Build.VERSION_CODES.LOLLIPOP is API 21, Sehingga tidak hal ini harus if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)atau if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)? Sudahlah. Dari bawah "Metode ini ditambahkan dalam API 21 tetapi tidak dihentikan sampai API 22. :)"
Mark Cramer

2

Kamu bisa menggunakan

ContextCompat.getDrawable(getApplicationContext(),R.drawable.example);

itu bekerja untuk saya


Menggunakan konteks aplikasi untuk memuat crash yang dapat digambar vektor pada pre lollipop. Adakah perbaikan untuk ini?
muthuraj

1
@ muthuraj Saya tidak ingat pengujian saya untuk kode dengan case lollipop, tetapi Anda dapat mencoba getActivity () atau getResources () sebagai gantinya, apakah itu cocok dengan kode Anda?
Dasser Basyouni

Saya menggunakan pola MVVM dan saya perlu mengembang drawables di dalam ViewModels yang tidak memiliki konteks aktivitas. Ini hanya memiliki konteks aplikasi. Itulah masalah saya.
muthuraj

1

Hanya contoh bagaimana saya memperbaiki masalah dalam array untuk memuat listView, semoga membantu.

 mItems = new ArrayList<ListViewItem>();
//    Resources resources = getResources();

//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.az_lgo), getString(R.string.st_az), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.ca_lgo), getString(R.string.st_ca), getString(R.string.all_nums)));
//    mItems.add(new ListViewItem(resources.getDrawable(R.drawable.co_lgo), getString(R.string.st_co), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.az_lgo, null), getString(R.string.st_az), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.ca_lgo, null), getString(R.string.st_ca), getString(R.string.all_nums)));
    mItems.add(new ListViewItem(ResourcesCompat.getDrawable(getResources(), R.drawable.co_lgo, null), getString(R.string.st_co), getString(R.string.all_nums)));

1

Coba ini:

public static List<ProductActivity> getCatalog(Resources res){
    if(catalog == null) {
        catalog.add(new Product("Dead or Alive", res
                .getDrawable(R.drawable.product_salmon),
                "Dead or Alive by Tom Clancy with Grant Blackwood", 29.99));
        catalog.add(new Product("Switch", res
                .getDrawable(R.drawable.switchbook),
                "Switch by Chip Heath and Dan Heath", 24.99));
        catalog.add(new Product("Watchmen", res
                .getDrawable(R.drawable.watchmen),
                "Watchmen by Alan Moore and Dave Gibbons", 14.99));
    }
}

Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya.
Donald Duck


1

getDrawable (int drawable) sudah tidak digunakan lagi di API level 22. Untuk referensi lihat tautan ini .

Sekarang untuk menyelesaikan masalah ini kita harus melewati konstructer baru bersama dengan id seperti: -

getDrawable(int id, Resources.Theme theme)

Untuk Solusi Lakukan seperti ini: -

Di Jawa: -

ContextCompat.getDrawable(getActivity(), R.drawable.name);   

atau

 imgProfile.setImageDrawable(getResources().getDrawable(R.drawable.img_prof, getApplicationContext().getTheme()));

Di Kotlin: -

rel_week.background=ContextCompat.getDrawable(this.requireContext(), R.color.colorWhite)

atau

 rel_day.background=resources.getDrawable(R.drawable.ic_home, context?.theme)

Semoga ini bisa membantu Anda. Terima kasih.


Perlu disebutkan, bahwa getDrawable (DrawableRes int id, Theme theme) dapat mengeluarkan pengecualian jika sumber daya tidak ditemukan sementara, getDrawable (Konteks konteks, int id) adalah nullable, sehingga harus dikembalikan dengan Drawable? di Kotlin.
Pitos

0

id api level 14

marker.setIcon(ResourcesCompat.getDrawable(getResources(), R.drawable.miubicacion, null));

Anda harus memberikan sedikit lebih banyak konteks di sekitar jawaban Anda.
Nicolas Grenié

0

Sekarang Anda perlu menerapkan seperti ini

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //>= API 21
        //
    } else {
        //
    }

Mengikuti satu baris kode saja sudah cukup, semuanya akan ditangani oleh ContextCompat.getDrawable

ContextCompat.getDrawable(this, R.drawable.your_drawable_file)

0

Untuk beberapa yang masih mendapatkan masalah ini untuk dipecahkan bahkan setelah menerapkan saran dari utas ini (saya dulunya seperti itu) tambahkan baris ini pada kelas Aplikasi Anda, metode onCreate ()

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)

Seperti yang disarankan di sini dan di sini kadang-kadang ini diperlukan untuk mengakses vektor dari sumber daya terutama ketika Anda berurusan dengan item menu, dll


0

Di Kotlin Anda dapat menggunakan ekstensi

fun Context.getMyDrawable(id : Int) : Drawable?{

    return  ContextCompat.getDrawable(this, id)
}

lalu gunakan like

context.getMyDrawable(R.drawable.my_icon)

-2

Build.VERSION_CODES.LOLLIPOP sekarang harus diubah menjadi BuildVersionCodes.Lollipop yaitu:

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder, Context.Theme);
} else {
    this.Control.Background = this.Resources.GetDrawable(Resource.Drawable.AddBorder);
}

Bukankah BuildVersionCodeskelas khusus untuk Xamarin?
Ted Hopp
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.