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

Я показываю BottomSheetDialogFragment из фрагмента. Идея состоит в том, чтобы получить обратный вызов BottomSheetDialogFragment внутри этого фрагмента вместо активности, поэтому я надеялся получить фрагмент внутри

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());

Кто-нибудь знает, как это назвать?

Спасибо.


person Sol    schedule 22.04.2019    source источник


Ответы (3)


Я думаю, что причина, по которой он не вызывает onAttachFragment, заключается в том, что DialogFragment управляет своим жизненным циклом, а другие переопределения методов отличаются от обычных, см. документация.

Если вы просто хотите иметь обратный вызов для родительского фрагмента, вы можете либо переопределить метод 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
}
person Jack    schedule 22.04.2019
comment
onAttach я получу активность только как контекст, а не фрагмент. - person Sol; 22.04.2019

Может быть, это немного поздно, но теперь, в 2019 году, с библиотекой поддержки androidx.appcompat:appcompat:1.1.0, если используется вариант с диспетчером дочерних фрагментов, тогда onAttachFragment вызывается, пока я жду. Вот правильный фрагмент кода на Котлине

ChildInfoDialog.getInstance(it.data).show(childFragmentManager, ChildInfoDialog.TAG)
person fuliozor    schedule 18.12.2019

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

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

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

person ror    schedule 22.04.2019