他の人がAndroidViewModel言ったように、アプリを入手するために導き出すことができるものがありますContextが、私がコメントで集めたものから、あなたは目的のMVVMを打ち負かす@drawableあなたの内部からsを操作しようとしてViewModelいます。
一般的には、持っている必要がContextあなたにViewModelほとんど一般には、あなたがあなたの間の論理分割の仕方を再考検討すべき示唆View秒とViewModels。
ViewModelドローアブルを解決してアクティビティ/フラグメントにフィードする代わりに、フラグメント/アクティビティに、が所有するデータに基づいてドローアブルをジャグリングさせることを検討してくださいViewModel。たとえば、オン/オフ状態のビューに表示するさまざまなドローアブルが必要です。これViewModelは(おそらくブール値の)状態を保持する必要がありViewますが、それに応じてドローアブルを選択するのはビジネスです。
DataBindingを使用すると非常に簡単に実行できます。
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
より多くの状態とドローアブルがある場合、レイアウトファイルの扱いにくいロジックを回避するために、たとえば値を(カードスーツなど)に変換するカスタムBindingAdapterを作成できます。EnumR.drawable.*
または、Context内部で使用するコンポーネントが必要な場合もあります。ViewModel次に、外部でコンポーネントを作成してViewModel渡します。DIまたはシングルトンを使用するかContext、ViewModelin Fragment/を初期化する直前に依存コンポーネントを作成できますActivity。
なぜわざわざ:ContextAndroid固有のものであり、ViewModelsのそれらに依存することは悪い習慣です:それらはユニットテストの邪魔になります。一方、独自のコンポーネント/サービスインターフェイスは完全に制御できるため、テスト用に簡単にモックすることができます。
AndroidViewModelが、取得Cannot create instance exception後、あなたは私のこの回答を参照することができstackoverflow.com/a/62626408/1055241