我想在android中使用MVVM架构制作一个自定义视图。首先,我想问,ViewModel是否可以完美地与自定义视图一起工作,就像它在Activity或片段的情况下工作一样?我们可以在自定义视图中从ViewModel提供程序获得ViewModel吗?如果我需要做一个单独的自定义视图,正确的方法是什么?
bvhaajcl1#
一个更好的替代方案是使用新的API view.findViewTreeViewModelStoreOwner(),它为您提供viewModelStoreOwner(如果视图附加到fragment o/w活动,则为Fragment)您可以创建ViewModelProvider,然后获取ViewModel。下面是Kotlin中的代码示例
view.findViewTreeViewModelStoreOwner()
private val viewModel by lazy(LazyThreadSafetyMode.NONE) { ViewModelProvider(viewModelStoreOwner).get(ViewModel::class.java) }
同样,还有其他类似的API,如view.findViewTreeLifecycleOwner()和view.findViewTreeSavedStateRegistryOwner()这是一种更简洁的方法,因为您不必将context类型转换为Activity或Fragment,并且还可以扩展到ViewModelStoreOwner的其他实现。这里需要注意的一点是,与Activity/Fragment相比,视图的生命周期可能较短,因此您可能必须使用基于onAttachedToWindow和onDetachedFromWindow回调的LifecycleRegistry来创建自定义视图生命周期(以便正确管理LiveData订阅
view.findViewTreeLifecycleOwner()
view.findViewTreeSavedStateRegistryOwner()
context
Activity
Fragment
ViewModelStoreOwner
onAttachedToWindow
onDetachedFromWindow
LifecycleRegistry
eh57zj3b2#
**问:**我们可以从ViewModel提供者的自定义视图中获取ViewModel吗?**回答:**简单的回答是:是的,您可以!
ViewModel
但是如何实现?(进一步说明)ViewModelProviders要求context作为Activity或Fragment。因此,您可以使用getContext()从 *CustomView类 * 检索context,在您使用它的地方,它将是Activity/Fragment。将该context强制转换为以下任一类型,并将其提供给ViewModelProviders,ViewModelProviders将为您提供该Activity/Fragment容器的对象。因此,像这样使用,您可以在CustomView和Activity/Fragment之间共享ViewModel。
ViewModelProviders
getContext()
Activity/Fragment
CustomView
LifeCycleObserver
pieyvz9o3#
CustomView: ViewModelStoreOwner{ private var viewModel: YourViewModel override fun getViewModelStore() = ViewModelStore() init{ viewModel = ViewModelProvider(this)[YourViewModel::class.java] } }
就是这样:)
3条答案
按热度按时间bvhaajcl1#
一个更好的替代方案是使用新的API
view.findViewTreeViewModelStoreOwner()
,它为您提供viewModelStoreOwner(如果视图附加到fragment o/w活动,则为Fragment)您可以创建ViewModelProvider,然后获取ViewModel。
下面是Kotlin中的代码示例
同样,还有其他类似的API,如
view.findViewTreeLifecycleOwner()
和view.findViewTreeSavedStateRegistryOwner()
这是一种更简洁的方法,因为您不必将
context
类型转换为Activity
或Fragment
,并且还可以扩展到ViewModelStoreOwner
的其他实现。这里需要注意的一点是,与Activity/Fragment相比,视图的生命周期可能较短,因此您可能必须使用基于
onAttachedToWindow
和onDetachedFromWindow
回调的LifecycleRegistry
来创建自定义视图生命周期(以便正确管理LiveData订阅eh57zj3b2#
**问:**我们可以从ViewModel提供者的自定义视图中获取
ViewModel
吗?**回答:**简单的回答是:是的,您可以!
但是如何实现?(进一步说明)
ViewModelProviders
要求context作为Activity
或Fragment
。因此,您可以使用getContext()
从 *CustomView类 * 检索context
,在您使用它的地方,它将是Activity/Fragment
。将该
context
强制转换为以下任一类型,并将其提供给ViewModelProviders
,ViewModelProviders
将为您提供该Activity/Fragment
容器的对象。因此,像这样使用,您可以在
CustomView
和Activity/Fragment
之间共享ViewModel。CustomView
实现**LifeCycleObserver
,通过这种方式,您还可以让您的视图尊重Activity/Fragment
的生命周期**,以进行初始化/销毁。*pieyvz9o3#
就是这样:)