使用导航组件时 DialogFragment 不会关闭

JDe*_*ais 4 navigation android dialog android-jetpack

我是导航组件的新手,我想将它与自定义对话框片段一起使用。

这是我的 nav_graph

    <dialog
        android:id="@+id/enterAisleNameDialog"
        android:name="com.cbplus.scan_product.view.EnterAisleNameDialog"
        android:label="EnterAisleNameDialog">
    <action
            android:id="@+id/action_enterAisleNameDialog_to_scanSummaryFragment"
            app:destination="@id/scanSummaryFragment"/>
</dialog>
Run Code Online (Sandbox Code Playgroud)

在我的 Kotlin Activity 中,我可以使用以下方法轻松显示对话框:

navController?.navigate(R.id.action_validateProductExpFragment_to_enterAisleNameDialog)
Run Code Online (Sandbox Code Playgroud)

然后,当在对话框上完成操作时,我调用:

navController?.navigate(R.id.action_enterAisleNameDialog_to_scanSummaryFragment)
Run Code Online (Sandbox Code Playgroud)

但是这里下一个片段显示在不会消失的对话框片段下方。

我在我的实现中遗漏了什么?

我可以调用dismiss()对话框,但导航控制器没有这样做似乎很奇怪。

Adi*_*i B 5

您正在调用的下一个片段是Fragmentwhile 当前片段是 a DialogFragment。对话框片段,导航组件中的 FloatingWindow,显示在对话框上方。

您可以在通过调用导航之前关闭对话框:

navController?.popBackStack()

或者

navController?.popBackStack(R.id.your_dialogfragment_id, true)

更好的是,您可以R.id.action_enterAisleNameDialog_to_scanSummaryFragment通过指定操作来定义您的操作以自动弹出对话框popUpTo。将对话框本身指定为 popUpTo 目标,并将 popInclusive 设置为 true。

现在,当您导航到此操作时,它将首先弹出(关闭)对话框,然后导航到您的片段。

popUpTo

  • 谢谢,你的回答对我有帮助。现在我还在有关“popupTo”的文档中找到了它:https://developer.android.com/guide/navigation/navigation-navigate#pop-example (2认同)