![](/img/trans.png)
[英]Android data binding in fragment - IllegalArgumentException: No view found
[英]Android View Binding - Clear Binding in Fragment Lifecycle
为什么在片段中实现Android 视图绑定时清除onDestroyView
中的binding
很重要?
如文档所示, 在片段中使用视图绑定和 Android 架构组件示例, binding
在onCreateView
中启动,并在onDestroyView
中清除。
与启动binding
而不在onDestroyView
中清除它相比,实现它有什么好处? 在不显式清除实例变量binding
的情况下,应在 Fragment 销毁时将其清除。
private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
当 Fragment 实例本身仍在 memory 中时,Fragment 可能会多次创建和销毁其视图。 如果您没有 null 出视图引用,那么您将在onDestroyView()
和onCreateView()
之间的时间范围内“泄漏”这些视图。 但它们并没有永久泄露,所以也许这是错误的术语。
有人说,这些观点暂时泄露也没关系。 我对生命周期的详细信息了解得不够多,无法知道它是否严格重要。 我希望有时视图被拆除的原因是 Android 试图在 memory 不在屏幕时保存它们,所以如果你挂在它们上面,你就是在颠覆它。
如文档中所述: once the fragment then invokes its onDestroyView() callback all references to the fragment's view should be removed, allowing the fragment's view to be garbage collected.
基本上是为了避免 memory 泄漏并为我们的应用程序提供更新的视图
所以要真正理解发生了什么,你应该阅读片段的生命周期文档,特别是关于销毁视图和片段的部分。
同样重要的是要指出片段的视图有一个单独的生命周期,该生命周期独立于片段的生命周期进行管理
但是,我们仍然可以under the hood
了解幕后发生的事情。 当 Fragment 不再在视图中(用户可见)并且所有退出动画和过渡都已完成时。 片段的视图将转换为它的DESTROYED
state 并向它的观察者(片段)发出ON_DESTROY
事件。 然后这会触发片段调用其onDestroyView()方法。 它的文档状态, The next time the fragment needs to be displayed, a new view will be created
。 所以我们设置_binding = null
以允许创建和引用新视图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.