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

时间:2020-09-23 14:04:09

标签: android android-fragments android-viewpager android-architecture-navigation android-navigation

我有一个Fragment A可以导航到Fragment B

Fragment B托管一个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")
        )

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

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

据我了解,导航组件仍在Fragment B上,但是我试图从Fragment D导航到Fragment C,因此引发异常。

我(认为)可以通过添加一个侦听器来解决此问题,该侦听器会在Fragment B中敲击项目时通知Fragment C,然后从Fragment D导航至Fragment B。但是,这会使我的Fragment CFragment B紧密耦合,而我不想这么做。反正要解决这个问题是另一种方式吗?

1 个答案:

答案 0 :(得分:2)

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

如果您从不navigate()Fragment C,并且只能在ViewPager中查看,则Fragment C不应在图形中成为Fragment B的ViewPager中来自片段的任何操作都应直接是Fragment B上的操作(您实际位于的目标)。

请注意,如果您还使用相同的动作名称,例如Fragment D,也可以将它们用作图形中的独立目标(因此请确保在两种情况下都可以使用该动作)。