致命异常:java.lang.IllegalStateException:保存失败状态:活动片段已从FragmentManager中删除

时间:2018-11-13 15:16:50

标签: android android-fragments androidx

我最近将应用更改为目标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扩展了。在onSaveInstanceState的{​​{1}}方法中,我那里有一些日志行。我在使用MyAppCompatActivity的ViewPager下实现的此活动中有三个片段,该活动本身未覆盖FragmentStatePageAdapter方法。

我经历了一些与此类似的SO帖子,例如this onethis one,但是当我们使用onSaveInstanceState的方法来管理分割自己而不是使用ViewPagerAdapter对其进行处理。我没有这样做,而我正在做的与通常的流程最不相关的事情是覆盖FragmentManager的方法FragmentStatePageAdapterinstantiateItem,以帮助我找到一种方法来获取this SO answer中给出的代码中片段的引用。

5 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:2)

我正在使用以下最新的gradle

  

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

我将崩溃的片段与其他片段代码进行了比较,发现差异如下: 崩溃的片段在onCreateView()中具有方法 setRetainInstance(true); ,如下面的代码片段所示。

     @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

答案 2 :(得分:1)

在build.gradle应用程序中添加依赖项

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

它将对我有用,谢谢

请参阅-https://issuetracker.google.com/issues/119256498

我的问题正在运行,我在打开相机后几秒钟就崩溃了,我正在授予相机和存储权限。我用这个解决了我的问题

答案 3 :(得分:0)

我没有任何setRetainInstance(true); 当我浏览代码时,我看到有另一笔交易,我正在onResume中使用片段管理器来处理同一片段。

答案 4 :(得分:0)

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

添加:

button.setEnable="false";

查看视图中的所有按钮;)

享受