英文:
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()
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。



评论