onAttachFragment не вызывается при отображении диалога из фрагмента

#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:

Не могу ответить на ваш вопрос напрямую, но вот обходной путь, который вы могли бы предпринять:

  1. Передайте ваш родительский фрагмент в качестве newFragment параметра
  2. Установите его в своем дочернем фрагменте в качестве целевого фрагмента с любым кодом запроса ( setTargetFragment )
  3. Используйте его в своем коде как getTargetFragment() и приведите его к любому интерфейсу, который вам нравится (интерфейс, который, конечно, реализует ваш родительский фрагмент).

PS.: чтобы вышеуказанное работало, менеджер фрагментов должен быть одинаковым для родительского и дочернего элементов.