如何在DialogFragment中正确使用Android View Binding?

36
1个回答

56

请改用 inflate(LayoutInflater.from(context))。然后使用binding.root来设置构建器视图。

此外,如Google所建议的,最好在使用片段时在onDestroyView()中将binding实例设置为null:

https://developer.android.com/topic/libraries/view-binding#fragments

例如:

class ExampleDialog : DialogFragment() {

    private var _binding: DialogExampleBinding? = null
    // This property is only valid between onCreateDialog and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        _binding = DialogExampleBinding.inflate(LayoutInflater.from(context))
        return AlertDialog.Builder(requireActivity())
            .setView(binding.root)
            .create()
    }
    
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    } 
}

4
这是建议用于防止崩溃的,但如果在将其设置为null后仍然使用绑定,会发生什么?我认为它会导致崩溃,这意味着private val binding get() = _binding!!完全没有意义。我是否遗漏了什么? - Mehmed
1
一旦视图进入onDestroyView生命周期,就不应再使用它。 - Nino DELCEY
3
另外,最好的做法是将你的绑定对象作为一个局部变量使用。在这种情况下,无需重写onDestroyView()方法! :) - Nino DELCEY
有时候会像 @Mehmed 说的那样崩溃。 - The Dongster
1
@IgorGanapolsky,是的。当一个片段重新创建视图时,它的_binding会获得一个新的值。要检测视图何时被销毁,请检查_binding == null(例如,在长时间加载操作之后)。 - CoolMind
显示剩余3条评论

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