Navigation Component Safe Args Issue on Navigation Drawer

200 Views Asked by At

I have implemented Navigation drawer using Android Navigation Component which has two fragments

1.Home Fragment

2.Product Fragment

I have created another fragment Search Fragment as global action , which has edit text and a button.

Problem :-

From Search Fragment when I Click on a Button it will return to Home Fragment with search query as safe argument, this is working fine but after receiving argument in Home Fragment then when I open Product Fragment using navigation drawer and press back button then the search query will again be sent to Home Fragment

My Code :-

nav_graph.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/nav_graph"
   app:startDestination="@id/homeFragment">

   <fragment
       android:id="@+id/homeFragment"
       android:name="com.example.navigation.HomeFragment"
       android:label="fragmnet_home"
       tools:layout="@layout/fragmnet_home">
         <argument
           android:name="query"
           app:argType="string"
           app:nullable="true"
           android:defaultValue="@null" />
   </fragment>

   <fragment
       android:id="@+id/searchFragment"
       android:name="com.example.navigation.SearchFragment"
       android:label="fragment_search"
       tools:layout="@layout/fragment_search" >
       <action
           android:id="@+id/action_searchFragment_to_homeFragment"
           app:destination="@id/homeFragment" />
   </fragment>

   <action android:id="@+id/action_global_searchFragment" app:destination="@id/searchFragment" />
   <fragment
       android:id="@+id/productFragment"
       android:name="com.example.navigation.ProductFragment"
       android:label="fragment_product"
       tools:layout="@layout/fragment_product" />
 </navigation>

MainActivity.kt

class MainActivity : AppCompatActivity() {

   private lateinit var mainBinding : ActivityMainBinding
   private lateinit var mNavController : NavController
   private lateinit var appBarConfiguration: AppBarConfiguration
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       mainBinding = ActivityMainBinding.inflate(layoutInflater)
       setContentView(mainBinding.root)

       appBarConfiguration = AppBarConfiguration(
        setOf(R.id.homeFragment),
        mainBinding.drawerLayout
    )
       val navHost = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
       mNavController = navHost.findNavController()
       setSupportActionBar(mainBinding.toolbar)
       setupActionBarWithNavController(mNavController,appBarConfiguration)
       mainBinding.navView.setupWithNavController(mNavController)
   }

   override fun onSupportNavigateUp(): Boolean {
       return mNavController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
   }
 }

HomeFragment.kt

class HomeFragment : Fragment(R.layout.fragmnet_home) {

    private lateinit var homeBinding  : FragmnetHomeBinding
    private val arguments : HomeFragmentArgs by navArgs()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        homeBinding = FragmnetHomeBinding.bind(view)

    
        if(!arguments.query.isNullOrEmpty()){
            Toast.makeText(context, "${arguments.query}", Toast.LENGTH_SHORT).show()
        }
    
        homeBinding.btnSearch.setOnClickListener {
            val destination = HomeFragmentDirections.actionGlobalSearchFragment()
            findNavController().navigate(destination)
        }
    }
}

SearchFragment.kt

class SearchFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val binding = FragmentSearchBinding.bind(view)
    
        binding.search.setOnClickListener {
            val query = binding.query.text.toString()
            val action = SearchFragmentDirections.actionSearchFragmentToHomeFragment(query)
            findNavController().navigate(action)

        }

    }
}

ProductFragment.kt

class ProductFragment : Fragment(R.layout.fragment_product) {

    private lateinit var productBinding  : FragmentProductBinding

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        productBinding = FragmentProductBinding.bind(view)
    
        productBinding.btnSearch.setOnClickListener {
            val action  = ProductFragmentDirections.actionGlobalSearchFragment()
            findNavController().navigate(action)
        }
    }
}

nav_graph image

Thanks in Advance

0

There are 0 best solutions below