最近花了不少心血去研究从activity传递数据到startDestination的Fragment,网上查了不少资料都不行(有些方法只能传递静态数据,而我的是从接口获取数据,然后传递)而且我的场景是startDestination的Fragment里面还会嵌套子Frgment,就涉及从父fragment到子fragment的数据传递,好了废话不多说上代码
前面一些基础步骤:
1.activity的xml布局里面放入盛载fragment的容器
这里面需要注意的点就是app:navGraph属性一定要去掉,一定要去掉,重要的事情说两遍
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmentContainerView"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
//app:navGraph="@navigation/nav_graph"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/iv_smart"
app:layout_constraintTop_toBottomOf="@+id/toolbar">
</androidx.fragment.app.FragmentContainerView>
2.创建导航图,细节不说,添加startDestination的Fragment和其他目的地的fragment
3.在activity中通过viewmodel从接口获取数据,并进行如下操作
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment?
navController = navHostFragment?.navController!!
viewModel.Info.observe(this) {
val data = it
val list = data.list
val bundle = Bundle()
bundle.putSerializable("data", list)
navController.setGraph(R.navigation.nav_graph, bundle)
}
4.在startDestination的Fragment中添加如下代码
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val data = arguments?.getSerializable("data")
}
经测试可以完美传递和接收数据,
之后的fragment之间传递数据比较简单,有时间再补充一下,主要是通过共享viewmodel来实现
版权声明:本文为u013075460原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。