带抽屉布局的底部导航 |片段中的 onBackPressed
Bottom Navigation with Drawer Layout | onBackPressed in Fragment
我有一个有趣且令人困惑的问题。
我有一个 Drawer Layout
可以从 Bottom Navigation
打开,就像照片中那样
屏幕:
为了从 Bottom Navigation
打开 Drawer Layout
,我使用了以下代码:
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
}
这就是我的问题所在
在我看来,当我覆盖底部导航的侦听器时,onBackPressed
行为默认会变得混乱。
我的意思是,当我点击 Home
,然后点击另一个元素,然后再次点击 Home
,等等几次,然后我停留在 Home Fragment
并点击 onBackPressed
,然后我没有离开应用程序,而是回到了之前的片段
我认为这对用户来说是不正常的
我该怎么办?
我想以某种方式为 Home Fragment
覆盖 onBackPressed
,但我不知道该怎么做
您可以在 HomeFragment
中使用 onBackPressedDispatcher
private lateinit var onBackPressedCallback: OnBackPressedCallback
并实例化实现并将回调添加到 onResume()
中的 activity
override fun onResume() {
super.onResume()
onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
activity?.moveTaskToBack(true)
exitProcess(ZERO)
}
}
activity?.onBackPressedDispatcher?.addCallback(onBackPressedCallback)
}
由于在 activity
添加了此回调,因此应在离开 HomeFragment
时删除回调
override fun onPause() {
onBackPressedCallback.remove()
super.onPause()
}
我找到了答案。
一切都与所选答案中的一样,但需要删除此 fragment
的 onPause
中的此 callback
。防止应用程序从所有片段中关闭
1。为 callback
创建一个变量
private lateinit var mCallback: OnBackPressedCallback
2。在 onViewCreated
中:
mCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
activity?.moveTaskToBack(true)
exitProcess(0)
}
}
activity?.onBackPressedDispatcher?.addCallback(mCallback)
3。关闭 fragment
时删除 callback
override fun onPause() {
mCallback.remove()
super.onPause()
}
我有一个有趣且令人困惑的问题。
我有一个 Drawer Layout
可以从 Bottom Navigation
打开,就像照片中那样
屏幕:
为了从 Bottom Navigation
打开 Drawer Layout
,我使用了以下代码:
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
}
这就是我的问题所在
在我看来,当我覆盖底部导航的侦听器时,onBackPressed
行为默认会变得混乱。
我的意思是,当我点击 Home
,然后点击另一个元素,然后再次点击 Home
,等等几次,然后我停留在 Home Fragment
并点击 onBackPressed
,然后我没有离开应用程序,而是回到了之前的片段
我认为这对用户来说是不正常的
我该怎么办?
我想以某种方式为 Home Fragment
覆盖 onBackPressed
,但我不知道该怎么做
您可以在 HomeFragment
onBackPressedDispatcher
private lateinit var onBackPressedCallback: OnBackPressedCallback
并实例化实现并将回调添加到 onResume()
activity
override fun onResume() {
super.onResume()
onBackPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
activity?.moveTaskToBack(true)
exitProcess(ZERO)
}
}
activity?.onBackPressedDispatcher?.addCallback(onBackPressedCallback)
}
由于在 activity
添加了此回调,因此应在离开 HomeFragment
override fun onPause() {
onBackPressedCallback.remove()
super.onPause()
}
我找到了答案。
一切都与所选答案中的一样,但需要删除此 fragment
的 onPause
中的此 callback
。防止应用程序从所有片段中关闭
1。为 callback
private lateinit var mCallback: OnBackPressedCallback
2。在 onViewCreated
中:
mCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
activity?.moveTaskToBack(true)
exitProcess(0)
}
}
activity?.onBackPressedDispatcher?.addCallback(mCallback)
3。关闭 fragment
callback
override fun onPause() {
mCallback.remove()
super.onPause()
}