我最近将应用更改为目标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 one和this one,但是当我们使用onSaveInstanceState
的方法来管理分割自己而不是使用ViewPagerAdapter对其进行处理。我没有这样做,而我正在做的与通常的流程最不相关的事情是覆盖FragmentManager
的方法FragmentStatePageAdapter
和instantiateItem
,以帮助我找到一种方法来获取this SO answer中给出的代码中片段的引用。
答案 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'
它将对我有用,谢谢
我的问题正在运行,我在打开相机后几秒钟就崩溃了,我正在授予相机和存储权限。我用这个解决了我的问题
答案 3 :(得分:0)
我没有任何setRetainInstance(true); 当我浏览代码时,我看到有另一笔交易,我正在onResume中使用片段管理器来处理同一片段。
答案 4 :(得分:0)
此问题有时是由于双击完成当前活动的按钮引起的。
添加:
button.setEnable="false";
查看视图中的所有按钮;)
享受