如何在子片段之间导航?

How to navigate between child Fragments?

我了解如何使用 Jetpack 的 Navigation Component 在片段之间导航,但我无法找到如何从一个子片段导航到另一个子片段。

以下是我目前所做的:

https://pastebin.com/dNQ0Ep4S 代码示例非常大所以总结起来,我正在尝试做的是“A>B 和 Ba>Bb”。 Ba 是片段 B 内的一个片段。我不确定如何为类似的东西设置 nav graph

导航一直有效到 home 片段。 bot nav 似乎不起作用。它始终显示挂起的布局。我尝试的另一件事是将 homenav graph 设置为与 login 相同的设置,并将挂起和历史片段添加到导航文件而不执行任何操作。但是 home 加载 login,选项卡工作,但它们替换 home 片段而不是放在 home nav host.

更新

我设法找到了问题,但我一直在寻找解决方案。

因此,当我将 botnavview 设置为 navcontroller 时,B 似乎正在为 A 获取 navhost。所以从 B returns Anavhost 调用 NavController navController = NavHostFragment.findNavController(this);。我在这里迷路了。如果我这样做 NavController navController2 = Navigation.findNavController(currentActivity, R.id.homeNavHostFragmentContainer);homeNavHostFragmentContainernavhostfor B)仍然是 returns navhost for A。出于某种原因,我无法获得对 Bnavhost.

的引用

通常我们使用:NavigationUI with jetpack,我推荐这个,https://developer.android.com/guide/navigation with nav_graph.xml with NavigationDirections such as:

val direction = FirstFragmentDirections.actionSecondFragment()
Navigation.findNavController(requireView()).navigate(direction)

或者你可以使用非 Jetpack 方式,我不推荐,但根据你的 UI 你可能需要它:

fun displayChildFragment(frameId: Int, fragment: Fragment) {
  requireActivity().supportFragmentManager?.let {
    val transaction = it.beginTransaction()
    //transaction.setTransition(TRANSIT_FRAGMENT_OPEN)
    transaction.replace(frameId, fragment).commit()
   }
}

我的问题是我误解了 NavHostFragment.findNavController() 的功能。片段 B 不是 navhost 只是一个常规 FragmentBnavhostB 的子代。 findNavController() 的参数必须是 NavHostFragment 而不是常规的 Fragment。因此,通过传递 this(成为 B),它没有得到 NavFragment,只是一个常规的 Fragment。我认为该方法会从传递的任何 fragment 中提取 navhost。猜测文档引起了一些混乱。为了获得正确的 navhost,我必须像 getChildFragmentManager().findFragmentById(navHostResId) 这样从片段管理器中获取 navhost(在我的例子中,navHostResIdid B 中的片段容器)。然后一切都很顺利。