使用导航组件的对话框片段

Dialog Fragment Using Navigation Components

我正在尝试使用 android 中的导航组件显示对话框。我已经完成了在 Whosebug

上提出的另一个问题

我在 nav_graph.xml 中添加了对话框组件,如下所示

 <dialog
    android:id="@+id/dialog"
    android:name="com.android.example.ui.MyDialogFragment"
    tools:layout="@layout/dialog_fragment" />

我在我的另一个片段中添加了一个动作来显示如下 nav_graph.xml

中的对话框
<fragment
        android:id="@+id/Fragment1"
        android:name="com.android.example.ui.Fragment1"
        android:label="Fragment"
        tools:layout="@layout/fragment1">
        <action
            android:id="@+id/action_fragment1_to_dialog"
            app:destination="@id/dialog" />
</fragment>

我创建了一个 kotlin class MyDialogFragment 如下

class MyDialogFragment : DialogFragment() {
override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(
            R.layout.dialog_fragment,
            container, false
        )
    }
}

这里来自 Fragment1 class,我正在尝试显示如下对话框

 findNavController().navigate(R.id.action_fragment1_to_dialog)

当我尝试显示对话框时,出现以下错误

问题 1 已解决

    java.lang.ClassCastException: androidx.navigation.fragment.DialogFragmentNavigator$Destination cannot be cast to androidx.navigation.fragment.FragmentNavigator$Destination
    at com.android.dairy.MainActivity$onCreate.onDestinationChanged(MainActivity.kt:47)
    at androidx.navigation.NavController.dispatchOnDestinationChanged(NavController.java:504)
    at androidx.navigation.NavController.navigate(NavController.java:1142)
    at androidx.navigation.NavController.navigate(NavController.java:944)
    at androidx.navigation.NavController.navigate(NavController.java:877)
    at androidx.navigation.NavController.navigate(NavController.java:863)
    at androidx.navigation.NavController.navigate(NavController.java:851)

问题2

如何获取 MyDialogFragment 的实例以更新其属性或在 Fragment1

中设置按钮 onClick 侦听器

你的第一个问题是:

java.lang.ClassCastException: androidx.navigation.fragment.DialogFragmentNavigator$Destination
    cannot be cast to androidx.navigation.fragment.FragmentNavigator$Destination
at com.android.dairy.MainActivity$onCreate.onDestinationChanged(MainActivity.kt:47)

所以您的问题是您 MainActivity 中的 onDestinationChanged 回调错误地转换了您的目的地类型。您需要更改代码以避免出现这种情况。

你的第二个问题是关于从你的对话中返回一个结果。该文档涵盖 returning a result and even has a section specifically around Additional considerations when using DialogFragments(即 Fragment 的生命周期不受对话框影响,因此在这种情况下使用 NavBackStackEntry 的生命周期可以特别帮助您) .