Seperti yang telah disebutkan orang lain, ada AndroidViewModel
yang dapat Anda peroleh dari untuk mendapatkan aplikasi Context
tetapi dari apa yang saya kumpulkan di komentar, Anda mencoba memanipulasi @drawable
dari dalam Anda ViewModel
yang mengalahkan tujuan MVVM.
Secara umum, kebutuhan untuk memiliki a Context
dalam Anda ViewModel
hampir secara universal menyarankan agar Anda mempertimbangkan untuk memikirkan kembali bagaimana Anda membagi logika antara View
s dan ViewModels
.
Daripada ViewModel
menyelesaikan drawable dan memasukkannya ke Aktivitas / Fragmen, pertimbangkan untuk meminta Fragmen / Aktivitas menyulap drawable berdasarkan data yang dimiliki oleh ViewModel
. Misalnya, Anda memerlukan drawable yang berbeda untuk ditampilkan dalam tampilan untuk status aktif / nonaktif - inilah ViewModel
yang harus menahan status (mungkin boolean), tetapi View
tugasnya adalah untuk memilih drawable yang sesuai.
Ini dapat dilakukan dengan cukup mudah dengan DataBinding :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
Jika Anda memiliki lebih banyak status dan sumber daya dapat digambar, untuk menghindari logika yang tidak berguna dalam file tata letak, Anda dapat menulis BindingAdapter khusus yang menerjemahkan, katakanlah, sebuah Enum
nilai ke dalam R.drawable.*
(mis. Setelan kartu)
Atau mungkin Anda memerlukan Context
untuk beberapa komponen yang Anda gunakan di dalam Anda ViewModel
- kemudian, buat komponen di luar ViewModel
dan kirimkan. Anda dapat menggunakan DI, atau singletons, atau membuat Context
komponen -dependen tepat sebelum inisialisasi ViewModel
in Fragment
/ Activity
.
Mengapa repot: Context
adalah hal khusus Android, dan bergantung pada mereka ViewModel
adalah praktik yang buruk: mereka menghalangi pengujian unit. Di sisi lain, komponen / antarmuka layanan Anda sendiri sepenuhnya di bawah kendali Anda sehingga Anda dapat dengan mudah mengejeknya untuk pengujian.
AndroidViewModel
tetapi mendapatkanCannot create instance exception
maka Anda dapat merujuk ke jawaban saya ini stackoverflow.com/a/62626408/1055241