导航架构组件 - 将参数数据传递给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包装。

我们必须手动充气NavHostFragmentgraph

使用

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组件指南中偶然发现了它。这里提到了如何将参数传递给起始目的地:

https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment

简而言之

  1. 您必须以编程方式设置导航图:
findNavController(R.id.main_content)
                .setGraph(R.navigation.product_detail_graph, intent.extras)
  1. 不要在NavHostFragment XML声明中设置图形。
  2. 阅读接收方的附加内容:
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的主要内容,如果未能解决你的问题,请参考以下文章

Android 导航架构组件:如何将捆绑数据传递给 startDestination

Primeng - 对话服务将数据传递给对话组件

Angular 2:将数据传递给路由?

将动态数据传递给 Vue 参数/路由

Vue路由器:如何将数据传递给链接到的组件?

如何将变量数据传递给 createFragementContainer