导航架构组件 - 将参数数据传递给startDestination
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了导航架构组件 - 将参数数据传递给startDestination相关的知识,希望对你有一定的参考价值。
我有一个活动A,它启动活动B传递一些意图数据。活动B托管来自新导航架构组件的导航图。我想将该意图数据作为参数传递给startDestination片段如何做到这一点?
TLDR:您必须手动膨胀图形,将键/值添加到defaultArgs,并在navController
上设置图形。
步骤1
文档告诉您在<fragment>
布局中的Activity
标签中设置图形。就像是:
<fragment
android:id="@+id/navFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:graph="@navigation/nav_whatever"
app:defaultNavHost="true"
/>
删除设置graph=
的行。
第2步
在将显示您的NavHostFragment
的Activity中,像这样膨胀图形:
val navHostFragment = navFragment as NavHostFragment
val inflater = navHostFragment.navController.navInflater
val graph = inflater.inflate(R.navigation.nav_whatever)
其中navFragment
是你用XML给你的片段的id,如上所述。
第3步[至关重要!]
创建一个包来保存您想要传递给startDestination
片段的参数,并将其添加到图的默认参数中:
val bundle = Bundle()
// ...add keys and values
graph.addDefaultArguments(bundle)
第4步
在主机的navController
上设置图表:
navHostFragment.navController.graph = graph
它已在1.0.0-alpha07
修复。 See detail.
该解决方案类似于Elliot Schrock的答案,但是由官方API包装。
我们必须手动充气NavHostFragment
或graph
使用
NavHostFragment.create(R.navigation.graph, args)
要么
navController.setGraph(R.navigation.graph, args)
args是我们想要传递到起始目的地的数据。
好的,感谢Google团队的Ian Lake,我找到了解决这个问题的方法。假设您有一个活动A,它将使用一些意图数据启动活动B,并且您希望在startDestination中获取该数据,如果您使用安全参数,那么您可以在这里获得两个选项。
StartFragmentArgs.fromBundle(requireActivity().intent?.extras)
从Intent中读取args。如果你不使用安全args,你可以从你自己使用的requireActivity().intent?.extras
包中提取数据,这将返回你可以使用的Bundle而不是片段getArguments()
方法。这就是我尝试它,一切正常。
我认为1.0.0版本再次发生了变化。谷歌在官方文档中隐藏了这些信息。或者至少我很难找到它,但在Migrate to Navigation组件指南中偶然发现了它。这里提到了如何将参数传递给起始目的地:
简而言之
- 您必须以编程方式设置导航图:
findNavController(R.id.main_content) .setGraph(R.navigation.product_detail_graph, intent.extras)
- 不要在NavHostFragment XML声明中设置图形。
- 阅读接收方的附加内容:
val args by navArgs<ProductDetailsArgs>() val productId = args.productId
更新:谷歌已经表示,确实缺少将参数传递给初始导航目标的官方文档。希望这很快就会作为导航组件文档的一部分添加。
所以对于人们仍然在努力解决这个问题。我发现了另一种方法,不使用Safe-Args,而是使用@Elliot的答案。
因此,假设您在活动A的活动B中收到了一些参数,而您的活动B有一个片段startDestination,您正在初始化Nav控制器,如下所示:
navController = Navigation.findNavController(this, R.id.detailFragment);
从Nav Controller中,您可以访问您在XML中设置的图形,并且您可以在defaultArguments中设置参数:
navController.getGraph().addDefaultArguments(extras);
注意:如果密钥的值已经存在于图形xml中,这也将更新密钥的值
现在在Fragment中你必须找到NavHostFragment中的默认参数,如下所示:
Bundle defaultArguments = NavHostFragment.findNavController(this).getGraph().getDefaultArguments();
你会在那里拥有价值观。我不知道为什么@Elliot认为它至关重要,但它应该是这样的?
UPDATE alpha09:此版本不再支持addDefault参数,您必须使用NavArgument
以上是关于导航架构组件 - 将参数数据传递给startDestination的主要内容,如果未能解决你的问题,请参考以下文章