【问题标题】:android is there any view callback when it's destroyed?android被销毁时是否有任何视图回调?
【发布时间】:2015-10-13 01:23:06
【问题描述】:

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

【问题讨论】:

    标签: android view callback ondestroy


    【解决方案1】:

    View 没有回调(finalize() 除外,但我认为这不是您所要求的)。视图从屏幕上移除时有onDetachedFromWindow(),但这与它被销毁无关——它可以再次附加,这将调用onAttachedToWindow()。

    Fragment 有onDestroyView(),可能对你更有用。 Activity 没有等效的方法,但您可以使用 onDestroy(),只要您知道如果系统决定意外终止您的应用程序可能永远不会调用它。

    【讨论】:

    • 这是否意味着当系统决定意外终止我的应用程序时将调用onDestroyView()?
    • @RadekKłos 可能不会。如果您真正想要知道视图当前是否在屏幕上,也许更好的回调是View.onDetachedFromWindow()
    • 感谢您的回答。我猜onDetachedFromWindow() 在系统决定意外终止我时仍然不会被调用,但它会与例如onDestroy() 的Activity 一起调用?这样对吗?我想要实现的是我想在应用程序终止时将视图的个人数据存储到 SharedPreferences 并且我想在这个 View 对象中执行此操作,而不是在其布局中具有此视图的 Activity。
    • @RadekKłos onDetachedFromWindow() 在 View 不再附加到其窗口时被调用,这意味着它没有用于绘制的表面。这应该发生在 Activity 不再对用户可见的任何时候,这可能在系统决定终止您的 Activity 之前很久。
    【解决方案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)
        }
    

    【讨论】:

    • 我认为我们需要查看更多代码。不确定如何实施您的解决方案。
    猜你喜欢
    • 2018-08-28
    • 2011-06-14
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    相关资源
    最近更新 更多