0

任何人都可以在下面的代码片段中解释 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
}
4

2 回答 2

2

假设您使用的是Fragment1.2.3(或Fragment1.3.0-alpha02,其中包含对 aStackoverflowError使用layoutInflaterin时的相同修复onCreateDialog()),您应该始终使用layoutInflater. 片段layoutInflater是唯一可以正确膨胀<fragment>标签或其替换,FragmentContainerView并将这些子片段DialogFragment正确连接到您的片段。

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

于 2020-03-24T01:22:25.667 回答
0

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

于 2020-03-23T19:57:10.173 回答