Как уже упоминалось, AndroidViewModel
вы можете получить приложение, Context
но из того, что я собираю в комментариях, вы пытаетесь манипулировать @drawable
s изнутри, ViewModel
что побеждает цель MVVM.
В общем, необходимость иметь Context
в вашем ViewModel
почти всегда предполагает, что вам следует подумать о переосмыслении того, как вы разделяете логику между вашими View
s и 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
s - плохая практика: они мешают модульному тестированию. С другой стороны, ваши собственные интерфейсы компонентов / сервисов полностью под вашим контролем, поэтому вы можете легко смоделировать их для тестирования.
AndroidViewModel
но получает его,Cannot create instance exception
вы можете обратиться к моему этому ответу stackoverflow.com/a/62626408/1055241