英文:
Android -How to Remove ViewTreeObserver GlobalLayoutListener with .removeOnGlobalFocusChangeListener
问题
如何移除 viewTreeObserver
?有 3 个不同的 removeOnGlobalFocusChangeListener
回调。
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.root.viewTreeObserver.addOnGlobalLayoutListener {
doSomething()
}
}
override fun onDestroy() {
super.onDestroy()
// 我不知道这是否是正确的调用方式
binding.root.viewTreeObserver.removeOnGlobalFocusChangeListener { oldFocus, newFocus -> }
}
}
英文:
How do I remove a viewTreeObserver
? There are 3 different removeOnGlobalFocusChangeListener
callbacks
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.root.viewTreeObserver.addOnGlobalLayoutListener {
doSomething()
}
}
override fun onDestroy() {
super.onDestroy()
// I don't know if this is the correct one to call
binding.root.viewTreeObserver.removeOnGlobalFocusChangeListener { oldFocus, newFocus -> }
}
}
答案1
得分: 1
你应该在 onViewCreated
中创建此监听器并在 onViewDestroyed
中释放它,使用 removeOnGlobalFocusChangeListener(..)
方法,并将监听器作为 victim
参数传递,或者如果 doSomething()
方法不需要频繁调用(一次?)则可以更早释放。
var globalListener: ViewTreeObserver.OnGlobalLayoutListener? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
globalListener = ViewTreeObserver.OnGlobalLayoutListener { doSomething() }
binding.root.viewTreeObserver.addOnGlobalLayoutListener(globalListener)
}
override fun onDestroy() {
globalListener?.let { binding.root.viewTreeObserver.removeOnGlobalFocusChangeListener(it) }
globalListener = null
super.onDestroy()
}
英文:
you should keep reference to this listener (when created in onViewCreated
) and release it in onViewDestroyed
using removeOnGlobalFocusChangeListener(..)
method and passing listener as victim
. or earlier if doSomething()
call isn't necessary to be called so often (once?)
var globalListener: ViewTreeObserver.OnGlobalLayoutListener? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
globalListener = ViewTreeObserver.OnGlobalLayoutListener { doSomething() }
binding.root.viewTreeObserver.addOnGlobalLayoutListener(globalListener)
}
override fun onDestroy() {
globalListener?.let { binding.root.viewTreeObserver.removeOnGlobalFocusChangeListener(it) }
globalListener = null
super.onDestroy()
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论