【问题标题】:Kill fragment in navigation controller在导航控制器中杀死片段
【发布时间】:2019-11-06 23:20:51
【问题描述】:

我的fragment流程是这样的

Main -> A -> B -> C ->A

在片段c中,它有一个提交按钮,它将返回到A。 当我按下 A 中的后退按钮时,我希望它回到 Main。但它会返回片段 c。

在片段 C 中,我使用了这个

 findNavController().navigate(R.id.action_c_to_a)

nav_graph.xml

 <fragment
        android:id="@+id/fragmentC"
        android:name="xxx"
        android:label="xxx">
        <action
            app:launchSingleTop="true"
            app:popUpTo="@+id/fragmentA"
            app:popUpToInclusive="true"
            android:id="@+id/action_c_to_a"
            app:destination="@id/fragmentA" />
    </fragment>

【问题讨论】:

  • 当您导航到它时,您确定您的堆栈中有A 吗?您的配置已正确设置并按您希望的方式工作。
  • 我明白你想做什么。但是在这种情况下,您应该实现“向上”导航,而不是“返回”。用户应该期待返回,而不是返回。

标签: android kotlin navigation fragment navigationcontroller


【解决方案1】:

为什么不弹出到片段A?您可以只调用 findNavController().popBackStack(R.id.fragmentA, false) 而不是使用操作进行导航。

【讨论】:

  • 不工作 val action = CheckoutFragmentDirections.actionCheckoutFragmentToProductFragment() findNavController().navigate(action)
【解决方案2】:

尝试从后台删除/杀死片段来查看我的完整解决方案。

Navigation Component set transition animation programmatically

【讨论】:

    【解决方案3】:

    您可以覆盖后退按钮的行为来执行此操作。 Provide custom back navigation

    【讨论】:

      【解决方案4】:

      在 nav_graph 里面添加这个 action 标签

      app:popUpTo="@id/homeFragment"
      

      见:Not able to destroy fragment from Nav Controller in Android

      【讨论】:

        【解决方案5】:

        这个想法是设置app:popUpTo而不设置app:destination。事实上,设置app:destination 将创建一个片段并将其添加到你不想要的后台堆栈中。

        你可以删除:

        app:destination="@id/fragmentA"
        

        如果你有这个:

        app:popUpTo="@+id/fragmentA"
        

        它会真正弹出回栈直到fragmentA

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-02
          • 2021-05-05
          • 1970-01-01
          相关资源
          最近更新 更多