I have an interesting and confusing question.
I have a Drawer Layout
that opens from the Bottom Navigation
like in the photo
In order for Drawer Layout
to open from the Bottom Navigation
, I used this code:
bottomNavigationView.setOnItemSelectedListener { item ->
when (item.itemId) {
R.id.itemDrawer -> {
drawerLayout.openDrawer(GravityCompat.END)
return@setOnItemSelectedListener false
}
R.id.homeFragment -> navController.navigate(R.id.homeFragment)
R.id.booksFragment -> navController.navigate(R.id.booksFragment)
R.id.grammarFragment -> navController.navigate(R.id.grammarFragment)
R.id.translatorFragment -> navController.navigate(R.id.translatorFragment)
}
true
}
This is what my problem is
When I override listener for Bottom Navigation, in my opinion, the onBackPressed
behaviour gets confused default.
I mean that when I click on Home
, then another element, then Home
again, and so on several times, and I stay on the Home Fragment
and click on onBackPressed
, then instead of leaving the app, I go back to the fragment where I was before
I think this is not normal for the user
What should I do?
I thought to somehow override onBackPressed
for Home Fragment
but I don't understand how to do it
CodePudding user response:
You can use onBackPressedDispatcher
in your HomeFragment
private lateinit var onBackPressedCallback: OnBackPressedCallback
and instantiate the implementation and add the callback to activity
in onResume()
override fun onResume() {
super.onResume()
onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
activity?.moveTaskToBack(true)
exitProcess(ZERO)
}
}
activity?.onBackPressedDispatcher?.addCallback(onBackPressedCallback)
}
Due to this callback added on activity
, then the callback should be removed on leaving HomeFragment
override fun onPause() {
onBackPressedCallback.remove()
super.onPause()
}
CodePudding user response:
I found the answer.
Everything is as in the selected answer, but need to remove this callback
in the onPause
of this fragment
. To prevent the app from closing from all fragments
1. Create a variable for callback
private lateinit var mCallback: OnBackPressedCallback
2. In onViewCreated
:
mCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
activity?.moveTaskToBack(true)
exitProcess(0)
}
}
activity?.onBackPressedDispatcher?.addCallback(mCallback)
3. Remove callback
when closing the fragment
override fun onPause() {
mCallback.remove()
super.onPause()
}