如何在子片段之间导航?
How to navigate between child Fragments?
我了解如何使用 Jetpack 的 Navigation Component
在片段之间导航,但我无法找到如何从一个子片段导航到另一个子片段。
以下是我目前所做的:
https://pastebin.com/dNQ0Ep4S 代码示例非常大所以总结起来,我正在尝试做的是“A>B 和 Ba>Bb”。 Ba
是片段 B
内的一个片段。我不确定如何为类似的东西设置 nav graph
导航一直有效到 home
片段。 bot nav
似乎不起作用。它始终显示挂起的布局。我尝试的另一件事是将 home
的 nav graph
设置为与 login
相同的设置,并将挂起和历史片段添加到导航文件而不执行任何操作。但是 home
加载 login
,选项卡工作,但它们替换 home
片段而不是放在 home nav host
.
中
更新
我设法找到了问题,但我一直在寻找解决方案。
因此,当我将 botnavview
设置为 navcontroller
时,B
似乎正在为 A
获取 navhost
。所以从 B
returns A
的 navhost
调用 NavController navController = NavHostFragment.findNavController(this);
。我在这里迷路了。如果我这样做 NavController navController2 = Navigation.findNavController(currentActivity, R.id.homeNavHostFragmentContainer);
(homeNavHostFragmentContainer
是 navhost
for B
)仍然是 returns navhost
for A
。出于某种原因,我无法获得对 B
的 navhost
.
的引用
通常我们使用: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
只是一个常规 Fragment
。 B
的 navhost
是 B
的子代。 findNavController()
的参数必须是 NavHostFragment
而不是常规的 Fragment
。因此,通过传递 this
(成为 B
),它没有得到 NavFragment
,只是一个常规的 Fragment
。我认为该方法会从传递的任何 fragment
中提取 navhost
。猜测文档引起了一些混乱。为了获得正确的 navhost
,我必须像 getChildFragmentManager().findFragmentById(navHostResId)
这样从片段管理器中获取 navhost
(在我的例子中,navHostResId
是 id
B
中的片段容器)。然后一切都很顺利。
我了解如何使用 Jetpack 的 Navigation Component
在片段之间导航,但我无法找到如何从一个子片段导航到另一个子片段。
以下是我目前所做的:
https://pastebin.com/dNQ0Ep4S 代码示例非常大所以总结起来,我正在尝试做的是“A>B 和 Ba>Bb”。 Ba
是片段 B
内的一个片段。我不确定如何为类似的东西设置 nav graph
导航一直有效到 home
片段。 bot nav
似乎不起作用。它始终显示挂起的布局。我尝试的另一件事是将 home
的 nav graph
设置为与 login
相同的设置,并将挂起和历史片段添加到导航文件而不执行任何操作。但是 home
加载 login
,选项卡工作,但它们替换 home
片段而不是放在 home nav host
.
更新
我设法找到了问题,但我一直在寻找解决方案。
因此,当我将 botnavview
设置为 navcontroller
时,B
似乎正在为 A
获取 navhost
。所以从 B
returns A
的 navhost
调用 NavController navController = NavHostFragment.findNavController(this);
。我在这里迷路了。如果我这样做 NavController navController2 = Navigation.findNavController(currentActivity, R.id.homeNavHostFragmentContainer);
(homeNavHostFragmentContainer
是 navhost
for B
)仍然是 returns navhost
for A
。出于某种原因,我无法获得对 B
的 navhost
.
通常我们使用: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
只是一个常规 Fragment
。 B
的 navhost
是 B
的子代。 findNavController()
的参数必须是 NavHostFragment
而不是常规的 Fragment
。因此,通过传递 this
(成为 B
),它没有得到 NavFragment
,只是一个常规的 Fragment
。我认为该方法会从传递的任何 fragment
中提取 navhost
。猜测文档引起了一些混乱。为了获得正确的 navhost
,我必须像 getChildFragmentManager().findFragmentById(navHostResId)
这样从片段管理器中获取 navhost
(在我的例子中,navHostResId
是 id
B
中的片段容器)。然后一切都很顺利。