Android导航体系结构组件:如何将捆绑数据传递到startDestination

Pra*_*ngh 5 java android android-navigation android-architecture-components android-architecture-navigation

我有一个活动NavHostFragment。活动收到其意图的某些值。我想将此数据传递到startDestination导航图的第一个片段。我找不到与此有关的任何文档。

我已经在SO上解决这个问题,但是我似乎找不到的addDefaultArguments方法navController.getGraph()

可以将捆绑商品传递给startDestination吗?

Pra*_*ngh 13

回答我自己的问题,因为我在更新的导航文档中找到了正确的方法。

在撰写此答案时,我正在使用 Navigation 2.2.0-alpha01

如果您想将一些数据作为主机活动的参数直接传递到开始目的地,您需要在主机活动的 onCreate() 方法中手动设置您的主机导航图,如下所示:

获取您的导航控制器:

val navController by lazy { findNavController(R.id.<your_nav_host_id>) }
Run Code Online (Sandbox Code Playgroud)

然后在主机活动的 onCreate()

val bundle = Bundle()
bundle.putString("some_argument", "some_value")
navController.setGraph(R.navigation.<you_nav_graph_xml>, bundle)
Run Code Online (Sandbox Code Playgroud)

或者,如果您想将整个意图附加内容按原样传递给 startDestination:

navController.setGraph(R.navigation.<you_nav_graph_xml>, intent.extras)
Run Code Online (Sandbox Code Playgroud)

由于intent.extras将返回Bundle唯一

使用 setGraph() 方法设置导航图时,应避免在 NavHostFragment 定义中设置 app:NavGraph 属性,因为这样做会导致导航图膨胀和设置两次。

在 startDestination 片段中阅读这些参数时:

如果您使用的是Safe Args 插件(非常推荐),则在您的片段中:

private val args by navArgs<DummyFragmentArgs>()
Run Code Online (Sandbox Code Playgroud)

Safe Args 插件将通过将 Args 附加到您的片段名称来生成 Args 类。例如,如果您调用片段,DummyFragment那么 Safe Args 将生成一个名为的类DummyFragmentArgs

Android KTX中navArgs<>定义的扩展函数在哪里

如果您不使用 Android KTX,您可以获得 args 对象,如:

val args = DummyFragmentArgs.fromBundle(arguments!!)
Run Code Online (Sandbox Code Playgroud)

一旦你获得了参数对象,你就可以简单地获取你的参数:

args.someArgument
Run Code Online (Sandbox Code Playgroud)

注意我们"some_argument"是如何作为参数传递的,我们正在阅读它作为someArgument使用安全参数

如果你没有使用 Safe Args(虽然没有理由不使用它),你可以像这样访问你的参数:

arguments?.getString("some_argument")
Run Code Online (Sandbox Code Playgroud)

所有这些都记录在迁移到导航组件文档中:https : //developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment


归档时间:

查看次数:

2463 次

最近记录:

6 年 前