TeamAmaze / AmazeFileManager

Material design file manager for Android
https://teamamaze.xyz
GNU General Public License v3.0
5.3k stars 1.57k forks source link

Fragment MainFragment{fb222c4} is not currently in the FragmentManager on install #1555

Open EmmanuelMess opened 5 years ago

EmmanuelMess commented 5 years ago
12-28 14:22:12.244 com.amaze.filemanager.debug E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.amaze.filemanager.debug, PID: 17898
    java.lang.IllegalStateException: Fragment MainFragment{fb222c4} is not currently in the FragmentManager
        at android.support.v4.app.FragmentManagerImpl.putFragment(FragmentManager.java:923)
        at com.amaze.filemanager.fragments.TabFragment.onSaveInstanceState(TabFragment.java:269)
        at android.support.v4.app.Fragment.performSaveInstanceState(Fragment.java:2626)
        at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:2910)
        at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:2971)
        at android.support.v4.app.FragmentController.saveAllState(FragmentController.java:134)
        at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:591)
        at android.support.v7.app.AppCompatActivity.onSaveInstanceState(AppCompatActivity.java:510)
        at com.amaze.filemanager.activities.MainActivity.onSaveInstanceState(MainActivity.java:1090)
        at android.app.Activity.performSaveInstanceState(Activity.java:1302)
        at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1312)
        at android.app.ActivityThread.callCallActivityOnSaveInstanceState(ActivityThread.java:4109)
        at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3511)
        at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3571)
        at android.app.ActivityThread.-wrap20(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1378)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5443)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
devmike01 commented 5 years ago

Hi @EmmanuelMess . I investigated the bug and fortunately I was able to find what went wrong. I fixed it by checking if fragmentManager.executePendingTransactions() is true before putting the fragment in the fragment manager... Look for for (Fragment fragment : fragments){...} in your onSaveInstanceState method inside TabFragment. Wrap the statements inside it with if (fragmentManager.executePendingTransactions()){...}. It should now look like this...

if (fragmentManager.executePendingTransactions()) {
    fragmentManager.putFragment(outState, "tab" + i, fragment);
    i++;
}

Hope it help.

VishalNehra commented 3 years ago

Exception

java.lang.IllegalStateException: Fragment MainFragment{bf23580 (fe765438-4b89-4b46-a91b-eb96bf0aad7e)} is not currently in the FragmentManager at androidx.fragment.app.FragmentManagerImpl.putFragment(FragmentManagerImpl.java:350) at com.amaze.filemanager.ui.fragments.TabFragment.onSaveInstanceState(TabFragment.java:226) at androidx.fragment.app.Fragment.performSaveInstanceState(Fragment.java:2766) at androidx.fragment.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManagerImpl.java:2289) at androidx.fragment.app.FragmentManagerImpl.saveAllState(FragmentManagerImpl.java:2348) at androidx.fragment.app.FragmentController.saveAllState(FragmentController.java:151) at androidx.fragment.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:513) at androidx.appcompat.app.AppCompatActivity.onSaveInstanceState(AppCompatActivity.java:533) at com.amaze.filemanager.ui.activities.MainActivity.onSaveInstanceState(MainActivity.java:1150) at android.app.Activity.performSaveInstanceState(Activity.java:1549) at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1444) at android.app.ActivityThread.callActivityOnSaveInstanceState(ActivityThread.java:4836) at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:4184) at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:4148) at android.app.ActivityThread.handleStopActivity(ActivityThread.java:4223) at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:41) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1823) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:198) at android.app.ActivityThread.main(ActivityThread.java:6729) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)


VishalNehra commented 3 years ago

Keeping this issue open and moving to 3.7 as the fix was just a band-aid. Ideally we should not be saving the whole fragment to instance state, and use viewmodel for TabFragment. This can easily cause OutOfMemoryException as we experienced in past with MainFragment.

EmmanuelMess commented 2 years ago

Any news on this issue?