我有一个带有底部导航选项卡的 Activity ,这些选项卡正在更改其中的 fragment 。当我在这些选项卡上来回单击时,有时它会停止工作。当我在其中放入一些日志时,代码执行得很好。但是 fragment 没有被切换。
代码在 kotlin 中,但相当简单
fun showTabFragment(tag: String) {
val currentFragment: Fragment? = supportFragmentManager.fragments?.lastOrNull()
var fragment = supportFragmentManager.findFragmentByTag(tag)
val fragmentExists = fragment != null
if (fragment == null) {
when (tag) {
TAG_LOGBOOK -> fragment = LogbookFragment()
TAG_RECIPES -> fragment = RecipesFragment()
TAG_PROFILE -> fragment = ProfileFragment()
else -> fragment = MeetingPlacesFragment()
}
}
val transaction = supportFragmentManager.beginTransaction()
if (currentFragment != null) {
Log.i("jacek", "hiding " + currentFragment.javaClass.simpleName)
transaction.hide(currentFragment)
}
if (fragmentExists) {
Log.i("jacek", "showing " + fragment.javaClass.simpleName)
transaction.show(fragment)
} else {
Log.i("jacek", "adding " + fragment.javaClass.simpleName)
transaction.add(R.id.container, fragment, tag)
}
transaction.commit()
}
fragment 很重。我会尝试一些轻量级的,但在我看来这仍然不是问题。还有什么我可以尝试的吗?
我正在使用最新的支持库 - 25.2.0 另外我对替换 fragment 不感兴趣,因为重点是添加交叉淡入淡出动画而不重新创建它们
最佳答案
您需要重复使用您想要隐藏或显示的 fragment 的同一实例。
private fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction().apply {
if (fragment.isAdded) {
show(fragment)
} else {
add(R.id.fmFragmentContainer, fragment)
}
supportFragmentManager.fragments.forEach {
if (it != fragment && it.isAdded) {
hide(it)
}
}
}.commit()
}
关于android - FragmentTransaction 隐藏/显示有时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42795611/