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

Android Activity中动态选择NavGraph并传递SafeArgs问题

解决方案

1. 动态选择初始导航图并传递SafeArgs参数

在Activity的onCreate方法中完成导航图的动态选择,同时正确传递参数给导航图B的起始目标:

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

    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController

    // 替换为你的实际判断逻辑,决定加载导航图A还是B
    val loadGraphB = true
    if (loadGraphB) {
        val inflater = navController.navInflater
        val graphB = inflater.inflate(R.navigation.nav_graph_B)
        // 生成随机int参数
        val randomNum = (0..100).random()
        // 用SafeArgs自动生成的参数类创建Bundle,确保类型匹配
        val startArgs = NavGraphBStartDestinationArgs(veryNiceNumber = randomNum).toBundle()
        // 设置导航图并传递起始目标的参数
        navController.setGraph(graphB, startArgs)
    } else {
        val graphA = navController.navInflater.inflate(R.navigation.nav_graph_A)
        navController.setGraph(graphA)
    }
}

关键修正点:

  • 把导航图设置逻辑从onStart移到onCreate,避免页面重复启动时重复设置
  • 使用SafeArgs生成的参数类创建Bundle,保证veryNiceNumber的int类型匹配,解决之前的类型错误
  • 通过navController.setGraph(graph, args)直接给起始目标传参,而非addInDefaultArgs(该方法是给整个导航图设置全局默认参数,并非起始目标的专属参数)

在导航图B的起始Fragment中,通过SafeArgs获取参数:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val args = NavGraphBStartDestinationArgs.fromBundle(requireArguments())
    val receivedNum = args.veryNiceNumber
    // 后续业务逻辑使用该参数
}

2. 导航图B返回时切换到导航图A

在导航图B的起始Fragment中,拦截返回键并切换到导航图A:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
        val navController = findNavController()
        // 判断当前是否为导航图B的起始页面
        if (navController.currentDestination?.id == navController.graph.startDestinationId) {
            // 切换到导航图A
            val graphA = navController.navInflater.inflate(R.navigation.nav_graph_A)
            navController.setGraph(graphA)
        } else {
            // 非起始页面,正常返回上一级
            navController.popBackStack()
        }
    }
}

说明:

  • 先判断当前页面是否为导航图B的起始目标,避免干扰导航图B内部的页面返回逻辑
  • 通过navController.setGraph(graphA)直接切换导航图,实现返回导航图A的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:15:37