Android -How to Remove ViewTreeObserver GlobalLayoutListener with .removeOnGlobalFocusChangeListener

huangapple go评论53阅读模式
英文:

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 ->  }
    }
}

Android -How to Remove ViewTreeObserver GlobalLayoutListener with .removeOnGlobalFocusChangeListener

英文:

How do I remove a viewTreeObserver? There are 3 different removeOnGlobalFocusChangeListener callbacks

Android -How to Remove ViewTreeObserver GlobalLayoutListener with .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()

        // 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()
}

huangapple
  • 本文由 发表于 2023年6月12日 03:39:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/76452239.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定