Jak wspominali inni, AndroidViewModel
można z niej czerpać, aby pobrać aplikację, Context
ale z tego, co zebrałem w komentarzach, próbujesz manipulować @drawable
s od wewnątrz, ViewModel
co pokonuje cel MVVM.
Ogólnie rzecz biorąc, potrzeba posiadania litery „a” Context
w swoim ViewModel
prawie zawsze sugeruje, że powinieneś rozważyć przemyślenie tego, jak podzielić logikę na swoje „ View
s” i „ ViewModels
.
Zamiast ViewModel
rozwią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 ViewModel
powinno posiadać stan (prawdopodobnie boolowski), ale View
zadaniem 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, Enum
wartość na R.drawable.*
(np. Kolory kart)
A może potrzebujesz Context
jakiegoś komponentu, którego używasz w swoim ViewModel
- następnie utwórz komponent poza ViewModel
i przekaż go. Możesz użyć DI lub singletonów, lub utworzyć Context
komponent zależny bezpośrednio przed zainicjowaniem ViewModel
in Fragment
/ Activity
.
Po co zawracać sobie głowę: Context
to kwestia specyficzna dla Androida, a uzależnienie od nich ViewModel
jest 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.
AndroidViewModel
ale dostajeCannot create instance exception
, możesz odnieść się do mojej odpowiedzi stackoverflow.com/a/62626408/1055241