【问题标题】:Fatal Exception: java.lang.IllegalStateException: Failure saving state: active fragment was removed from the FragmentManager致命异常:java.lang.IllegalStateException:失败保存状态:活动片段已从 FragmentManager 中删除
【发布时间】:2018-11-13 15:16:49
【问题描述】:

我最近将我的应用更改为面向 API 级别 28,并且还开始使用 androidx 而不是支持库。更改后,我注意到具有以下回溯的崩溃

Fatal Exception: java.lang.IllegalStateException: Failure saving state: active MyFragment{22caf6fc (04a7bbf5-8806-4a45-a25d-616ed244bf18) id=0x7f1000ff} was removed from the FragmentManager
       at androidx.fragment.app.FragmentManagerImpl.saveAllState(FragmentManagerImpl.java:2301)
       at androidx.fragment.app.FragmentController.saveAllState(FragmentController.java:150)
       at androidx.fragment.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:496)
       at androidx.appcompat.app.AppCompatActivity.onSaveInstanceState(AppCompatActivity.java:510)
       at com.company.utils.MyAppCompatActivity.onSaveInstanceState(MyAppCompatActivity.java:161)
       at android.app.Activity.performSaveInstanceState(Activity.java:1311)
       at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1288)
       at android.app.ActivityThread.callCallActivityOnSaveInstanceState(ActivityThread.java:4166)
       at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3577)
       at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3633)
       at android.app.ActivityThread.access$1300(ActivityThread.java:164)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1491)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:160)
       at android.app.ActivityThread.main(ActivityThread.java:5541)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)

我的所有活动都是从基本活动MyAppCompatActivity 扩展而来的,该活动从AppCompatActivity 扩展而来。在MyAppCompatActivityonSaveInstanceState 方法中,我有几行日志。我在这个活动中使用FragmentStatePageAdapter 在 ViewPager 下实现了三个片段,并且活动本身没有覆盖onSaveInstanceState 方法。

我浏览了一些与此相关的 SO 帖子,例如 this onethis one,但是当我们使用 FragmentManager 的方法自己管理片段而不是使用ViewPagerAdapter 处理它。我没有那样做,而与通常流程最接近的事情是覆盖FragmentStatePageAdapter 的方法instantiateItemdestroyItem,以帮助我有一种方法可以在代码中获取片段的引用在this SO answer 中给出。

【问题讨论】:

  • 尝试使用commitAllowingStateLoss() 方法而不是普通的commit() 添加片段。
  • 我没有在我的代码中使用commit() 方法,因为它由FragmentStatePageAdapter 本身处理,我链接到我的ViewPager

标签: android android-fragments androidx


【解决方案1】:

您使用的是哪个 Fragment 库版本?有an issue with 1.1.0-alpha01

【讨论】:

  • 是的,我们使用的是androidx.core:core:1.1.0-alpha01。有什么解决方法吗?我想不出以后的版本!
  • 谢谢!正如问题跟踪器中所指定的,我已将片段依赖版本设置为 1.0.0,错误似乎已解决。我已经接受了答案。
  • 请注意,问题跟踪器已更新为声明 alpha02 修复了此问题。升级到 androidx.fragment:fragment:1.1.0-alpha02 应该可以解决这个问题。
  • ^ 我收回这句话。我尝试了 alpha02,但它仍然对我崩溃。
  • 更新到 'androidx.fragment:fragment:1.1.0-alpha03' 后不会发生崩溃
【解决方案2】:

我正在使用最新的gradle如下

实现'androidx.core:core:1.1.0-alpha03'

我将崩溃片段与其他片段代码进行了比较,发现不同之处如下: 崩溃片段在 onCreateView() 中有方法 setRetainInstance(true); 如下 sn-p 所示。

     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       setRetainInstance(true);
}

我遇到了不使用 setRetainInstance 的链接:setRetainInstance - This can only be used with fragments not in the back stack

我删除了 setRetainInstance(true) 以使 Fragmnet 崩溃;它现在正在工作。

如何复制此问题: MainActivity --> HomeFragment --> FirstFragment(崩溃片段) --> HomeFragment

MainActivity 加载 HomeFragment,它被 FirstFragment 替换,然后返回 HomeFragment。 然后将我的应用程序移至后台并发生崩溃,但出现以下异常。

 java.lang.IllegalStateException: Failure saving state: active 
FirstFragment{fd50037 (4a8b618e-a0a8-45d0-aa37-ba08393b8f68)
 id=0x7f08009c} was removed from the FragmentManager

【讨论】:

  • 我在使用 Android Studio 迁移到 ActiveX 后遇到了同样的问题
【解决方案3】:

在 build.gradle 应用中添加依赖

implementation 'androidx.preference:preference:1.1.0-alpha05'

它对我有用,谢谢

参考这个 - https://issuetracker.google.com/issues/119256498

我的问题是在运行时我在相机打开那几秒钟后授予相机和存储权限我的应用程序崩溃了。我用这个我的问题解决了

【讨论】:

    【解决方案4】:

    我没有任何 setRetainInstance(true); 当我浏览我的代码时,我看到我正在使用 onResume 中的片段管理器为同一个片段执行另一个事务。

    【讨论】:

      【解决方案5】:

      这个问题有时是由双击完成当前活动的按钮引起的。

      添加:

      button.setEnable="false";
      

      对于您视图中的所有按钮 ;)

      享受

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多