安卓:当视图销毁时有任何视图回调吗?

38

我有一个自定义视图组件,它可以在片段或活动中使用。我想知道是否有一个回调函数来在从片段/活动销毁时调用它?

2个回答

44

视图没有回调函数(除了finalize(),但我不认为这是你要问的)。当视图从屏幕上移除时,视图有onDetachedFromWindow(),但这与它被销毁无关——它可以再次附加,这会调用onAttachedToWindow()

片段有onDestroyView(),这可能对你更有用。活动没有等效的方法,但你可以使用onDestroy(),只要你知道如果系统意外终止你的应用程序,它可能永远不会被调用。


这是否意味着当系统决定意外终止我的应用程序时,onDestroyView()将被调用? - Android developer
@RadekKłos 可能不是。如果你想知道的实际上是View当前是否在屏幕上,也许更好的回调是View.onDetachedFromWindow() - Karakuri
谢谢您的回答。我猜当系统意外终止我的时候,onDetachedFromWindow()仍然不会被调用,但是它会和Activity的onDestroy()一起被调用吗?这样对吗?我的目标是在应用程序终止时将视图的个人数据存储到SharedPreferences中,并且我想在此View对象中执行此操作,而不是在其布局中具有此视图的Activity中。 - Android developer
2
@RadekKłos onDetachedFromWindow() 方法在 View 不再附加到其窗口时被调用,这意味着它没有可绘制的表面。这应该在 Activity 对用户不再可见时发生,这可能比系统决定终止您的 Activity 更早。 - Karakuri

-2

感谢Karakuri的回答,提供了一个可选的解决方案(使用简单的回调)

注意

view OnLayoutChangeListener在视图从窗口分离之前不会被调用

   view.listener = object :OnViewAttachedChangeListener{
                    override fun onAttachedFromWindow(view: View, isAttached: Boolean) {
    
                    }
                }

添加简单的回调函数以跟踪附件状态。
   internal class AttachedView(context: Context): View(context){

        internal var listener: OnViewAttachedChangeListener?= null
            get() = field

        override fun onDetachedFromWindow() {
            super.onDetachedFromWindow()
            notifyOnAttachedToWindow(false)
        }

        override fun onAttachedToWindow() {
            super.onAttachedToWindow()
            notifyOnAttachedToWindow(true)
        }

        private fun notifyOnAttachedToWindow(isAttached: Boolean){
            listener?.onAttachedFromWindow(this, isAttached)
        }
    }

    internal interface OnViewAttachedChangeListener{
        fun onAttachedFromWindow(view: View, isAttached: Boolean)
    }

我认为我们需要看更多的代码。不确定如何实现你的解决方案。 - Kristy Welsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接