Wie andere bereits erwähnt haben, gibt es etwas, von AndroidViewModel
dem Sie ableiten können, um die App zu erhalten, Context
aber von dem, was ich in den Kommentaren erfahre, versuchen Sie, @drawable
s aus Ihrem Inneren heraus zu manipulierenViewModel
was den Zweck von MVVM zunichte macht.
Im Allgemeinen legt die Notwendigkeit, ein Context
in Ihrem ViewModel
fast universellen zu haben, nahe, dass Sie überlegen sollten, wie Sie die Logik zwischen Ihrem View
s und aufteilen ViewModels
.
Anstatt ViewModel
Drawables 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 View
Aufgabe 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 Enum
Wert in übersetzt, um unhandliche Logik in der Layoutdatei zu vermeidenR.drawable.*
(z. B. Kartenanzüge)
Oder Sie benötigen die Context
Komponente für eine Komponente, die Sie in Ihrem verwenden ViewModel
. Erstellen Sie dann die Komponente außerhalb von ViewModel
und übergeben Sie sie. Sie können DI oder Singletons verwenden oder die Context
abhängige Komponente direkt vor dem Initialisieren von ViewModel
in Fragment
/ erstellen Activity
.
Warum sich die Mühe machen: Context
ist eine Android-spezifische Sache, und abhängig von denen in ViewModel
s 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.
AndroidViewModel
aber esCannot create instance exception
bekommt, können Sie sich auf meine Antwort stackoverflow.com/a/62626408/1055241