如何通过NavController向打开的Fragment传递布尔类型参数?
问题
我的Activity中有一个通过Uri打开Fragment的navigate方法,代码如下:
... fun navigate(uri: Uri, savedInstanceState: Bundle?) { with(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment) { val authGraph: NavGraph = navController.navInflater.inflate(R.navigation.auth_nav_graph) maybeSetIapNavGraphs(navHostFragment.navController, authGraph) navController.graph = authGraph if (savedInstanceState == null) { navController.popBackStack() navController.navigate(uri) } } } ...
我需要向即将打开的Fragment传递一个布尔值,但发现带Uri参数的navigate方法不接收Bundle,仅有的重载是.navigate(uri, NavOptions),似乎无法传递Bundle。
我曾尝试以下方式:
... fun navigate(uri: Uri, savedInstanceState: Bundle?) { with(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment) { val authGraph: NavGraph = navController.navInflater.inflate(R.navigation.auth_nav_graph) maybeSetIapNavGraphs(navHostFragment.navController, authGraph) val bundle = Bundle().apply { putInt("isEnabled", 1) } navController.setGraph(authGraph, bundle) if (savedInstanceState == null) { navController.popBackStack() navController.navigate(uri) } } } ...
但在Fragment中通过val arg1Value = requireArguments().getInt("isEnabled")获取值时,得到的结果是0。请问如何正确向Fragment传递布尔值?
解决方案
方法一:将参数附加到Uri中
直接把布尔参数编码到Uri的查询参数里,在Fragment中解析Uri获取值。
修改Activity中的navigate方法:
fun navigate(uri: Uri, savedInstanceState: Bundle?) { // 给原Uri添加布尔查询参数 val uriWithArgs = uri.buildUpon() .appendQueryParameter("is_enabled", "true") // 替换为实际布尔值变量 .build() with(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment) { val authGraph: NavGraph = navController.navInflater.inflate(R.navigation.auth_nav_graph) maybeSetIapNavGraphs(navHostFragment.navController, authGraph) navController.graph = authGraph if (savedInstanceState == null) { navController.popBackStack() navController.navigate(uriWithArgs) } } }
在目标Fragment中解析参数:
// 获取导航传递的Uri val deepLinkUri = requireArguments().getString(NavController.KEY_DEEP_LINK_URI)?.let { Uri.parse(it) } // 解析布尔参数,设置默认值为false val isEnabled = deepLinkUri?.getBooleanQueryParameter("is_enabled", false) ?: false
方法二:使用NavDeepLinkRequest传递Bundle
通过NavDeepLinkRequest构建导航请求,直接附加参数Bundle,这是更直接的参数传递方式。
修改Activity中的navigate方法:
fun navigate(uri: Uri, savedInstanceState: Bundle?) { with(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment) { val authGraph: NavGraph = navController.navInflater.inflate(R.navigation.auth_nav_graph) maybeSetIapNavGraphs(navHostFragment.navController, authGraph) navController.graph = authGraph if (savedInstanceState == null) { navController.popBackStack() // 创建包含布尔参数的Bundle val argsBundle = Bundle().apply { putBoolean("isEnabled", true) // 替换为实际布尔值变量 } // 构建DeepLink请求 val deepLinkRequest = NavDeepLinkRequest.Builder .fromUri(uri) .build() // 使用带Bundle的重载方法完成导航 navController.navigate(deepLinkRequest, argsBundle) } } }
在目标Fragment中直接获取参数:
val isEnabled = requireArguments().getBoolean("isEnabled", false)
关于你之前尝试的问题说明
你之前用setGraph(authGraph, bundle)设置的是导航图的全局参数,但后续调用navigate(uri)启动的目标Fragment并不会自动继承这个全局参数,所以无法获取到值。这种方式适用于给整个导航图内的所有目的地传递通用参数,而非单个目的地,因此不适合你的场景。
内容的提问来源于stack exchange,提问作者Sirop4ik
相关产品推荐
相关产品推荐

