Comme d'autres l'ont mentionné, AndroidViewModel
vous pouvez dériver pour obtenir l'application, Context
mais d'après ce que je comprends dans les commentaires, vous essayez de manipuler les @drawable
s depuis votre intérieur, ViewModel
ce qui va à l'encontre de l'objectif MVVM.
En général, la nécessité d'avoir un Context
dans votre ViewModel
presque universellement suggère que vous devriez envisager de repenser la façon dont vous divisez la logique entre votre View
s et ViewModels
.
Au lieu de ViewModel
résoudre les drawables et de les alimenter dans l'activité / le fragment, envisagez de demander au fragment / activité de jongler avec les drawables en fonction des données possédées par le ViewModel
. Disons que vous avez besoin de différents drawables pour être affichés dans une vue pour un état activé / désactivé - c'est celui ViewModel
qui doit contenir l'état (probablement booléen) mais c'est View
à lui de sélectionner le dessinable en conséquence.
Cela peut être fait assez facilement avec DataBinding :
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
Si vous avez plus d'états et de dessinables, pour éviter une logique lourde dans le fichier de mise en page, vous pouvez écrire un BindingAdapter personnalisé qui traduit, par exemple, une Enum
valeur en R.drawable.*
(par exemple, des combinaisons de cartes)
Ou peut-être avez-vous besoin du Context
pour un composant que vous utilisez dans votre ViewModel
- puis, créez le composant en dehors de ViewModel
et transmettez-le. Vous pouvez utiliser DI, ou des singletons, ou créer le Context
composant -dépendant juste avant d'initialiser le ViewModel
in Fragment
/ Activity
.
Pourquoi s'embêter: Context
c'est une chose spécifique à Android, et en fonction de ceux de ViewModel
s est une mauvaise pratique: ils font obstacle aux tests unitaires. D'autre part, vos propres interfaces composant / service sont entièrement sous votre contrôle, vous pouvez donc facilement les simuler pour les tester.
AndroidViewModel
mais obtenant,Cannot create instance exception
vous pouvez vous référer à ma réponse stackoverflow.com/a/62626408/1055241