【问题标题】:fragment.commit() gives illegalStateException, cannot perform after onSaveInstanceStatefragment.commit() 给出了非法状态异常,在 onSaveInstanceState 之后无法执行
【发布时间】:2016-07-21 21:01:23
【问题描述】:

我有 2 个活动,A 和 B。活动 A 由一个片段组成。对于通知点击,我使用 TaskStackBuilder,调用 nextIntent 作为 B,它的 parentActivity 作为 A。对于 nextIntent,我设置 Intent.FLAG_ACTIVITY_NEW_TASK 标志。

场景是,B 活动在前台,通知到达并且您单击它,活动 A 被销毁,活动 B 从 onCreate 加载。如果我返回,Activity A 的 onCreate 会被加载,但是对于片段提交调用,我会遇到以下崩溃。

致命异常:java.lang.IllegalStateException:无法执行此操作 onSaveInstanceState 之后的操作 在 android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1493) 在 android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511) 在 android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638) 在 android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:617)

这是我提交片段的方式

  EgFragment fragment = new EgFragment();  
  getSupportFragmentManager().beginTransaction().add(R.id.view, fragment).commit();

任何帮助克服这种情况.....

【问题讨论】:

  • 请显示代码。你的意思是FragmentTransaction.commit 而不是fragment.commit? :)
  • 我已经用提交代码编辑了问题
  • 尝试提交允许状态丢失的片段事务
  • @Eenvincible :它给出了另一个崩溃,说当活动被破坏时无法提交片段。
  • 等等,你能不说FLAG_ACTIVITY_NEW_TASK就开始活动吗?

标签: android android-fragments


【解决方案1】:

我发现了问题。在 FragmentManager 中,有两个布尔值,mStateSaved 和 mDestroyed。在 onStop 中,mSavedState 将设置为 true。在 OnDestroy 中,mDestroyed 会设置为 true,但 mStateSaved 不会设置为 false。

现在,当从 Activity A 启动 Activity B 时,A 的 onStop 将 mStateSaved 设置为 true。在 B 中,当使用 FLAG_ACTIVITY_NEW_TASK 发生通知单击时。两个活动 onDestroy 都会被调用。现在,onCreate 被调用,这使得 mStateSaved 为假,但在此之后,如果我们使用 getSupportFragmentManager 并提交片段,mStateSaved 将为真。

我认为 getSupportFragmentManager() 正在返回 mStateSaved 为 true 的前一个实例的管理器。

现在我不知道如何解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多