gpt4 book ai didi

android - 如何在自定义 View 中观察 LiveData

转载 作者:行者123 更新时间:2023-12-04 23:47:27 27 4
gpt4 key购买 nike

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.


去年关闭。







Improve this question




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

最佳答案

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

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)
}
}
此方法在附加/分离到窗口时手动观察/删除。当我观察到很少的实时数据并且它很简单/有限时,我更喜欢它

另一种选择是将我们的自定义 View 变成 LifecycleOwner。我推荐这种方法 BaseCustomViews 和一些极其庞大和复杂的 View (如 map 导航 View )
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}
}
}

关于android - 如何在自定义 View 中观察 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66789326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com