首页 > 解决方案 > 使用带有导航库的嵌套 DialogFragments 时出现 IllegalStateException

问题描述

我正在使用导航库(2.2.0-rc04)并且我有两个 DialogFragment。第一个是 A,从MainFragment. 第二个是B,它只是A打开的确认警告对话框。以下是相关导航XML的整体结构:

<navigation app:startDestination="@id/mainFragment" ...>

    <fragment android:id="@+id/mainFragment" ...>
        <action
            android:id="@+id/action_mainFragment_to_ADialog"
            app:destination="@id/ADialog" />
    </fragment>

    <dialog
        android:id="@+id/ADialog"
        android:name="com...ADialog"
        android:label="ADialog"
        tools:layout="@layout/dialog_a">
        <action
            android:id="@+id/action_aDialog_to_bDialog"
            app:destination="@id/BDialog" />
    </dialog>

    <dialog
        android:id="@+id/BDialog"
        android:name="com...BDialog"
        android:label="BDialog" />

    <action
        android:id="@+id/action_global_login"
        app:destination="@id/nav_graph_login"
        app:popUpTo="@id/mainFragment"
        app:popUpToInclusive="true"/>

</navigation>

我希望一次只在屏幕上出现一个对话框。因此,当用户点击 A 上的按钮转到 B 时,我dismiss()在调用弹出 B 之前调用navigate(action_aDialog_to_bDialog)了 A。 B 弹出但当我尝试navigate(action_global_login)从 B 调用时,出现以下错误:

IllegalStateException: Fragment B not associated with a fragment manager.

任何想法是什么问题以及如何解决它?

标签: androidandroid-dialogfragmentdialogfragmentandroid-jetpack-navigation

解决方案


我没有以编程方式调用,而是dismiss()按如下方式更新了图表:

<dialog
    android:id="@+id/ADialog"
    android:name="com...ADialog"
    android:label="ADialog"
    tools:layout="@layout/dialog_a">
    <action
        android:id="@+id/action_aDialog_to_bDialog"
        app:destination="@id/ADialog"
        app:popUpTo="@id/ADialog"
        app:destination="@id/BDialog" />
</dialog>

推荐阅读