我有一个Fragment A
可以导航到Fragment B
Fragment B
托管一个ViewPager2
。
ViewPager2
中有两个片段-Fragment C
和Fragment 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 C
与Fragment B
紧密耦合,而我不想这么做。反正要解决这个问题是另一种方式吗?
答案 0 :(得分:2)
如果您没有navigate()
至Fragment C
和Fragment D
,则将停留在导航到的最后一个目的地:Fragment B
,这是预期的行为。 NavController对子片段一无所知,例如Fragment B
的ViewPager中的片段,因此您永远不会以Fragment C
作为目的地。
如果您从不navigate()
到Fragment C
,并且只能在ViewPager中查看,则Fragment C
不应在图形中成为。 Fragment B
的ViewPager中来自片段的任何操作都应直接是Fragment B
上的操作(您实际位于的目标)。
请注意,如果您还使用相同的动作名称,例如Fragment D
,也可以将它们用作图形中的独立目标(因此请确保在两种情况下都可以使用该动作)。