如何在子 Fragment 之间导航?

时间:2021-02-07 00:05:26

标签: java android android-fragments android-jetpack-navigation

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

以下是我目前所做的:

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

导航一直工作到 home 片段。 bot nav 似乎不起作用。它始终显示挂起的布局。我尝试的另一件事是将 nav graphhome 设置为与 login 使用的相同,并将待处理和历史片段添加到导航文件中,无需任何操作。但是 home 加载了 login,标签可以工作,但它们正在替换 home 片段而不是放置在 home nav host 中。

更新

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

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

2 个答案:

答案 0 :(得分:0)

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

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

或者您可以使用非喷气背包方式,我不推荐,但根据您的用户界面,您可能需要它:

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

答案 1 :(得分:0)

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

相关问题