他の人が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を作成できます。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