【问题标题】:IllegalStateException Fragment already added已添加 IllegalStateException 片段
【发布时间】:2020-09-29 09:05:41
【问题描述】:

我在 firebase Crashlytics 上遇到了一个非致命异常:

Non-fatal Exception: java.lang.IllegalStateException
Fragment already added

这是我的相关代码:

 var isFragmentAdded = false
        for (supportFragment in supportFragmentManager.fragments) {
            if (supportFragment::class == fragment::class) isFragmentAdded = true
        }
        if (isFragmentAdded || fragment.isAdded) {
            transaction.show(fragment)
        } else {
            transaction.add(R.id.contentFragment, fragment)
        }
        transaction.commitAllowingStateLoss()

如您所见,我在添加片段之前检查是否通过两种方式添加了片段。为什么会出现这个问题? (我无法在我的设备或模拟器上重现它)

【问题讨论】:

  • 可能是这个stackoverflow thread 会帮助你

标签: android android-fragments


【解决方案1】:

没错,我们的 crashlytics 日志中也有同样的异常。解决它的方法很少。

1.

所以在大多数情况下是因为commitAllowingStateLoss()。正如文档所说,这不仅是因为在您的交易过程中“保存了状态”。它将使用以前的状态重新创建Fragment,根据我们的经验,它与流或Fragment 事务直接相关。

首先。删除它的使用,并修复您的事务状态设置。您不想在片段可能位于堆栈中并且想要重用它的地方使用commitAllowingStateLoss()。 (就像上面的 sn-p 一样)。

2.

我很确定您的问题是由上述第 1 点引起的。但是还有另一个原因,在 cmets 中已经提到过。 FragmentTransactions 是异步提交的。因此,您需要致电executePendingTransactions() 了解更多信息,请参阅here

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多