导航组件:从Viewpager中的Fragment导航到另一个Fragment

krt*_*ush 6 android android-fragments android-viewpager android-navigation android-architecture-navigation

我有一个Fragment A导航到Fragment B

Fragment B主机 a ViewPager2.

ViewPager2里面有两个膨胀的碎片 -Fragment CFragment D

单击 中的项目后,Fragment C我想导航到Fragment D之上的新实例Fragment B

目前,我的代码是这样的 -

findNavController().navigate(
            R.id.action_FragmentC_to_FragmentD,
            bundleOf("id" to id, "type" to "list")
        )
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试导航时,出现以下异常 -

java.lang.IllegalArgumentException: Navigation action/destination com.test.at:id/action_FragmentC_to_FragmentD cannot be found from the current destination Destination(com.krtkush.audiotime:id/FragmentB) label=FragmentB
Run Code Online (Sandbox Code Playgroud)

据我所知,导航组件仍然处于打开状态Fragment B,但我正在尝试导航到Fragment Dfrom Fragment C,因此它引发了异常。

我(认为)可以通过添加一个侦听器来解决此问题,该侦听器会通知Fragment B何时点击该项目 Fragment C,然后导航到Fragment Dfrom Fragment B。然而,这将使我与我不希望的Fragment C紧密耦合。Fragment B无论如何,解决这个问题还有另一种方法吗?

ian*_*ake 7

如果您不navigate()这样做Fragment CFragment D,您将保留在您导航到的最后一个目的地:Fragment B,这是预期的行为。NavController 对子片段(例如 ViewPager 中的片段)一无所知Fragment B,因此您永远不会Fragment C作为目的地。

如果您从不navigate()这样做Fragment C,并且它只能作为 ViewPager 的一部分查看,那么Fragment C就不应该出现在您的图表中。Fragment BViewPager中片段中的任何操作都应该是Fragment B直接操作(您实际所在的目的地)。

请注意,您可以在片段上重复使用相同的操作名称,例如Fragment D您也将它们用作图形中的独立目标(从而确保该操作在两种情况下都可用)。