Passing data between parent fragment to child fragment using Nagivation Jetpack

614 Views Asked by At

I have a fragment name is HomeNavHostFragment và trong layout của nó tôi có chứa một FragmentContainerView: I have a fragment named HomeNavHostFragment and its layout contains a FragmentContainerView And specifically my code snippets are like below:

Kotlin code:

class HomeNavHostFragment : BaseFragment<FragmentHomeNavHostBinding, HomeNavHostViewModel>() {


    override val layoutResourceId: Int = R.layout.fragment_home_nav_host
    override val classTypeOfViewModel: Class<HomeNavHostViewModel> =
        HomeNavHostViewModel::class.java
    override val nestedNavHostFragmentId: Int = R.id.nested_nav_host_fragment_home
    override val navGraphId: Int = R.navigation.nav_graph_home

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val mainNavController =
            Navigation.findNavController(requireActivity(), R.id.nav_host_fragment)

        val nestedNavHostFragment =
            childFragmentManager.findFragmentById(nestedNavHostFragmentId) as? NavHostFragment
        navController = nestedNavHostFragment?.navController


        listenOnBackPressed()

    }
    @SuppressLint("BinaryOperationInTimber")
    override fun initView() {
        super.initView()
    }


}

fragment_navhost_home.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/nested_nav_host_fragment_home"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:defaultNavHost="false"
            app:navGraph="@navigation/nav_graph_home" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

nav_graph_home.xml:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment_nav_host_home"
    app:startDestination="@id/home_fragment">


    <fragment
        android:id="@+id/home_fragment"
        android:name="com.apps.ultrawallpapers.view.home.HomeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" />

</navigation>

And I am facing a problem that I have a data in HomeNavHostFragment I need to send to HomeFragment but I don't know how to do it, even though I tried the below code inside onViewCreated() of HomeNavHostFragment, but it can't solve the problem there, so can someone help me to solve this problem.

     var bundle = bundleOf("KEY" to "SAMPLE")

     mainNavController.setGraph(R.navigation.nav_graph_home,bundle)

My example is following the instructions from this link: Sample

EDIT

With the help of Arpit Shukla I managed to solve the problem, Partly due to my own lack of it, The way to solve that problem is: remove line app:navGraph="@navigation/nav_graph_home in fragment_navhost_home.xml and inside onViewCreated of HomeNavHostFragment you need to add the following code:

 var bundle = bundleOf("KEY" to "SAMPLE")
 navController?.setGraph(R.navigation.nav_graph_home,bundle)

0

There are 0 best solutions below