繁体   English   中英

如何在子片段之间导航?

[英]How to navigate between child Fragments?

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

以下是我到目前为止所做的:

https://pastebin.com/dNQ0Ep4S代码示例很大,所以总结一下,我想做的是“A>B and Ba>Bb”。 Ba是片段B内部的片段。 我不确定如何为类似的东西设置nav graph

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

更新

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

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

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

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

或者您可以使用非喷气背包方式,我不推荐,但根据您的 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()的功能。 Fragment B不是navhost只是一个普通的Fragment BnavhostB的孩子。 findNavController()的参数必须是NavHostFragment而不是常规Fragment 所以通过传递, this (作为B ),它没有得到一个NavFragment ,只是一个普通的Fragment 我认为该方法会从传递的任何fragment中提取navhost 猜猜文档引起了一些混乱。 要获得正确的navhost ,我必须像getChildFragmentManager().findFragmentById(navHostResId)那样从片段管理器中获取navhost (在我的例子中, navHostResIdB中片段容器的id )。 然后一切都很顺利。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM