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)
}
}
}
Thanks in Advance