片段 getLayoutInflater() 与 LayoutInflater.from(getContext())

Fragment getLayoutInflater() vs. LayoutInflater.from(getContext())

谁能解释一下以下代码片段中 A 和 B 的区别? 它来自 DialogFragment

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

// A) this works
binding = DialogFragmentPeriodPickerBinding.inflate(LayoutInflater.from(context))

// B) this doesn't work: no compiler error, but dialog won't show
binding = DialogFragmentPeriodPickerBinding.inflate(layoutInflater)

[..] // binding.root is later on passed to setView(binding.root) of MaterialAlertDialogBuilder
}

layoutInflater 和 LayoutInflater.from(getContext()) 之间没有太大区别,事实上,如果您查看源代码,两者几乎是一回事。您的代码的问题是,当您在 onCreateDialog 中调用 layoutInflater 时,它尚未设置,因此我们的好朋友 android 正在尝试设置,但它失败了。因为在引擎盖下它调用 onCreateDialog(SavedInstance) 是你提到 layoutInflater 的函数,以便从对话框中获取上下文。所以我们有无限循环,这很可能会导致我们崩溃。

假设您使用的是 Fragment 1.2.3 (or Fragment 1.3.0-alpha02,其中包含在 onCreateDialog() 中使用 layoutInflater 时对 WhosebugError 的相同修复),您应该始终使用 layoutInflater.该片段的 layoutInflater 是唯一可以正确扩充 <fragment> 标签或其替换 FragmentContainerView 并将这些子片段正确连接到您的 DialogFragment 的片段。

但是,如果您没有在 XML 中使用子片段,您应该看不出两者之间有任何区别。