#android #android-fragments #android-dialogfragment #fragmentmanager
#Android #android-фрагменты #android-dialogfragment #fragmentmanager
Вопрос:
Я показываю BottomSheetDialogFragment из фрагмента. Идея состоит в том, чтобы получить обратный вызов BottomSheetDialogFragment внутри этого фрагмента вместо activity, поэтому я надеялся получить фрагмент внутри
override fun onAttachFragment(childFragment: Fragment?) {
super.onAttachFragment(childFragment)
callback = childFragment as? Callback
}
Этот метод не вызывается. Я попытался использовать FragmentManager и ChildFragmentManager при отображении диалогового окна, чтобы посмотреть, могу ли я вызвать onAttachFragment, но безуспешно.
AccountBottomSheetDialog dialog = AccountBottomSheetDialog.Companion.newFragment();
dialog.show(getChildFragmentManager(), AccountBottomSheetDialog.Companion.getTAG());
AccountBottomSheetDialog dialog = AccountBottomSheetDialog.Companion.newFragment();
dialog.show(getFragmentManager(), AccountBottomSheetDialog.Companion.getTAG());
Кто-нибудь знает, как вызвать это?
Спасибо.
Комментарии:
1. как вы это решили?
Ответ №1:
Я думаю, что причина, по которой он не вызывается, onAttachFragment
заключается в том, DialogFragment
что управление его жизненным циклом и другие переопределения методов отличаются от обычных, см. documentation,,.
Если вы просто хотите выполнить обратный вызов родительского фрагмента, вы можете либо переопределить onAttach
метод внутри DialogFragment
и использовать параметр контекста в качестве обратного вызова (привести его), либо иметь открытый метод внутри вашего DialogFragment
, который задает обратный вызов, который вы бы вызвали после создания этого фрагмента.
onAttach
метод:
override fun onAttach(context: Context?) {
super.onAttach(context)
callback = context as? Callback
}
общедоступный метод установки обратного вызова:
//parent fragment: after initializing it
childFragment.setCallback(this@ParentFragment)//or pass in other callbacks
//child fragment:
fun setCallback(callback: Callback) {
this.callback = callback
}
Комментарии:
1. Методом onAttach я получу только действие в качестве контекста, не будет фрагмента.
Ответ №2:
Может быть, это немного поздно, но теперь, в 2019 году, с библиотекой поддержки, androidx.appcompat:appcompat:1.1.0
если используется вариант с дочерним менеджером фрагментов, то onAttachFragment
вызывается, пока я жду. Вот правильный фрагмент кода на Kotlin
ChildInfoDialog.getInstance(it.data).show(childFragmentManager, ChildInfoDialog.TAG)
Ответ №3:
Не могу ответить на ваш вопрос напрямую, но вот обходной путь, который вы могли бы предпринять:
- Передайте ваш родительский фрагмент в качестве
newFragment
параметра - Установите его в своем дочернем фрагменте в качестве целевого фрагмента с любым кодом запроса (
setTargetFragment
) - Используйте его в своем коде как
getTargetFragment()
и приведите его к любому интерфейсу, который вам нравится (интерфейс, который, конечно, реализует ваш родительский фрагмент).
PS.: чтобы вышеуказанное работало, менеджер фрагментов должен быть одинаковым для родительского и дочернего элементов.