android binding和_binding有什么区别?

ruarlubt  于 2023-04-18  发布在  Android
关注(0)|答案(2)|浏览(206)

我试图理解视图绑定在片段中的实现,我发现它与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!!
xj3cbfub

xj3cbfub1#

在第二个例子中,_binding属性是可空的,以便允许在它被“初始化”之前的状态。然后binding属性有一个getter,以提供方便的访问,假设后台字段(_binding)已经初始化。
您所指的特定行意味着当您尝试访问binding时,它将返回_binding。然而,nullAssert操作符(!!)添加了_binding不为null的额外Assert。
实际上,你所做的就是创建一个类似于lateinit属性的东西,实际上,如果你看一下lateinit声明的反编译字节码,它们是一样的。

然而,正如@Tentfour04所指出的,这里的细微区别在于第二种方法允许您将backing字段设置回null,而对于lateinit属性则无法做到这一点。当您在片段中使用绑定时,建议将onDestroyView中的绑定置空,以避免内存泄漏。所以这就是为什么他们在一个片段中采用这种方法。

sq1bmfud

sq1bmfud2#

在片段中,视图在onCreateView中示例化()方法调用。但是onCreateView()不是创建片段时调用的第一个方法,这意味着在onCreateView之前View可能为null()方法调用,如果View为null,所以将是_binding属性。为了避免nullPointerException,我们使用变量“binding”来获取最新的非null(!!检查)_binding的值。

private val binding get() = _binding!!

这个声明有一个内置的get()方法,它在每次调用binding时更新binding的值,以返回_binding的当前非空值,因为如果_binding有空值,_binding!!将抛出异常。

相关问题