[英]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
似乎不起作用。 它始终显示待处理的布局。 我尝试的另一件事是将home
的nav graph
设置为与login
相同的导航图,并将未决和历史片段添加到导航文件中,无需任何操作。 但是home
加载login
,选项卡工作,但它们正在替换home
片段而不是放置在home nav host
中。
更新
我设法找到了问题,但我一直在努力寻找解决方案。
因此,当我将navcontroller
设置为botnavview
时, B
似乎正在获取A
的navhost
。 所以调用NavController navController = NavHostFragment.findNavController(this);
from B
返回A
的navhost
。 我在这里迷路了。 如果我这样做NavController navController2 = Navigation.findNavController(currentActivity, R.id.homeNavHostFragmentContainer);
( homeNavHostFragmentContainer
是B
的navhost
)仍然返回A
的navhost
。 出于某种原因,我无法获得对B
的navhost
的引用。
通常我们使用: 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
。 B
的navhost
是B
的孩子。 findNavController()
的参数必须是NavHostFragment
而不是常规Fragment
。 所以通过传递, this
(作为B
),它没有得到一个NavFragment
,只是一个普通的Fragment
。 我认为该方法会从传递的任何fragment
中提取navhost
。 猜猜文档引起了一些混乱。 要获得正确的navhost
,我必须像getChildFragmentManager().findFragmentById(navHostResId)
那样从片段管理器中获取navhost
(在我的例子中, navHostResId
是B
中片段容器的id
)。 然后一切都很顺利。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.