В настоящее время у меня есть один фрагмент, который показывает фрагмент диалога, и когда я нажимаю кнопку на фрагменте диалога, я хочу показать другой фрагмент диалога. В моем первом фрагменте диалога у меня есть следующий метод:
fun showSecondDialog() {
dismiss()
SecondDialog().showDialog(targetFragment!!)
}
показатьдиалог() выглядит так:
fun showDialog(fragment: Fragment) {
val fragmentManager = fragment.fragmentManager
val ft = fragmentManager!!.beginTransaction()
val prev = fragmentManager.findFragmentByTag(getName())
if (prev != null) {
ft.remove(prev)
}
ft.addToBackStack(null)
setTargetFragment(fragment, 0)
show(ft, getName())
}
Проблема в том, что диалог закрытия работает сразу, но перед отображением нового диалога есть пробел, где мой основной фрагмент полностью виден, и это вызывает нежелательное мерцание.
Как сразу показать второй диалог или как узнать, когда он открыт, чтобы я мог закрыть первый?
У меня тоже такая же проблема, но вы можете попробовать такой обходной путь, если он работает в соответствии с вашими требованиями:
fun showSecondDialog() {
SecondDialog().showDialog(targetFragment!!)
Handler().postDelayed({ dismiss() }, 1000)
}
Я думаю, что невозможно закрыть оба ваших диалога, просто убедитесь, что ваша функция вызывается дважды?
метод reject() внутренне вызывает this.getFragmentManager().popBackStack(this.mBackStackId, 1); который очищает все другие фрагменты, добавленные после исходного фрагмента, который отклоняется.
Итак, проблема в том, что мой showDialog использует show(fragmentTransaction, TAG) вместо show(fragmentManager, TAG). Переключение на второй вариант помогло, и тогда ваше предложение является жизнеспособным вариантом. Хотя я бы использовал runnable, который должен выполняться после отображения второго диалогового окна, а не случайных 1000 мс.
На самом деле это не потому, что я использовал show(fragmentTransaction, TAG), а потому, что я использовал ft.addToBackStack(null), который каким-то образом вызвал этот эффект.
Google рекомендует, чтобы все фрагменты раздувались, заменялись, удалялись... должны выполняться в родительской активности, и ни один фрагмент не должен знать ничего о любом другом фрагменте. Таким образом, фрагменты можно повторно использовать так, как они были изначально задуманы.
Если я перенесу код в активность, у меня все еще будет та же проблема
Не работает, так как reject() закрывает оба моих диалога