【问题标题】:Fragment getLayoutInflater() vs. LayoutInflater.from(getContext())片段 getLayoutInflater() 与 LayoutInflater.from(getContext())
【发布时间】:2020-07-04 07:09:57
【问题描述】:

谁能解释下面代码sn-p中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


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,我确实还在 1.2.2 上,因为没有像过去那样显示更新 (stackoverflow.com/questions/60827799/…)。会试一试并提供反馈。
    • 使用 1.2.3 变体 B binding = DialogFragmentPeriodPickerBinding.inflate(layoutInflater) 工作 :-)
    猜你喜欢
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 2020-06-09
    • 2014-05-10
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多