【问题标题】:Dialog Fragment Using Navigation Components使用导航组件的对话框片段
【发布时间】:2021-02-15 05:11:01
【问题描述】:

我正在尝试使用 android 中的导航组件显示对话框。我已经完成了在 stackoverflow Navigation Architecture Component - Dialog Fragments

提出的另一个问题

我在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>

我创建了一个kotlinMyDialogFragment 如下

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

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

 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$1.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 侦听器

【问题讨论】:

  • 请包含您的异常的完整堆栈跟踪。你读过guide for returning a result,特别是Considerations when using dialog destinations吗?
  • 我的用例不同。首先是当我尝试导航到没有任何结果的对话框时,上面的异常即将到来。我正在更新完整的堆栈跟踪
  • 异常来自您的MainActivity您的 onDestinationChanged 回调。请包含该代码。
  • @ianhanniballake 是的,问题出在我正在投射片段目的地的活动中。这样问题1就解决了。有没有办法在宿主片段中获取对话片段的实例?
  • 那么...您是否阅读了返回结果的指南?这就是你应该这样做的方式。

标签: android kotlin android-fragments navigation


【解决方案1】:

你的第一个问题是:

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

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

您的第二个问题是关于从对话框中返回结果。该文档涵盖了returning a result,甚至还有一个专门围绕Additional considerations when using DialogFragments 的部分(即Fragment 的生命周期不受对话框影响,因此这是使用NavBackStackEntry 的生命周期可以专门帮你)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多