Фрагмент getLayoutInflater () против LayoutInflater.from (getContext ()) - PullRequest
0 голосов
/ 23 марта 2020

Может кто-нибудь объяснить, в чем разница между 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
}

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Предполагается, что вы используете Фрагмент 1.2.3 (или Фрагмент 1.3.0-alpha02, который содержит то же исправление для StackoverflowError при использовании layoutInflater в onCreateDialog() ), вы всегда должны использовать layoutInflater. Фрагмент layoutInflater является единственным, который может правильно накачать теги <fragment> или его замену FragmentContainerView и правильно подключить эти дочерние фрагменты к вашему DialogFragment.

Однако, если вы не используете дочерние фрагменты в вашем XML, вы не должны видеть никакой разницы между ними.

0 голосов
/ 23 марта 2020

нет большой разницы между layoutInflater и LayoutInflater.from (getContext ()), на самом деле, если взглянуть на исходный код, то это два одинаковых элемента. проблема с вашим кодом в том, что когда вы вызываете layoutInflater в onCreateDialog, он еще не установлен, поэтому наш хороший друг android пытается установить его, но это не удается. потому что под капотом он вызывает onCreateDialog (SavedInstance) да функцию, где вы упомянули layoutInflater, чтобы получить контекст из диалога. так что у нас есть бесконечное число l oop, которое, скорее всего, приведет нас к cra sh.

...