在使用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