首页 > 解决方案 > 为什么commitNow 不将片段设置为null?

问题描述

我试图commitNow用来确保片段事务是同步的。但是,经过我的测试,我发现由于某种原因commitNow并没有立即删除碎片。

我添加了一个 postDelayed 100 毫秒的处理程序,并且片段仍然不为空。之后,我更改postDelayed为 1000 毫秒,最后,片段为空。

如何在我调用后立即确保片段为空commitNow?我试图添加supportFragmentManager.popBackStack(),但没有帮助。

如果无法立即使片段为空,在添加相同片段之前,如何检查该片段是否不再在堆栈中?

更新 我发现如果我删除了setCustomAnimations,那么交易确实会立即发生。我如何观察何时setCustomAnimations完成?

val fragment = supportFragmentManager.findFragmentByTag(DEMO_FRAGMENT)
    if (fragment != null) {
        Log.d("test", "DEMO_FRAGMENT is not null")
        val fragmentTransaction = supportFragmentManager.beginTransaction()
            fragmentTransaction.setCustomAnimations(R.anim.custom_fade_in, R.anim.custom_fade_out)
                    .remove(fragment).commitNow()
            supportFragmentManager.popBackStack();
            Log.d("test", "is fragment null:${supportFragmentManager.findFragmentByTag(DEMO_FRAGMENT) == null}")
            Handler().postDelayed({
                Log.d("test", "is fragment null:${supportFragmentManager.findFragmentByTag(DEMO_FRAGMENT) == null}")
            }, 1000)
        } 
    }

标签: androidandroid-fragmentsfragmenttransaction

解决方案


为此,您必须使用popBackStackImmediate(). 更多信息在这里


推荐阅读