首页 > 解决方案 > 如何在自定义视图中观察 LiveData

问题描述

我应该如何在自定义视图中观察 LiveData。我试图将它的上下文转换为生命周期所有者,但它会产生一些问题并且并非在所有情况下都有效。我试图放置一个二传手,但它也不起作用

标签: androidkotlinandroid-livedata

解决方案


视图本身没有生命周期。个人使用有两种方法,它们实际上是同一件事,但其中一种是添加生命周期,而另一种是。没有生命周期。

class MyCustomView  @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
): View(context, attrs, defStyleAttr){
    
    
    val myObserver = Observer<Long>{
        //whatever
    }

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        liveData.observeForever(myObserver)
    }

    override fun onDetachFromWindow() {
        super.onDetachFromWindow()
        liveData.removeObserver(myObserver)
    }
}

此方法在附加/分离到窗口时手动观察/删除。当我观察到很少的实时数据并且它很简单/有限时,我更喜欢它


另一种选择是将我们的自定义视图变成 LifecycleOwner。我推荐这种方法 BaseCustomViews 和一些极其庞大和复杂的视图(如地图导航视图)

class BaseCustomView  @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
): View(context, attrs, defStyleAttr), LifecycleOwner {
    protected val lifecycleRegistry = LifecycleRegistry(this);

    override fun getLifecycle() = lifecycleRegistry
    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        lifecycleRegistry.currentState = Lifecycle.State.RESUMED
    }

    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
    }


    
    val myObserver = Observer<Long>{
        //whatever
    }

    init{
        liveData.observe(this, myObserver}
    }
}

推荐阅读