谁能在以下代码段中解释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
(或1.2.3
,当在Fragment 1.3.0-alpha02
中使用1.3.0-alpha02
时包含与StackoverflowError
相同的定位),则应始终使用layoutInflater
。片段的onCreateDialog()
是唯一可以正确膨胀layoutInflater
标记或其替代物layoutInflater
并将那些子片段正确地连接到您的<fragment>
的片段。
但是,如果您没有在XML中使用子片段,那么两者之间就不会有任何区别。