'L'exception IllegalStateException: l'Activité a été détruit "quand" getSupportFragmentManager()' appelé après le redémarrage de l'Activité
J'ai un parent Fragment de l'Activité qui a un ViewPager qui contient un enfant ViewPager. L'enfant ViewPager contient des Fragments de chaque page. Je communique entre l'enfant ces fragments de page et le haut parent Fragment de l'Activité à l'aide d'une interface de rappel par exemple
public interface Callbacks {
public void onItemSelected(Link link);
}
Dans le parent Fragment d'Activité j'écoute pour onItemSelected
événements par exemple
@Override
public void onItemSelected(Link link) {
Bundle argumentsFront = new Bundle();
argumentsFront.putParcelable(FragmentComments.ARG_ITEM_ID, link);
fragmentComments = new FragmentComments();
fragmentComments.setArguments(argumentsFront);
getSupportFragmentManager().beginTransaction().replace(R.id.post_container, fragmentComments).commitAllowingStateLoss();
}
Maintenant cela fonctionne bien lorsque l'application est lancé pour la première fois.
Si vous tournez l'appareil pour changer l'orientation de l'Activité redémarre. Tous les fragments de réinitialiser eux-mêmes, comme je l'ai utiliser setRetainInstance(true);
(je n'appelle pas setRetainInstance(true) dans la page des Fragments de l'enfant ViewPager comme il n'est pas pris en charge). Cependant, si je clique sur un élément de liste dans le Fragment de l'enfant ViewPager-je obtenir cette exception:
FATAL EXCEPTION: main
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
Personne ne sait pourquoi cela se produit?
Grâce
OriginalL'auteur Milo | 2013-02-10
Vous devez vous connecter pour publier un commentaire.
Lorsque vous faites pivoter l'appareil, Android enregistre, détruit et recrée votre
Activity
et sesViewPager
deFragments
. Depuis leViewPager
utilise leFragmentManager
de votreActivity
, il enregistre et réutilise ceuxFragments
pour vous (et ne pas en créer de nouveaux), de sorte qu'ils contiennent les anciennes références à votre (aujourd'hui détruit) d'origineActivity
, et vous obtenez ceIllegalStateException
.De votre enfant
Fragments
, essayez quelque chose comme ceci:Puis, quand un effet de sélection:
Depuis
onAttach
est appelée, dans le cadre de laFragment
du cycle de vie, votreFragments
sera mise à jour de leur rappel de référence sur la rotation.onAttach
méthode ressemble déjà à celui que vous avez fournis. Sur le changement d'orientation de mononAttach
méthode n'est pas appelée de nouveau et comme un résultat de mon rappel n'est pas mis à jour. Le parent Fragment asetRetainInstance(true)
, je suppose que cela empêche cet enfant Fragment de s'en détacher?Hmm, selon la documentation
onAttach
doit encore être appelé même sisetRetainInstance(true)
est réglé, si quelque chose peut mal se passer ici. Pourriez-vous poster plus de votre code autour de réglage et d'appeler votre rappel? Aussi, découvrez la réponse à cette question, à l'aide desetRetainInstance(true)
n'est pas une bonne pratique dans cette situation, vous devriez être à la sauvegarde et la restauration de l'état - stackoverflow.com/questions/11182180/...J'ai trouvé une solution. Parce que j'ai eu imbriquée Fragments comme ceci: (FragmentActivity -> Fragment 1 -> Fragment 2 (avec ViewPager) -> ViewPager Enfant Fragments), j'ai dû déplacer les rappels pour le Fragment 1 (où onAttach et onDetach étaient appelés). J'ai ensuite fait un appel statique de la
onItemSelected
méthode dans le ViewPager de l'enfant, de Fragments de rappel dans le parent de Fragment (Fragment 1). Cela semble un peu un hack, mais fonctionne bien. J'utilisesetRetainInstance(true)
dans le Fragment 1 de sorte que l'enfant Fragments conservent l'état.Ahh je vois votre architecture est un peu plus complexe. J'ai fait quelque chose de similaire avant, où un
Fragment
appelle de nouveau à son parentFragment
. J'ai utilisé le même code que ci-dessus dans onAttach, mais au lieu de la coulée de la mèreActivity
de mon rappel, j'ai coulégetParentFragment()
pour obtenir une ref pour le parentFragment
qui a mis en œuvre la fonction de rappel. Cela pourrait peut-être aider à faire une solution plus propre, mais heureux que vous avez trouvé l'une ou l'autre manière.Merci beaucoup les gars. J'ai d'abord été confondu pourquoi cela a été la réponse, mais comment 3 et 4 m'a beaucoup aidé. C'est ce que j'avais: Parentfragment -> viewpager avec des fragments - > enfant fragment. J'ai mis un écouteur dans viewpager fragments de ParentFragment, à l'aide de getParentFragment dans onAttach, puis un second auditeur à passer que les données sur dans parentfragment à fragmentactivity. Je pense que c'est ce que Steven voulait dire. Maintenant, je peux obtenir tout ce à attacher correctement:)
OriginalL'auteur Steven Byle
J'ai eu un problème similaire, je pense que c'est parce que les fragments sont conservés et garder une référence à un destoryed activité, ma solution a été de conserver une référence au fragment dans l'activité de l'e.g Fragment myfragment = null. Et puis utiliser le code suivant dans MyFragment:
OriginalL'auteur user993553
Eu un problème similaire. En gros, si le ViewPager a juste quelques fragments, puis enregistrer les références dans l'activité en cours. NE PAS appeler pagerAdapter de getItem() car elle crée un nouveau fragment et il n'est attaché à aucune activité et c'est pourquoi nous voyons "l'Activité a été détruit" l'exception". Si vous ne voulez pas garder fragment de références, vous pouvez utiliser findViewWithTag() la méthode pour obtenir le Fragment d'objet.
OriginalL'auteur andude
De validation des transactions dans OnPostResume rappel résolu le problème pour moi. Grâce à notre blog
http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html
OriginalL'auteur Varun Bhatia
J'ai eu ce problème avec imbriqué fragments et aucun des stackoverflow solutions a fonctionné pour moi. Seulement il semble qu'il y a un bug avec le soutien de la bibliothèque, quand rejeté fragments encore stocker des pointeurs à l'activité précédente (donc getFragmentManager() renvoie la valeur null, car elle est appelée à déjà détruit de l'activité), c'est pourquoi vous avez besoin pour gérer les pointeurs de vous-même. J'ai fini avec une solution suivants:
1. Dans le premier niveau du fragment j'essayais de sauver pointeur à l'activité dans la méthode
2. Dans l'activité qui s'occupe de fragments ai fini avec ce code:
Vous devez passer parentActivity de PREMIER niveau fragment uniquement lorsque vous appelez DEUXIÈME niveau (nested) des fragments, comme il semble que ce bug est seulement avec imbriquées les unes après vous apportez votre application de premier plan.
OriginalL'auteur Bio-Matic