Як вже згадували інші, AndroidViewModel
ви можете отримати висновок, щоб отримати програму, Context
але з того, що я збираю в коментарях, ви намагаєтесь маніпулювати @drawable
s з вашогоViewModel
що перемагає мету MVVM.
Загалом, потреба мати Context
в собі ViewModel
майже повсюдно наводить на думку, що вам слід подумати про переосмислення того, як ви розподіляєте логіку між своїми View
і ViewModels
.
Замість того, щоб ViewModel
вирішувати малюнки та подавати їх до Activity / Fragment, подумайте про те, щоб Fragment / Activity жонглювали малюнки на основі даних, якими володіє ViewModel
. Скажімо, вам потрібні різні малюнки, які відображатимуться у поданні для стану увімкнення / вимкнення - це те, ViewModel
що повинно містити (можливо, логічне) стан, але справа в тому View
, щоб вибрати відповідний малюнок.
Це можна зробити досить просто за допомогою DataBinding :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
Якщо у вас більше станів і малюнків, щоб уникнути громіздкої логіки у файлі макета, ви можете написати власний BindingAdapter, який переводить, скажімо, Enum
значення уR.drawable.*
(наприклад, масті карт)
Або, можливо, вам потрібен Context
для якогось компонента, який ви використовуєте у вашому ViewModel
- тоді створіть компонент за межами ViewModel
та передайте його. Ви можете використовувати DI, або одиночні, або створити Context
-залежний компонент безпосередньо перед ініціалізацією ViewModel
in Fragment
/ Activity
.
Навіщо турбуватися: Context
це специфічна для Android річ, і залежно від тих, хто в ViewModel
них, це погана практика: вони заважають модульному тестуванню. З іншого боку, ваші власні інтерфейси компонентів / служб повністю під вашим контролем, тому ви можете легко знущатись над ними для тестування.
AndroidViewModel
але отриматиCannot create instance exception
то ви можете звернутися до цей мій відповідь stackoverflow.com/a/62626408/1055241