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

Navigation Component: Navigate from Fragment in Viewpager to another Fragment

我有一个 Fragment A 导航到 Fragment B

Fragment B 主持 ViewPager2.

ViewPager2 中有两个片段膨胀 - Fragment CFragment D.

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

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

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 C 导航到 Fragment D,因此它抛出异常。

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

如果您不 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 等片段上重复使用相同的操作名称,前提是您还将它们用作图表中的独立目标(从而确保操作在两种情况下都可用)。