android - 在没有 LifecycleOwner 的自定义 View 中设置 LiveData 观察器

标签 android mvvm android-architecture-components android-livedata android-viewmodel

我正在尝试新的 Android 架构组件,但在尝试将 MVVM 模型用于自定义 View 时遇到了障碍。

本质上,我创建了一个自定义 View 来封装一个通用 UI,它是在整个应用程序中使用的相应逻辑。我可以在自定义 View 中设置 ViewModel,但我必须使用 observeForever() 或在自定义 View 中手动设置 LifecycleOwner ,如下所示,但似乎都没有正确。

选项 1) 使用 observeForever()

Activity

class MyActivity : AppCompatActivity() {

    lateinit var myCustomView : CustomView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myCustomView = findViewById(R.id.custom_view)
        myCustomView.onAttach()
    }

    override fun onStop() {
        myCustomView.onDetach()
    }
}

自定义 View

class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){

    private val viewModel = CustomViewModel()

    fun onAttach() {
        viewModel.state.observeForever{ myObserver }
    }

    fun onDetach() {
        viewModel.state.removeObserver{ myObserver }
    }
}

选项 2) 从 Activity 设置 lifecycleOwner`

Activity

class MyActivity : AppCompatActivity() {

    lateinit var myCustomView : CustomView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myCustomView = findViewById(R.id.custom_view)
        myCustomView.setLifeCycleOwner(this)
    }
}

自定义 View

class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){

    private val viewModel = CustomViewModel()

    fun setLifecycleOwner(lifecycleOwner: LifecycleOwner) {
        viewModel.state.observe(lifecycleOwner)
    }
}

我只是在滥用模式和组件吗?我觉得应该有一种更简洁的方法来从多个 subview 中组合复杂 View ,而无需将它们绑定(bind)到 Activity/Fragment

最佳答案

1 个选项 - 出于好意,您仍然需要做一些手动工作 - 例如,调用 onAttach\onDetach Architecture 组件的主要目的是防止这样做。

2 选项 - 在我看来更好,但我会说围绕 ViewModelView 绑定(bind)逻辑有点不对。我相信您可以在 Activity/Fragment 中执行相同的逻辑,而无需将 ViewModel 和 LifecycleOwner 传递给 CustomView。单一方法 updateData 就足够了。

因此,在这种特殊情况下,我会说它过度使用了架构组件。

关于android - 在没有 LifecycleOwner 的自定义 View 中设置 LiveData 观察器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52335464/

相关文章:

android - LifecycleOwner : difference between Fragment (self) and Fragment#viewLifecycle

android 启动或重启

android - 如何通过外部按钮在 ListView 中设置可见性?

android - 使用粗体和常规文本制作 textview 的内容

WPF MVVM : ComboBox height is different for integers

c# - 为什么绑定(bind)不足以刷新 WP7 (MVVM) 中的 UI

android - 从 ViewModel 访问 strings.xml

android - 如何将 SearchWidget 添加到 ActionBar?

c# - 使用 IObservable (Rx) 作为 MVVM 的 INotifyCollectionChanged 替代品?

Android ViewModel 没有零参数构造函数