【发布时间】:2018-08-03 02:31:53
【问题描述】:
我有一个片段堆栈,我在其中一起使用替换和添加。添加或替换我的片段的代码(在我的活动中)如下
private fun addFragment(fragment: Fragment, name: String) {
supportFragmentManager.beginTransaction().add(R.id.container, fragment)
.addToBackStack(name).commit()
}
private fun replaceFragment(fragment: Fragment, name: String) {
supportFragmentManager.beginTransaction().replace(R.id.container, fragment)
.addToBackStack(name).commit()
}
在我的片段中,我确实有一个带有主菜单后退图标的工具栏。单击后,它应该有助于将我的片段弹出到上一个堆栈。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
toolbar_actionbar.setNavigationIcon(R.drawable.ic_arrow_back_black_24dp)
setHasOptionsMenu(true)
(activity as AppCompatActivity).setSupportActionBar(toolbar_actionbar)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return if (item.itemId == android.R.id.home) {
activity?.onBackPressed()
true
} else {
super.onOptionsItemSelected(item)
}
}
为了清楚起见,我显示活动 onBackPressed 编码如下
override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount > 0) {
supportFragmentManager.popBackStackImmediate()
} else {
super.onBackPressed()
}
}
现在如果我添加fragment1,添加fragment2,添加fragment3,添加fragment4,然后按返回,返回,返回,返回......一切正常。
同样,如果我用fragment1替换,用fragment2替换,用fragment3替换,用fragment4替换,然后返回,返回,返回,返回,一切正常。
但是,如果我这样做了,请用片段 1 替换,添加片段 2,然后用片段 3 替换,然后按返回、返回、返回...。第三次按返回不再起作用。为什么??
为了更好地说明这一点,我将代码放在 github 中,如下所示 https://github.com/elye/issue_android_fragment_replace_add_replace
并录制成下面的gif(63秒gif)显示,4个添加作品,4个替换作品,但是替换和添加的混合,会导致工具栏后退按钮在几次返回后不起作用。
注意添加片段显示重叠数,因为背景是透明的。这样做是为了轻松区分添加与替换。
我怀疑这是一个谷歌错误,但如果我错过任何重要的事情,应该分享一下。
【问题讨论】:
-
在issuetracker.google.com/issues/73793626向谷歌报告了这个问题
-
可以在medium.com/@elye.project/…找到更清晰的问题说明