gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:45:21 25 4
gpt4 key购买 nike

情况:

  • 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com