如何解决如何在子 Fragment 之间导航?
我了解如何使用 Jetpack 的 Navigation Component
在片段之间导航,但我无法找到如何从一个子片段导航到另一个子片段。
以下是我目前所做的:
https://pastebin.com/dNQ0Ep4S 代码示例非常大,所以总结一下,我正在尝试做的是“A>B 和 Ba>Bb”。 Ba
是片段 B
内的片段。我不知道如何设置 nav graph
类似的东西
导航一直工作到 home
片段。 bot nav
似乎不起作用。它始终显示挂起的布局。我尝试的另一件事是将 nav graph
的 home
设置为与 login
使用的相同,并将待处理和历史片段添加到导航文件中,无需任何操作。但是 home
加载了 login
,标签可以工作,但它们正在替换 home
片段而不是放置在 home nav host
中。
更新
我设法找到了问题,但我一直在寻找解决方案。
因此,当我将 B
设置为 navhost
时,A
似乎为 botnavview
获取了 navcontroller
。因此,从 NavController navController = NavHostFragment.findNavController(this);
调用 B
会返回 navhost
的 A
。我在这里迷路了。如果我这样做 NavController navController2 = Navigation.findNavController(currentActivity,R.id.homeNavHostFragmentContainer);
(homeNavHostFragmentContainer
是 navhost
的 B
)仍然返回 navhost
的 A
。出于某种原因,我无法获得对 B
的 navhost
的引用。
解决方法
通常我们使用: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()
}
}
,
我的问题是我误解了 NavHostFragment.findNavController()
的功能。片段 B
不是 navhost
只是一个普通的 Fragment
。 navhost
的 B
是 B
的子代。 findNavController()
的参数必须是 NavHostFragment
而不是常规的 Fragment
。因此,通过传递 this
(即 B
),它没有得到 NavFragment
,只是一个普通的 Fragment
。我认为该方法会从传递的任何 navhost
中提取 fragment
。猜猜文档引起了一些混乱。为了获得正确的 navhost
,我必须像这样从片段管理器获得 navhost
getChildFragmentManager().findFragmentById(navHostResId)
(在我的例子中,navHostResId
是 id
B
中的片段容器)。然后一切都很顺利。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。