子 DialogFragment 被父 DialogFragment dismiss() 解散

Child DialogFragment is dismissed by parent DialogFragment dismiss()

使用导航组件,一个 Fragment 打开一个 DialogFragment,这可能会打开第二个 DialogFragment。关闭第一个 DialogFragment 也会关闭第二个。但是,我想让第二个 DialogFragment 保持活动状态,直到它自行消失。

可能这是预期的。在我的例子中,它是一个片段,用于打开自定义共享底部 Sheet 对话框。点击项目后,底部 sheet 将被关闭。单击某个项目并且结果持久时,将显示一个加载对话框。加载对话框在完成后自动消失。

因此,层次结构是:MainFragment - 共享 DialogFragment - 加载 DialogFragment。

我试过使用全局操作而不是对话框到对话框操作导航到加载对话框,但这没有任何影响。 在共享底部 sheet 中使用(它的父级)MainFragmentDiretions.action** 导致崩溃。不错,应该的。

解决方案是:

  1. MainFragment打开加载对话框。根据其父级,我不喜欢 DialogFragments。

  2. 在项目单击时隐藏共享底部 sheet,并在关闭加载对话框时关闭。我也不喜欢这种依赖。

  3. 加载对话框的生命周期不依赖于共享底部sheet。

如果关闭共享对话框,如何防止加载对话框被关闭,而不将更多责任转移给 MainFragment

我认为您正在将对话框片段的 ChildFragmentManager 传递给您的 loading-DialogFragment, 您可以通过两种方式防止加载对话框被关闭:

1) 通过使用 android 对话框而不是 DialogFragment。 2) 通过传递 MainFragment 的 ChildFragmentManager 或 activity 的 FragmentManager,这里有一个例子:

class MainFragment : Fragment() {

    fun displayDataDialog() {
        DataDialogFrag().show(childFragmentManager, DataDialogFrag.TAG)
    }
}

class DataDialogFrag : DialogFragment() {

    fun displayLoadingDialog() {
        val loading = LoadingDialog()
        if (parentFragment != null) {
            loading.show(parentFragment!!.childFragmentManager, LoadingDialog.TAG)
        } else {
            loading.show(fragmentManager, LoadingDialog.TAG)
        }
    }

    companion object {
        const val TAG = "data_dialog"
    }
}

class LoadingDialog : DialogFragment() {

    companion object {
        const val TAG = "loading_dialog"
    }
}