Wie andere bereits erwähnt haben, gibt es etwas, von AndroidViewModeldem Sie ableiten können, um die App zu erhalten, Contextaber von dem, was ich in den Kommentaren erfahre, versuchen Sie, @drawables aus Ihrem Inneren heraus zu manipulierenViewModel was den Zweck von MVVM zunichte macht.
Im Allgemeinen legt die Notwendigkeit, ein Contextin Ihrem ViewModelfast universellen zu haben, nahe, dass Sie überlegen sollten, wie Sie die Logik zwischen Ihrem Views und aufteilen ViewModels.
Anstatt ViewModelDrawables aufzulösen und sie der Aktivität / dem Fragment zuzuführen, sollten Sie in Betracht ziehen, dass das Fragment / die Aktivität die Drawables auf der Grundlage der Daten jongliert, über die das verfügt ViewModel. Angenommen, Sie müssen verschiedene Drawables in einer Ansicht für den Ein / Aus-Status anzeigen - es ist das ViewModel, das den (wahrscheinlich booleschen) Status enthalten sollte, aber es ist ViewAufgabe des Drawables, das Drawable entsprechend auszuwählen.
Mit DataBinding geht das ganz einfach :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
Wenn Sie mehr Status und Drawables haben, können Sie einen benutzerdefinierten BindingAdapter schreiben , der beispielsweise einen EnumWert in übersetzt, um unhandliche Logik in der Layoutdatei zu vermeidenR.drawable.* (z. B. Kartenanzüge)
Oder Sie benötigen die ContextKomponente für eine Komponente, die Sie in Ihrem verwenden ViewModel. Erstellen Sie dann die Komponente außerhalb von ViewModelund übergeben Sie sie. Sie können DI oder Singletons verwenden oder die Contextabhängige Komponente direkt vor dem Initialisieren von ViewModelin Fragment/ erstellen Activity.
Warum sich die Mühe machen: Contextist eine Android-spezifische Sache, und abhängig von denen in ViewModels ist eine schlechte Praxis: Sie stehen Unit-Tests im Wege. Auf der anderen Seite haben Sie Ihre eigenen Komponenten- / Serviceschnittstellen vollständig unter Ihrer Kontrolle, sodass Sie sie zum Testen leicht verspotten können.
AndroidViewModelaber esCannot create instance exceptionbekommt, können Sie sich auf meine Antwort stackoverflow.com/a/62626408/1055241