正如其他人提到的那样AndroidViewModel
,您可以从中获取要获取的应用程序,Context
但是根据我在评论中收集的信息,您正在尝试@drawable
从内部操纵s,ViewModel
从而破坏了MVVM的用途。
一般而言,几乎所有人都需要有一个Context
,这ViewModel
表明您应该考虑重新考虑如何在View
s和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
在初始化ViewModel
in Fragment
/之前使用DI或单例,或创建依赖于组件的组件Activity
。
为什么要打扰:Context
是Android专用的东西,并且依赖于ViewModel
s是一个不好的做法:它们妨碍了单元测试。另一方面,您自己的组件/服务接口完全在您的控制之下,因此您可以轻松地模拟它们以进行测试。
AndroidViewModel
但要获取,Cannot create instance exception
您可以参考我的这个答案stackoverflow.com/a/62626408/1055241