Jetpack Navigation 如何传递参数

在使用Navigation时,Fragment跳转需要传递参数。

一、Fragment跳转之间传递参数。

切换Fragment使用NavController.navigate(@IdRes int resId, @Nullable Bundle args)
那么我们传递数据只要将数据放入Bundle中即可实现传递。

二、如何传递给Activity的首个Fragment

使用Navigation时,在<navigation>……</navigation>中会有一个指定的Fragment。这个Fragment一般是通过androidx.fragment.app.FragmentContainerView
填充,那么默认就会启动指定的Fragment。

那么如何给这个Fragment传递数据呢。

首先,需要在所依赖的Activity中设置数据(我们通过Bundle传递数据)

private fun setupNavigation(data: Bundle) {
    val fragment = supportFragmentManager.findFragmentById(R.id.nav_xxx) as NavHostFragment
    val controller = fragment.navController
    val navigation = controller.graph
    val navArgument = NavArgument.Builder()
            .setDefaultValue(data)
            .build()
    navigation.addArgument("bundle", navArgument)
}
复制代码

其次,Fragment中获取数据

    val argument = NavHostFragment.findNavController(this).graph.arguments["bundle"]
    argument?.let {
        val value = it.defaultValue as Bundle
        xxx = value.getString(xxx)
        yyy = value.getString(yyy)
    }
    
复制代码

注意点:

  • 在获取NavController时需要使用上面的NavHostFragment方式来获取,并在Oncreate中传递数据
  • 使用Navigation.findNavController(this, viewId) 获取NavController时在onCreate中可能会报错,需要在View.post()中处理,因为通过该方式在onCreate()方法获取时,NavController还没有生成。会抛出异常。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享