Navigation 通过Activity传递data到startDestination和fragment之间数据共享

最近花了不少心血去研究从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版权协议,转载请附上原文出处链接和本声明。