我猜这是因为片段正在被替换,但它们也被添加到 BackStack 中,如下所示:
BaseActivity.kt
// Note the .addToBackStack(null)
this.supportFragmentManager?.beginTransaction()?.replace(resId, newFragment)?.addToBackStack(null)?.commit()
From Documentation for addToBackStack
将此事务添加到后台堆栈。这意味着事务将在提交后被记住,并在以后从堆栈中弹出时反转其操作。
您可能想check this question 以查看有关add、replace 和addToBackStack 之间区别的更多信息。
如果您不想“记住并恢复”片段转换,只需删除对 addToBackStack 的调用即可。
编辑
如果你总是想返回第一个片段,你可以这样做:
保留addToBackStack()。所以,导航历史将被保留
this.supportFragmentManager?.beginTransaction()?.replace(resId,
newFragment)?.addToBackStack(null)?.commit()
在MainActivity 或BaseActivity 上覆盖onBackPressed 并请求始终返回到第一个事务提交:
override fun onBackPressed() {
if(this.supportFragmentManager?.getBackStackEntryCount() > 0) {
this.supportFragmentManager?.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
} else {
super.onBackPressed()
}
}
请注意这是一个测试代码,我无法验证。另外,我对 Kotlin 不熟悉。所以,这是我能提供的最好的代码......测试并让我知道结果......无论如何,你可以得到这个想法。
另一种选择:
删除addToBackStack():
this.supportFragmentManager?.beginTransaction()?.replace(resId, newFragment)?.addToBackStack(null)?.commit()
然后,您必须手动控制当用户按下后退键时应显示哪个片段...类似于:
private var int : mCurrentFragment = 1
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_home -> {
mCurrentFragment = 1
...
}
R.id.navigation_dashboard -> {
mCurrentFragment = 2
...
}
R.id.navigation_notifications -> {
mCurrentFragment = 3
...
}
}
false
}
override fun onBackPressed() {
if(mCurrentFragment != 1) {
replaceFragment(R.id.container_main_layout, Fragment1())
} else {
super.onBackPressed()
}
}