在导航组件中检测弹出
Detect pop in Navigation Component
在 Navigation Component 中,如何检测 fragment 是否从 pop 事件被带到前面?
我从 A 转到 B,现在我使用返回键关闭 B,它 returns 到 A,现在在 A(在 onViewCreated 事件中)我想检测到它来自 B.
这是我的解决方案。
在 A 中,添加默认值为 false
的导航参数(在 nav_graph.xml 中)
在 B 中,添加返回 A 的导航。要处理按下的后退按钮,请在 onCreate()
中添加以下内容
requireActivity().onBackPressedDispatcher.addCallback {
val action = BDirections.actionBFragmentAFragment(true)
findNavController().navigate(action)
}
现在您可以确定 A 的显示方式了。另外,使用 popUpTo 来正确处理循环逻辑。如果您发现此方法有任何缺陷,请告诉我。
如果我们使用单个 NavController。
findNavController((R.id.nav_host_fragment)
.addOnDestinationChangedListener{ hostController, destination, _ ->
val push = currentBackStackSize < hostController.bacStack.size // else pop
// Then save current backstack size
}
这个解决方案可能并不总是正确的,但目前我想不出一个边缘案例。请随时指正。
在 Navigation Component 中,如何检测 fragment 是否从 pop 事件被带到前面?
我从 A 转到 B,现在我使用返回键关闭 B,它 returns 到 A,现在在 A(在 onViewCreated 事件中)我想检测到它来自 B.
这是我的解决方案。
在 A 中,添加默认值为 false
的导航参数(在 nav_graph.xml 中)
在 B 中,添加返回 A 的导航。要处理按下的后退按钮,请在 onCreate()
requireActivity().onBackPressedDispatcher.addCallback {
val action = BDirections.actionBFragmentAFragment(true)
findNavController().navigate(action)
}
现在您可以确定 A 的显示方式了。另外,使用 popUpTo 来正确处理循环逻辑。如果您发现此方法有任何缺陷,请告诉我。
如果我们使用单个 NavController。
findNavController((R.id.nav_host_fragment)
.addOnDestinationChangedListener{ hostController, destination, _ ->
val push = currentBackStackSize < hostController.bacStack.size // else pop
// Then save current backstack size
}
这个解决方案可能并不总是正确的,但目前我想不出一个边缘案例。请随时指正。