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

问题描述 投票:0回答:2

谁能在以下代码段中解释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
}
android android-databinding layout-inflater android-viewbinding
2个回答
0
投票

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


0
投票

假设您正在使用Fragment 1.2.3(或1.2.3,当在Fragment 1.3.0-alpha02中使用1.3.0-alpha02时包含与StackoverflowError相同的定位),则应始终使用layoutInflater。片段的onCreateDialog()是唯一可以正确膨胀layoutInflater标记或其替代物layoutInflater并将那些子片段正确地连接到您的<fragment>的片段。

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

© www.soinside.com 2019 - 2024. All rights reserved.