导航组件:将 safeArgs 从活动传递到片段

Posted

技术标签:

【中文标题】导航组件:将 safeArgs 从活动传递到片段【英文标题】:Navigation Component: pass safeArgs from activity to a fragment 【发布时间】:2019-05-12 21:10:20 【问题描述】:

我有两个图表,所以第一个图表从一个片段移动到一个将 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)。你能检查我的答案,知道它是否是解决它的正确方法吗? 【参考方案1】:

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

要使用它,您需要:

    NavHostFragment 中删除app:navGraph 属性 致电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())

以上是关于导航组件:将 safeArgs 从活动传递到片段的主要内容,如果未能解决你的问题,请参考以下文章

将数据从活动传递到底部导航栏的片段

从活动向上导航到片段打开相同的片段 - Android 导航组件

如何将值从片段/活动传递到 xml?

从浏览器共享网址到导航片段

使用导航组件从一个活动导航到另一个活动

将 SafeArgs 与 Proguard 和导航架构组件一起使用时出现 ClassNotFoundException?