You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Navigation Architecture Component:如何向startDestination传递参数数据

把Activity的Intent数据传递给导航图的Start Destination Fragment

我来给你详细拆解怎么实现这个需求,思路其实很清晰,咱们一步步来:

1. 先在导航图里给目标Fragment定义参数

首先得让你的startDestination Fragment明确它要接收什么参数,打开你的导航图XML(比如res/navigation/nav_graph.xml),给对应的Fragment节点添加<argument>标签。举个实际例子,假设你要传递用户ID和用户名:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_graph"
    app:startDestination="@id/startDestFragment">

    <fragment
        android:id="@+id/startDestFragment"
        android:name="com.yourpackage.StartDestFragment"
        android:label="Start Destination">
        <!-- 定义需要接收的参数,指定类型和可选默认值 -->
        <argument
            android:name="user_id"
            app:argType="string"
            android:defaultValue="" />
        <argument
            android:name="user_name"
            app:argType="string"
            android:defaultValue="Guest" />
    </fragment>

</navigation>

2. 在Activity B中取出Intent传递的数据

Activity B启动后,先把Activity A通过Intent传过来的数据提取出来,比如在onCreate方法里做这件事:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_b)

    // 从Intent里取数据,记得做非空判断避免空指针
    val userId = intent.getStringExtra("USER_ID") ?: ""
    val userName = intent.getStringExtra("USER_NAME") ?: "Guest"
}

3. 把参数传递给导航图的起始Fragment

这一步是核心,咱们要把拿到的数据传给导航组件的startDestination。最稳妥的方式是通过navController.setGraph()方法,在初始化导航图时把参数Bundle传进去:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_b)

    // 只在Activity首次创建时执行,避免屏幕旋转等场景重复初始化
    if (savedInstanceState == null) {
        // 获取NavHostFragment和对应的NavController
        val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
        val navController = navHostFragment.navController

        // 构建参数Bundle
        val argsBundle = Bundle().apply {
            putString("user_id", intent.getStringExtra("USER_ID"))
            putString("user_name", intent.getStringExtra("USER_NAME"))
        }

        // 重新设置导航图,同时把参数传递给startDestination
        navController.setGraph(R.navigation.nav_graph, argsBundle)
    }
}

⚠️ 注意:一定要判断savedInstanceState == null,不然屏幕旋转时会重复创建Fragment,导致参数被重复传递。另外,如果你的布局里用<fragment>标签声明NavHostFragment,别给它设置app:navGraph属性,不然代码里的setGraph会失效。

4. 在Start Destination Fragment中获取参数

推荐用Safe Args(类型安全的参数传递方式),比直接用arguments更靠谱,不会因为参数名拼写错误出问题。

先配置Safe Args插件

在项目根目录的build.gradle里添加插件依赖:

buildscript {
    dependencies {
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.7.6"
    }
}

然后在模块的build.gradle里应用插件(Kotlin用下面这个,Java换成id 'androidx.navigation.safeargs'):

plugins {
    // 其他插件...
    id 'androidx.navigation.safeargs.kotlin'
}

用Safe Args提取参数

同步项目后,系统会自动生成StartDestFragmentArgs类(名字和你的Fragment类对应),然后在Fragment里这样取参数:

class StartDestFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        // 用Safe Args解析参数
        val args = StartDestFragmentArgs.fromBundle(requireArguments())
        val userId = args.userId
        val userName = args.userName

        // 接下来就可以用这些数据做业务逻辑啦
        return inflater.inflate(R.layout.fragment_start_dest, container, false)
    }
}

如果不想用Safe Args,也可以直接用arguments取,但要注意类型转换和非空判断:

val userId = arguments?.getString("user_id") ?: ""

内容的提问来源于stack exchange,提问作者Ahmed Abdelmeged

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:45:26