android - 如何使用导航组件导航嵌套的 DialogFragments 而不破坏第二个?

标签 android nested android-dialogfragment android-architecture-navigation

情况:

  • fragment A 导航到 DialogFragment B(单击按钮时)
  • 在 B 的 PositiveButton 中的给定条件下 -> 导航到 DialogFragment C

  • 问题:
    当单击 DialogFragment B 的确认按钮时,B 会收到对此 DialogFragment 的 onDestroy 调用。
    无论如何,这是有意的,当 B 不需要导航到 C 时没有问题。
    但是 : 当 B 按要求导航到 C 时,会发生以下情况:
  • C 弹出几分之一秒,然后消失
  • 并且导航 Controller 的当前位置是 不是 A. 我需要一次回击才能再次到达 A

  • 我也不希望导航 Controller 位于 A。我希望它位于显示 DialogFragment 的 C。
    执行:
    fragment 实现
    class FragmentA : Fragment() {
    ...
        // is assigned as onClick listener to the button
        fun onClickButton() {
            if (findNavController().currentDestination?.id == R.id.FragmentANavId) {
                val action = FragmentADirections.actionFragmentAToDialogFragmentB()
                findNavController().navigate(action)
        }
    }
    
    // in separate file
    class DialogFragmentB : DialogFragment() {
    ...
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
            val builder = MaterialAlertDialogBuilder(requireContext())
                ...
                .setPositiveButton("Save", { _, _ ->
                    if (...) {
                        val action = DialogFragmentBDirections.actionDialogFragmentBToDialogFragmentC
                        findNavController().navigate(action)
                    }
             return builder.create()
         }
    }
    
    class DialogFragmentC : DialogFragment() {
        override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
            val builder = MaterialAlertDialogBuilder(requireContext()) // also tried with requireActivity() as context
                ...
                .setPositiveButton("Confirm", { _, _ ->
                    // code to handle the user confirmation
                    }
             return builder.create()
         }
    }
    
    nav_graph.xml
        <fragment
            android:label="@string/some_text"
            android:name="...FragmentA"
            android:id="@+id/fragmentA" >
            <action
                android:id="@+id/action_fragmentA_to_fragmentDialogB"
                app:destination="@id/fragmentDialogB" />
        </fragment>
    
        // I put them into a nested graph
        <navigation android:id="@+id/dialogFragmentsNested"
            app:startDestination="@id/fragmentDialogB">
            <dialog
                android:id="@+id/fragmentDialogB"
                android:name="...FragmentDialogB">
                <action
                    android:id="@+id/action_fragmentDialogB_to_fragmentDialogC"
                    app:destination="@id/fragmentDialogC" />
            </dialog>
            <dialog
                android:id="@+id/fragmentDialogC"
                android:name="fragmentDialogC">
            </dialog>
        </navigation>
    
    解决方案的尝试:
  • 将 dialogFragments 分组为嵌套图 -> 仅结构元素,不影响对话框生命周期
  • 更新导航依赖项
    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0' // from 2.2.2
    implementation 'androidx.navigation:navigation-ui-ktx:2.3.0' // from 2.2.2
    
  • 将 dialogFragmentC 中对话框的上下文更改为 requireActivity()
  • 尝试寻找相关问题
  • 有人试图 navigate from DialogFragment to Fragment .他希望 Dialog 保留在 backstack 中。我希望它关闭,但我希望以下对话框保持打开状态直到用户交互
  • how to properly close a dialogFragment但我不想navigateUp
  • 有人提示 dialogFragment closes when navigating to other fragment .一位评论者提到:在移动到下一个对话框时关闭一个对话框是想要的行为。我同意,这正是我想要的


  • 概括
    当我从 DialogFragmentB 导航到 DialogFragmentC 时,两个 DialogFragment 都会收到一个 onDestroy 调用(如泄漏金丝雀所观察到的)。
    我在这里错过了什么吗?你有什么建议吗?
    如何在不立即关闭 DialogFragmentC(且无需用户交互)的情况下从 DialogFragmentB 移动到 DialogFragmentC?

    最佳答案

    对我有用的是调用findNavController().navigateUp()在导航到 DialogFragmentC 之前
    在 DialogFragmentB 我写道:

    class DialogFragmentB : DialogFragment() {
    ...
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val builder = MaterialAlertDialogBuilder(requireContext())
            ...
            .setPositiveButton("Save", { _, _ ->
                if (...) {
    
                    findNavController().navigateUp()
    
                    val action = DialogFragmentBDirections.actionDialogFragmentBToDialogFragmentC
                    findNavController().navigate(action)
                }
             return builder.create()
         }
    }
    

    关于android - 如何使用导航组件导航嵌套的 DialogFragments 而不破坏第二个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63385031/

    相关文章:

    android - Android 中的多屏幕滚 Action 为 iphone 平台

    Android数字警报弹出窗口需要数字小键盘

    java - codenameone 中 canvas.drawColor 的替代函数是什么

    r - 具有 2 个计数变量的 lapply 函数

    python - 将嵌套列表转换为字符串

    方向更改时未保留 Android DialogFragment

    android - 如何在android中显示像facebook聊天头一样的下拉菜单

    android - RXJava 和 DialogFragment => Dialog 等待 observable - 为什么?

    android - 需要获取运行时的属性

    python - 使用索引列表来操作嵌套字典