【问题标题】:Navigation Component: pass safeArgs from activity to a fragment导航组件:将 safeArgs 从活动传递到片段
【发布时间】:2026-02-23 11:10:02
【问题描述】:

我有两个图表,所以第一个图表从一个片段移动到一个将 safeArgs 传递给活动的活动。

val action = MyFragmentDirections.actionMyActivity(arg1, arg2)
Navigation.findNavController(view).navigate(action)  

现在第二个,我想将这些参数从MyActivity 传递给属于此活动的片段。

我可以得到参数:

val args = MyActivity.fromBundle(intent.extras)

问题是这个活动没有Directions 文件,所以我不能传递参数。

【问题讨论】:

  • 您是否尝试将参数传递给您的第二个活动导航图的startDestination
  • MainActivity 的片段导航到具有片段的 DetailActivity(这是主片段,或 DetailActivity 图的 startDestination)。你能检查我的答案,知道它是否是解决它的正确方法吗?

标签: android navigation android-architecture-components android-jetpack


【解决方案1】:

Navigation 1.0.0-alpha07 修复了 feature request 以将参数传递到图形的起始目的地。

要使用它,您需要:

  1. NavHostFragment 中删除app:navGraph 属性
  2. 致电findNavController(R.id.your_nav_host_fragment).setGraph(R.navigation.your_graph, intent.extras)

使用您之前在app:navGraph 标签上的NavHostFragmentR.navigation 中的R.id。通过将参数传递给setGraph 调用,您的起始目的地将直接获取参数,而无需再次调用navigate(默认情况下,这将在您的后台堆栈上创建目的地的新实例 - 不是您想要的) .

【讨论】:

  • findNavController() 要求我查看视图,我使用的是 findViewById。您可以将其编辑为 findNavController(findViewById(R.id.your_nav_host_fragment)) 吗?感谢您的帮助!
  • 听起来你没有使用 -ktx 依赖项(如果你正在编写 Kotlin 代码,你真的应该这样做)。如果您不使用 Kotlin 扩展,正确的替换是 Navigation.findNavController(this, R.id.your_nav_host_fragment)
  • @Ian 提问者提到他通过 Safe Args 将数据传递给第二个活动。如果第二个活动在单独的模块中(不依赖于第一个模块),是否仍然可以使用 Safe Args?我看到生成的 Args 类是在第一个模块中创建的,因此第二个活动无权访问它。谢谢!
  • 哇,nvm。我说得太早了。我可以从意图中获取额外的东西......太棒了!
  • 有什么方法可以使用 SafeArgs 吗?
【解决方案2】:

我不知道这是否被推荐,但它正在工作:

val args = MyActivity.fromBundle(intent.extras)
navController.navigate(R.id.myActivityFragment, args.toBundle())

【讨论】:

  • 使用片段的参数:val bundle = bundleOf("message_tip" to "") findNavController().navigate(R.id.helpFragment, HelpFragmentArgs.fromBundle(bundle).toBundle())
最近更新 更多