【问题标题】:Child DialogFragment is dismissed by parent DialogFragment dismiss()子 DialogFragment 被父 DialogFragmentdismiss() 解散
【发布时间】:2019-09-09 02:32:47
【问题描述】:

使用导航组件,Fragment 会打开一个DialogFragment,这可能会打开第二个DialogFragment。关闭第一个DialogFragment,也将关闭第二个。但是,我喜欢让第二个 DialogFragment 保持活跃,直到它自行关闭。

这可能符合预期。在我的情况下,它是一个打开自定义共享底页对话框的片段。点击项目后,底部工作表将被关闭。当一个项目被单击并且结果是持久的时,会显示一个加载对话框。加载对话框完成后会自行关闭。

所以,层次结构是:MainFragment - 共享 DialogFragment - 加载 DialogFragment。

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

解决方案是:

  1. MainFragment 打开加载对话框。我不喜欢 DialogFragments 取决于它的父级。

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

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

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

【问题讨论】:

  • 对话框创建另一个对话框是一个糟糕的设计,因此你正在与代码作斗争,解决设计问题,你不会与实现作斗争
  • 真的吗?因为它不是实际的Dialogs,所以它是DialogFragments,它是以对话框为主题的Fragments。
  • 对话框通常是设计中的一个组件,如果这是 vanilla js,我们将讨论相同但引用警报方法,对于任何其他框架,我们将引用模态,类的名称无关紧要,成分相同。您正在实施一个糟糕的设计,而糟糕的设计正在带来一个麻烦的实施,解决设计问题,实施就会变得更容易。

标签: android kotlin android-architecture-navigation


【解决方案1】:

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

1) 通过使用 android Dialog 而不是 DialogFragment。 2)通过传递您的活动的 MainFragment 或 FragmentManager 的 ChildFragmentManager ,这是一个示例:

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"
    }
}

【讨论】:

  • 感谢您的意见!我实际上正在使用新的导航组件。这处理显示片段和 - 更重要的是 - 对我来说是后堆栈。通过使用 fragmentManager 绕过这个最终会导致应用程序崩溃。我将尝试使用对话框。
猜你喜欢
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
相关资源
最近更新 更多