Jak wspominali inni, AndroidViewModelmożna z niej czerpać, aby pobrać aplikację, Contextale z tego, co zebrałem w komentarzach, próbujesz manipulować @drawables od wewnątrz, ViewModelco pokonuje cel MVVM.
Ogólnie rzecz biorąc, potrzeba posiadania litery „a” Contextw swoim ViewModelprawie zawsze sugeruje, że powinieneś rozważyć przemyślenie tego, jak podzielić logikę na swoje „ Views” i „ ViewModels.
Zamiast ViewModelrozwiązywać przedmioty do rysowania i przekazywać je do działania / fragmentu, rozważ, aby fragment / aktywność żonglował przedmiotami do rysowania na podstawie danych posiadanych przez ViewModel. Powiedzmy, że potrzebujesz różnych rysunków, które mają być wyświetlane w widoku w stanie włączonym / wyłączonym - to ViewModelpowinno posiadać stan (prawdopodobnie boolowski), ale Viewzadaniem firmy jest wybranie odpowiedniego elementu do rysowania.
Z DataBinding można to zrobić całkiem łatwo :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
Jeśli masz więcej stanów i rysunków, aby uniknąć nieporęcznej logiki w pliku układu, możesz napisać niestandardowy BindingAdapter, który tłumaczy, powiedzmy, Enumwartość na R.drawable.*(np. Kolory kart)
A może potrzebujesz Contextjakiegoś komponentu, którego używasz w swoim ViewModel- następnie utwórz komponent poza ViewModeli przekaż go. Możesz użyć DI lub singletonów, lub utworzyć Contextkomponent zależny bezpośrednio przed zainicjowaniem ViewModelin Fragment/ Activity.
Po co zawracać sobie głowę: Contextto kwestia specyficzna dla Androida, a uzależnienie od nich ViewModeljest złą praktyką: przeszkadzają w testowaniu jednostkowym. Z drugiej strony, Twoje własne interfejsy komponentów / usług są w pełni pod Twoją kontrolą, dzięki czemu możesz łatwo mockować je do testów.
AndroidViewModelale dostajeCannot create instance exception, możesz odnieść się do mojej odpowiedzi stackoverflow.com/a/62626408/1055241