14

I recently changed my app to target API Level 28 and also started using androidx instead of support libraries. After the change, I'm noticing a crash that has the following traceback

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)

All my activities are extending from a base activity MyAppCompatActivity which extends from AppCompatActivity. And in the onSaveInstanceState method of MyAppCompatActivity, I have a few log lines there. I have three fragments in this activity implemented under a ViewPager with FragmentStatePageAdapter and the activity itself is not overriding onSaveInstanceState method.

I went through a few SO posts close to this such as this one and this one, but it looks as if it's happening when we're using FragmentManager's methods to manage the fragments ourselves rather than using a ViewPagerAdapter handle it. I'm not doing that and the closest thing that I'm doing away from the usual flow is overriding FragmentStatePageAdapter's methods instantiateItem and destroyItem to help me have a method to get a fragment's reference in the code as given in this SO answer.

halfer
  • 19,824
  • 17
  • 99
  • 186
Arun Kumar Nagarajan
  • 2,347
  • 3
  • 17
  • 28
  • Try adding the fragments using the `commitAllowingStateLoss()` method instead on the normal `commit()`. – HedeH Nov 13 '18 at 15:19
  • I'm not using the `commit()` method in my code since it is handled by the `FragmentStatePageAdapter` itself, which, I link to my `ViewPager` – Arun Kumar Nagarajan Nov 13 '18 at 15:23

5 Answers5

15

Which Fragment library version did you use? There is an issue with 1.1.0-alpha01.

halfer
  • 19,824
  • 17
  • 99
  • 186
Yu-Hsuan
  • 505
  • 4
  • 9
5

I am using the latest gradle as below

implementation 'androidx.core:core:1.1.0-alpha03'

I have compared crashing fragment with other fragment code and found the difference as below: Crashing fragment has method setRetainInstance(true); inside onCreateView() as shown in below snippet.

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

I come across the link which says not to use setRetainInstance : setRetainInstance - This can only be used with fragments not in the back stack

I removed the setRetainInstance(true) for crashing fragmnet; It's working now.

How to replicate this issue: MainActivity --> HomeFragment --> FirstFragment(crashing fragment) --> HomeFragment

MainActivity loads with HomeFragment which replaced by FirstFragment and then going back to HomeFragment. Then moving my app to background and crash happens with below exception.

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

Add a dependency in build.gradle app

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

it will works for me, thanks to

Refer this - https://issuetracker.google.com/issues/119256498

my issues are in run time I'm giving permission to camera and storage after that seconds the camera is open my app is crashed. I use this my issue is solved

Ramprasath Selvam
  • 3,868
  • 3
  • 25
  • 41
sara vss
  • 29
  • 5
0

I didn't have any setRetainInstance(true); When i was going through my code i saw there was another transaction which i was doing using fragment manager in onResume for the same fragment .

Antroid
  • 391
  • 4
  • 15
0

This issue is sometime caused by a double click on a button which finishes the current activity.

add :

button.setEnable="false";

for all buttons in your view ;)

enjoy

Arnaud
  • 408
  • 4
  • 11