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 .
Quelle version de la bibliothèque de fragments avez-vous utilisée? Il y a un problème avec 1.1.0-alpha01 .
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