我试图理解视图绑定在片段中的实现,我发现它与Activity不同。
在活动中:
private lateinit var binding: ResultProfileBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}
片段中:
private var _binding: ResultProfileBinding? = null
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
}
现在我的问题是,为什么我们在片段中有binding
和_binding
?这一行是做什么的,它的目的是什么?
private val binding get() = _binding!!
2条答案
按热度按时间xj3cbfub1#
在第二个例子中,
_binding
属性是可空的,以便允许在它被“初始化”之前的状态。然后binding
属性有一个getter,以提供方便的访问,假设后台字段(_binding
)已经初始化。您所指的特定行意味着当您尝试访问
binding
时,它将返回_binding
。然而,nullAssert操作符(!!
)添加了_binding
不为null的额外Assert。实际上,你所做的就是创建一个类似于lateinit属性的东西,实际上,如果你看一下lateinit声明的反编译字节码,它们是一样的。
然而,正如@Tentfour04所指出的,这里的细微区别在于第二种方法允许您将backing字段设置回null,而对于
lateinit
属性则无法做到这一点。当您在片段中使用绑定时,建议将onDestroyView
中的绑定置空,以避免内存泄漏。所以这就是为什么他们在一个片段中采用这种方法。sq1bmfud2#
在片段中,视图在onCreateView中示例化()方法调用。但是onCreateView()不是创建片段时调用的第一个方法,这意味着在onCreateView之前View可能为null()方法调用,如果View为null,所以将是_binding属性。为了避免nullPointerException,我们使用变量“binding”来获取最新的非null(!!检查)_binding的值。
这个声明有一个内置的
get()
方法,它在每次调用binding
时更新binding
的值,以返回_binding
的当前非空值,因为如果_binding
有空值,_binding!!
将抛出异常。