Android -如何使用.removeOnGlobalFocusChangeListener删除ViewTreeObserver GlobalLayoutListener

von4xj4u  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(124)

如何删除viewTreeObserver?有3个不同的removeOnGlobalFocusChangeListener回调

  1. class MyFragment: Fragment() {
  2. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  3. super.onViewCreated(view, savedInstanceState)
  4. binding.root.viewTreeObserver.addOnGlobalLayoutListener {
  5. doSomething()
  6. }
  7. }
  8. override fun onDestroy() {
  9. super.onDestroy()
  10. // I don't know if this is the correct one to call
  11. binding.root.viewTreeObserver.removeOnGlobalFocusChangeListener { oldFocus, newFocus -> }
  12. }
  13. }
q5iwbnjs

q5iwbnjs1#

你应该保持对这个监听器的引用(当在onViewCreated中创建时),并使用removeOnGlobalFocusChangeListener(..)方法在onViewDestroyed中释放它,并将监听器作为victim传递。或更早,如果doSomething()调用不需要如此频繁地调用(一次?)

  1. var globalListener: ViewTreeObserver.OnGlobalLayoutListener? = null
  2. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  3. super.onViewCreated(view, savedInstanceState)
  4. globalListener = ViewTreeObserver.OnGlobalLayoutListener { doSomething() }
  5. binding.root.viewTreeObserver.addOnGlobalLayoutListener(globalListener)
  6. }
  7. override fun onDestroy() {
  8. globalListener?.let { binding.root.viewTreeObserver.removeOnGlobalFocusChangeListener(it) }
  9. globalListener = null
  10. super.onDestroy()
  11. }

相关问题