正如其他人提到的那样AndroidViewModel,您可以从中获取要获取的应用程序,Context但是根据我在评论中收集的信息,您正在尝试@drawable从内部操纵s,ViewModel从而破坏了MVVM的用途。
一般而言,几乎所有人都需要有一个Context,这ViewModel表明您应该考虑重新考虑如何在Views和ViewModels。
与其让ViewModel解析的可绘制对象提供给活动/片段,不如考虑使片段/活动根据拥有的数据来处理可绘制对象ViewModel。假设您需要在可打开/关闭状态的视图中显示不同的可绘制对象-ViewModel应该保持(可能是布尔)状态的是可绘制对象,但是View是可绘制对象,但是相应地选择可绘制对象是我们的职责。
使用DataBinding可以很容易地完成它:
<ImageView
...
app:src="@{viewModel.isOn ? @drawable/switch_on : @drawable/switch_off}"
/>
如果您有更多的状态和可绘制对象,为避免布局文件中的逻辑笨拙,您可以编写一个自定义的BindingAdapter,将Enum值转换为R.drawable.*(例如,卡片套装)
或者,也许您需要在Context内部使用的某个组件,ViewModel然后在之外创建该组件ViewModel并将其传递。您可以Context在初始化ViewModelin Fragment/之前使用DI或单例,或创建依赖于组件的组件Activity。
为什么要打扰:Context是Android专用的东西,并且依赖于ViewModels是一个不好的做法:它们妨碍了单元测试。另一方面,您自己的组件/服务接口完全在您的控制之下,因此您可以轻松地模拟它们以进行测试。
AndroidViewModel但要获取,Cannot create instance exception您可以参考我的这个答案stackoverflow.com/a/62626408/1055241