android - FragmentTransaction 隐藏/显示有时不起作用

标签 android android-fragments kotlin fragmentmanager

我有一个带有底部导航选项卡的 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/

相关文章:

java - 使用 Azure 媒体服务获取访问 token 时遇到问题

android - 制作静态背景图片

java - 如何在此代码中实现 OnItemClickListener?

java - 为什么我不能在 Android 上实例化这个 Fragment?

kotlin - 是否有一种 kotlin 惯用方法来检查序列是否至少有 N 个元素?

android - RoomProcessor 编译或循环依赖

java - 调用 super 抛出 "super is not an expression"

android - 从后台返回应用程序时,保存在单例中的静态数据有时为空

java - 动态设置选项卡日期

java - 使用 azure.keyvault.secret.property-sources 时 Spring Boot 应用程序启动失败并丢失日志