回答我自己的问题,因为我在更新的导航文档中找到了正确的方法。
在写这个答案时,我正在使用Navigation 2.2.0-alpha01
如果您想将一些数据作为主机活动的参数直接传递到起始目的地,则需要在主机活动的 onCreate() 方法中手动设置主机的导航图,如下所示:
获取 navController:
val navController by lazy { findNavController(R.id.<your_nav_host_id>) }
然后在宿主活动中onCreate()
val bundle = Bundle()
bundle.putString("some_argument", "some_value")
navController.setGraph(R.navigation.<you_nav_graph_xml>, bundle)
或者,如果您想将整个意图附加信息原样传递给 startDestination:
navController.setGraph(R.navigation.<you_nav_graph_xml>, intent.extras)
Since intent.extras
会返回一个Bundle
only
当您使用 setGraph() 方法设置 navGraph 时,应避免设置 app:NavGraph 属性
NavHostFragment 定义,因为这样做会导致膨胀
并设置导航图两次。
在阅读 startDestination 片段中的这些参数时:
如果您正在使用安全参数插件 https://developer.android.com/guide/navigation/navigation-pass-data#Safe-args(这是非常推荐的),然后在你的片段中:
private val args by navArgs<DummyFragmentArgs>()
Safe Args 插件将通过将 Args 附加到您的片段名称来生成 Args 类。例如,如果您的片段被称为DummyFragment
然后 Safe Args 会生成一个名为DummyFragmentArgs
where navArgs<>
是定义在中的扩展函数安卓KTX https://developer.android.com/kotlin/ktx
如果您不使用 Android KTX,您可以获取 args 对象,如下所示:
val args = DummyFragmentArgs.fromBundle(arguments!!)
获取参数对象后,您可以简单地获取参数:
args.someArgument
注意我们是如何通过的"some_argument"
作为论证,我们将其解读为someArgument
使用安全参数
如果您不使用 Safe Args(但没有理由不使用它),您可以像这样访问您的参数:
arguments?.getString("some_argument")
所有这些都记录在迁移到导航组件文档中:https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment