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
相关产品推荐
相关产品推荐

