Закрытие диалогового окна и отображение нового вскоре показывает базовый фрагмент перед открытием нового диалогового окна

В настоящее время у меня есть один фрагмент, который показывает фрагмент диалога, и когда я нажимаю кнопку на фрагменте диалога, я хочу показать другой фрагмент диалога. В моем первом фрагменте диалога у меня есть следующий метод:

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

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

Как сразу показать второй диалог или как узнать, когда он открыт, чтобы я мог закрыть первый?

1
0
556
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

fun showSecondDialog() {

    SecondDialog().showDialog(targetFragment!!)

    Handler().postDelayed({ dismiss() }, 1000)

}

Не работает, так как reject() закрывает оба моих диалога

SMGhost 30.05.2019 09:01

Я думаю, что невозможно закрыть оба ваших диалога, просто убедитесь, что ваша функция вызывается дважды?

Mitesh Machhoya 30.05.2019 09:07

метод reject() внутренне вызывает this.getFragmentManager().popBackStack(this.mBackStackId, 1); который очищает все другие фрагменты, добавленные после исходного фрагмента, который отклоняется.

SMGhost 30.05.2019 10:17

Итак, проблема в том, что мой showDialog использует show(fragmentTransaction, TAG) вместо show(fragmentManager, TAG). Переключение на второй вариант помогло, и тогда ваше предложение является жизнеспособным вариантом. Хотя я бы использовал runnable, который должен выполняться после отображения второго диалогового окна, а не случайных 1000 мс.

SMGhost 30.05.2019 20:22

На самом деле это не потому, что я использовал show(fragmentTransaction, TAG), а потому, что я использовал ft.addToBackStack(null), который каким-то образом вызвал этот эффект.

SMGhost 30.05.2019 20:30

Google рекомендует, чтобы все фрагменты раздувались, заменялись, удалялись... должны выполняться в родительской активности, и ни один фрагмент не должен знать ничего о любом другом фрагменте. Таким образом, фрагменты можно повторно использовать так, как они были изначально задуманы.

Если я перенесу код в активность, у меня все еще будет та же проблема

SMGhost 30.05.2019 10:19

Другие вопросы по теме