2012-12-06 3 views
11

Depuis que j'ai mis à jour mon application pour utiliser support lib rev. 11 et compilé avec SDK 4.2 Je reçois l'erreur suivanteFragment déjà ajouté. Support lib

java.lang.IllegalStateException: Fragment already added: i{4079e598 #2 id=0x1020002 i} 
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1159) 
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:729) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1493) 
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:477) 
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:174) 

J'ai lu sur des problèmes similaires sur stackoverflow. Certains d'entre eux suggèrent d'éviter la méthode de remplacement, que je n'utilise pas. La transaction qui provoque le crash sur rollback ressemble à ceci:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit() 

D'autres commentaires disent cela peut se produire si vous utilisez des transitions fragment qui ne peut pas terminer assez vite avant que l'utilisateur appuie à nouveau. Puisque j'utilise des animations de transition sur les fragments donnés, cela pourrait être la cause. Cependant, la suppression de la transition n'est pas un choix et depuis ce exclusivement se produit sur les téléphones fonctionnant 2.3.x et le bug a été introduit par la mise à niveau vers la lib 11 et sdk 4.2 J'espère que Google va le réparer avec la prochaine version.

Quelqu'un at-il des problèmes similaires, des informations sur si cela est prévu d'être résolu en 4.2.1 ou le support r12, ou des suggestions que je peux faire pour contourner l'erreur?

+0

Obtenir la même chose, mais avec 'DialogFragment'. –

+0

Je reçois également avec DialogFragment de temps en temps ... J'ai déposé un rapport [ici] (http://code.google.com/p/android/issues/detail?id=41552&thanks=41552&ts=1355757013). Mais pas encore de réponse. – phlebas

+0

a la même erreur pour la bibliothèque de support r12. Tracé posté au tracker de problème android aussi. – Sash0k

Répondre

6

Je suis en train de résoudre le problème en utilisant un indice que j'ai trouvé here

J'ajouté executePendingTransactions() à exécuter immédiatement la transaction:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit() 
getFragmentManager().executePendingTransactions(); 

Cela devrait veiller à ce que le backstack est toujours dans un état propre J'espère et n'a pas d'inconvénients négatifs auxquels je peux penser.

Mise à jour Bien qu'il fonctionne sur les téléphones réguliers, la question reste sur certains appareils génériques qui ne disposent pas d'un Android connu numéro de version, comme 4.0.1 ou similaire, mais au lieu de signaler une date comme « Jeu 2 mars 2006 00:00:00 GMT + 0100 (MEZ) 'comme numéro de version Android, par exemple: samsung - espressowifixx - GT-P3110 signale la date donnée comme version android et donne l'exception ajoutée fragment ... Toujours agaçant. Les utilisateurs ne se soucient pas de ce genre de choses, donc c'est toujours le développeur qui est déjà déficitaire qui est blâmé. Pas de problème pour les entreprises de milliards de dollars bien sûr, mais les développeurs simples, faites simplement quelque chose de plus utile que d'écrire des applications;)

+0

Je suis exactement le même accident et je n'utilise pas la ligne ci-dessus du tout. J'ajoute juste ft.add (newFrag) .addToBackStack (null) .commit() comme ceci. – tasomaniac

+0

@phlebas Pouvez-vous me suggérer si je dois éditer la classe FragmentManager.java dans la bibliothèque SUpport – Adi

+0

S'il vous plaît mentionner votre code s'il vous plaît. –

5

Donc pour moi, il s'est avéré que j'essayais d'ajouter un fragment deux fois. Peut-être que dans les versions précédentes de la bibliothèque de support, il a simplement avalé ceci et est passé à autre chose. Malheureusement, même en vérifiant si le fragment isAdded() ne fonctionnait pas pour moi, parce que dans mon cas, je les rappelais avant que la transaction ait eu le temps d'ajouter le premier fragment. Ce que j'ai fini par faire était de créer une variable de classe booléenne fragmentAdded et la définissant à vrai immédiatement après avoir fait la transaction. Ensuite, je vérifie ce booléen avant d'essayer d'ajouter le fragment. Peut-être pas une solution à votre problème, mais pour moi c'était, alors j'espère que ça aide.

+5

vraiment triste que nous devons faire cela. n'y a-t-il vraiment aucune méthode pour dire définitivement si un fragment a été ajouté? –

Questions connexes