Jetpack Navigation 如何传递参数

4,313 阅读1分钟

在使用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
        val xxx = value.getString(xxx)
        val yyy = value.getString(yyy)
    }
    

注意点:

  • 在获取NavController时需要使用上面的NavHostFragment方式来获取,并在Oncreate中传递数据
  • 使用Navigation.findNavController(this, viewId) 获取NavController时在onCreate中可能会报错,需要在View.post()中处理,因为通过该方式在onCreate()方法获取时,NavController还没有生成。会抛出异常。
  • 在传递参数过程中,首个Fragment一定会被创建,如果我们在可能用不到首页Fragment时,就不能使用这种方式,可以采用getActivity来获取参数或者使用EventBus发送Sticky消息。