Android 子DialogFragment被父DialogFragment Disclose()解除

Android 子DialogFragment被父DialogFragment Disclose()解除,android,kotlin,android-architecture-navigation,Android,Kotlin,Android Architecture Navigation,使用导航组件,一个片段打开一个对话框片段,它可能会打开第二个对话框片段。取消第一个对话框片段,也将取消第二个对话框片段。但是,我喜欢让第二个对话框fragment保持活动状态,直到is自行解散 也许这是我们的初衷。在我的例子中,它是一个打开自定义共享底部工作表对话框的片段。轻敲一个项目后,下一页被取消。单击某个项目且结果持续时间较长时,将显示加载对话框。加载对话框完成后将自动关闭 因此,层次结构是:MainFragment-ShareDialogFragment-Loading DialogFr

使用导航组件,一个
片段
打开一个
对话框片段
,它可能会打开第二个
对话框片段
。取消第一个
对话框片段
,也将取消第二个对话框片段。但是,我喜欢让第二个
对话框fragment
保持活动状态,直到is自行解散

也许这是我们的初衷。在我的例子中,它是一个打开自定义共享底部工作表对话框的片段。轻敲一个项目后,下一页被取消。单击某个项目且结果持续时间较长时,将显示加载对话框。加载对话框完成后将自动关闭

因此,层次结构是:MainFragment-ShareDialogFragment-Loading DialogFragment

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

解决办法是:

  • MainFragment
    打开加载对话框。我更喜欢这两个对话框,这取决于它的父对象

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

  • 加载对话框的生命周期不依赖于共享底部工作表

  • 如果共享对话框被取消,如何防止加载对话框被取消,而不将更多责任转移到
    MainFragment

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

    1) 通过使用android对话框而不是DialogFragment。 2) 通过传递MainFragment的ChildFragmentManager或活动的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"
        }
    }
    

    对话框创建另一个对话框是一个糟糕的设计,因此你在与代码搏斗,解决设计问题,而你不会与实现搏斗,真的吗?由于它不是实际的
    Dialog
    s,它是
    DialogFragment
    s,它是以对话框为主题的
    Fragment
    s。对话框通常是设计中的一个组件,如果是vanilla js,我们将讨论相同的方法,但引用警报方法,我们将引用modals的任何其他框架,类的名称是无关的,组件是相同的。你正在实施一个糟糕的设计,而这个糟糕的设计正在变成一个麻烦的实施,解决了设计问题,实施就会更容易。谢谢你的投入!我实际上正在使用新的导航组件。这可以为我显示片段,更重要的是,显示后堆栈。通过使用fragmentManager绕过这一点,应用程序最终会崩溃。我将尝试使用对话框。