导航组件:将 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
标签上的NavHostFragment
和R.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 导航组件
将 SafeArgs 与 Proguard 和导航架构组件一起使用时出现 ClassNotFoundException?