android 导航 popBackStack 行为
android navigation popBackStack behaviour
我在下面添加了随机片段(First、SecondFragment 或 ThirdFragment)的代码
private fun addFragment() {
activeFragment = if (activeFragment is FirstFragment) {
SecondFragment()
} else if (activeFragment is SecondFragment) {
ThirdFragment()
} else {
FirstFragment()
}
fragmentTransaction = fragmentManager!!.beginTransaction()
fragmentTransaction?.add(R.id.fragment_container, activeFragment!!)
?.addToBackStack(null)
?.commit()
}
override fun onBackPressed() {
val fragment = fragmentManager?.findFragmentById(R.id.fragment_container)
if (fragment != null) {
Log.d("mytag", "onBackPressed: $fragment")
fragmentManager?.popBackStack()
return
}
super.onBackPressed()
}
在上面的代码中一切正常。我的意思是,当我按下后退按钮时,它会弹出最后一个片段并显示上一个片段(如果有的话)。
但是如果我在 if check 中删除 return statement
(在 onBackPressed function
中),那么它会立即从返回堆栈中弹出 2 个片段。(我添加了 onBackStackChangedListener
,我可以看到如何当我弹出时留下了很多项目,所以如果有 3 个片段我在弹出时返回堆栈它会删除 2 个片段并且只剩下 1 个,然后如果我再次单击返回,它会删除最后一个片段并破坏应用程序)
您看到此行为的原因是当您使用 addToBackStack()
作为 super.onBackPressed()
调用的一部分时,片段 已经 处理系统后退按钮.
这意味着您在使用片段时根本不需要覆盖 onBackPressed()
。
我在下面添加了随机片段(First、SecondFragment 或 ThirdFragment)的代码
private fun addFragment() {
activeFragment = if (activeFragment is FirstFragment) {
SecondFragment()
} else if (activeFragment is SecondFragment) {
ThirdFragment()
} else {
FirstFragment()
}
fragmentTransaction = fragmentManager!!.beginTransaction()
fragmentTransaction?.add(R.id.fragment_container, activeFragment!!)
?.addToBackStack(null)
?.commit()
}
override fun onBackPressed() {
val fragment = fragmentManager?.findFragmentById(R.id.fragment_container)
if (fragment != null) {
Log.d("mytag", "onBackPressed: $fragment")
fragmentManager?.popBackStack()
return
}
super.onBackPressed()
}
在上面的代码中一切正常。我的意思是,当我按下后退按钮时,它会弹出最后一个片段并显示上一个片段(如果有的话)。
但是如果我在 if check 中删除 return statement
(在 onBackPressed function
中),那么它会立即从返回堆栈中弹出 2 个片段。(我添加了 onBackStackChangedListener
,我可以看到如何当我弹出时留下了很多项目,所以如果有 3 个片段我在弹出时返回堆栈它会删除 2 个片段并且只剩下 1 个,然后如果我再次单击返回,它会删除最后一个片段并破坏应用程序)
您看到此行为的原因是当您使用 addToBackStack()
作为 super.onBackPressed()
调用的一部分时,片段 已经 处理系统后退按钮.
这意味着您在使用片段时根本不需要覆盖 onBackPressed()
。