Android ViewModel用于自定义视图

qba*_*ait 8 android android-custom-view android-architecture-components

我想重构我的自定义视图以使用android体系结构组件。但是,我看到

ViewModelProviders.of(...)
Run Code Online (Sandbox Code Playgroud)

只接受活动或片段。任何想法如何使其工作?我应该使用片段而不是自定义视图吗?

Mic*_*cer 0

可以在 View 中获取 ViewModel 实例,但不建议这样做。根据这篇文章

虽然在 Activity 或 Fragment 中获取 ViewModel 很容易,但在 View 中获取此实例却并不简单。这背后的主要原因是视图应该独立于所有处理,即使您的所有逻辑都位于 ViewModel 内,但您在视图内访问该 ViewModel 的事实使其依赖于不应该依赖的东西。控制 View 的推荐方法是根据 Fragment 或 Activity 中 ViewModel 的状态向其传递参数。

重点是尝试从上下文中获取 Activity:

override val activity: FragmentActivity by lazy {  
    try {
        context as FragmentActivity
    } catch (exception: ClassCastException) {
        throw ClassCastException("Please ensure that the provided Context is a valid FragmentActivity")
    }
}
override var viewModel = ViewModelProvider(activity).get(SharedViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

正如所提到的想法,如果可能的话,我会尽量避免这种方法。