web-dev-qa-db-fra.com

Exception fatale: Java.lang.IllegalStateException: État d'enregistrement d'échec: le fragment actif a été supprimé du gestionnaire FragmentManager.

J'ai récemment modifié mon application pour cibler l'API niveau 28 et j'ai également commencé à utiliser androidx plutôt que des bibliothèques de support. Après le changement, je remarque un crash qui a le suivi suivant

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)

Toutes mes activités s'étendent d'une activité de base MyAppCompatActivity qui s'étend de AppCompatActivity. Et dans la méthode onSaveInstanceState de MyAppCompatActivity, il existe quelques lignes de journal. J'ai trois fragments de cette activité implémentés sous ViewPager avec FragmentStatePageAdapter et l'activité elle-même n'est pas en train de surcharger la méthode onSaveInstanceState

J'ai parcouru quelques SO messages proches de celui-ci, tels que celui-ci et celui-ci , mais il semble que cela se produise lorsque nous utilisons les méthodes de FragmentManager pour gérer les fragments nous-mêmes. que d'utiliser un ViewPagerAdapter le gérer. Je ne fais pas cela et la chose la plus proche que je fais du flux habituel est de remplacer les méthodes de FragmentStatePageAdapter par instantiateItem et destroyItem pour m'aider à avoir une méthode pour obtenir la référence d'un fragment dans le code, comme indiqué dans this SO répondez

8

Quelle version de la bibliothèque de fragments avez-vous utilisée? Il y a un problème avec 1.1.0-alpha01 .

13
Yu-Hsuan

J'utilise le dernier grade ci-dessous

implémentation 'androidx.core: core: 1.1.0-alpha03'

J'ai comparé fragment crashing avec un autre code de fragment et trouvé la différence comme suit: Le fragment crashant a la méthode setRetainInstance (true); dans onCreateView () comme indiqué dans l'extrait ci-dessous.

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

Je tombe sur le lien qui dit de ne pas utiliser setRetainInstance: setRetainInstance - Cela ne peut être utilisé qu'avec des fragments ne se trouvant pas dans la pile arrière

J'ai supprimé le setRetainInstance (true) pour le crash de fragmnet; Ça marche maintenant. 

Comment reproduire ce problème: MainActivity -> HomeFragment -> FirstFragment (fragment crash) -> HomeFragment 

MainActivity est chargé avec HomeFragment qui a été remplacé par FirstFragment, puis est retourné sur HomeFragment . Le déplacement de mon application en arrière-plan entraîne un blocage, avec l'exception ci-dessous.

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