J'ai un problème avec une application Android compilée et fonctionnant avec la cible SDK 4.3. L'application dispose de deux activités, une mainActivité qui est également l'activité de lanceur et une secondeactivité. Les deux utilisent des fragments. Pour soutenir également les appareils plus anciens, le support LIB est utilisé.
Dans le scénario suivant, il s'agit de l'erreur "IllegalStateTeException: fragment déjà ajouté". P>
1) Démarrer l'application -> La mainActivity est montré
2) Passez à la deuxièmeactivité avec une intention
3) Appuyez sur le bouton Accueil
4) Attendez une fois plus longtemps (testé avec 24 heures) de
5) Appuyez à nouveau sur l'icône de l'application -> Exception. Si le temps est plus court, la secondactivité est montrée comme prévu. P>
J'ai lu beaucoup d'idées illegalStateExceptions lors de la manipulation des fragments, mais toutes toutes ont souligné un problème avec une méthode Remplacer (). Dans la StackTrace, mon propre code n'est jamais appelé. P>
Le franc est ajouté dans la méthode Activé Oncree (): P>
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(..); ListFragment listFragment = this.getCaptureListFragment(); FragmentTransaction tx = this.getSupportFragmentManager().beginTransaction(); tx.add(R.id.MainFragmentContainer, listFragment, "list_fragment_tag"); tx.commit(); } private ListFragment getListFragment() { ListFragment listFragment = (ListFragment) this.getSupportFragmentManager().findFragmentByTag("list_fragment_tag"); if (listFragment == null) { listFragment = new ListFragment(); } return listFragment; } java.lang.RuntimeException: Unable to start activity ComponentInfo{de.myexample.demo/de.myexample.demo.ui.SecondActivity}: java.lang.IllegalStateException: Fragment already added: ListFragment{42283f58 #0 id=0x7f060094 de.myexample.demo.ui.ListFragment} at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) at android.app.ActivityThread.access$600(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalStateException: Fragment already added: ListFragment{42283f58 #0 id=0x7f060094 de.myexample.demo.ui.ListFragment} at android.support.v4.app.FragmentManagerImpl.addFragment(SourceFile:1175) at android.support.v4.app.BackStackRecord.run(SourceFile:616) at android.support.v4.app.FragmentManagerImpl.execPendingActions(SourceFile:1460) at android.support.v4.app.FragmentActivity.onStart(SourceFile:556) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171) at android.app.Activity.performStart(Activity.java:5143) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) ... 11 more java.lang.IllegalStateException: Fragment already added: ListFragment{42283f58 #0 id=0x7f060094 de.myexample.demo.ui.ListFragment} at android.support.v4.app.FragmentManagerImpl.addFragment(SourceFile:1175) at android.support.v4.app.BackStackRecord.run(SourceFile:616) at android.support.v4.app.FragmentManagerImpl.execPendingActions(SourceFile:1460) at android.support.v4.app.FragmentActivity.onStart(SourceFile:556) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171) at android.app.Activity.performStart(Activity.java:5143) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) at android.app.ActivityThread.access$600(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5103) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method)
4 Réponses :
D'accord, résolu par moi-même.
Je mettais tous les fragments dans Onpaause () et stockez l'état dans certains booléens. Selon les booléens, les fragments sont placés à OnResume (). Que le lancement est stable quelle que soit la durée de l'activité à l'arrière-plan. p> peut-être que cela aide quelqu'un avec le même problème p> p>
Le gestionnaire de fragments enregistre son état lors de la sortie. Donc, vous n'avez pas besoin d'ajouter votre fragment à nouveau.
Faites comme ceci: P>
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(..); if (savedInstanceState == null) { ListFragment listFragment = this.getCaptureListFragment(); FragmentTransaction tx = this.getSupportFragmentManager().beginTransaction(); tx.add(R.id.MainFragmentContainer, listFragment, "list_fragment_tag"); tx.commit(); } }
Merci d'avoir répondu. Cela a aidé, mais pas pleinement. Sur Android 4.1 Cela fait l'affaire. Mais sur un périphérique 4.4 Kitkat, l'activité est vide et aucun fragment n'est vu. Mais on dirait que cette façon est bien meilleure que la suppression manuelle. Peut-être que je peux retirer le fragment à la main sur des périphériques plus récents à l'intérieur de la si ... Je dois faire plus de tests. Mais ils prennent beaucoup de temps, car je dois attendre au moins 24 heures avant la question des problèmes
Pour reproduire cela, on pourrait activer "Ne pas garder les activités" dans les paramètres -> Options de développeur. Puis mettre en pause et reprendre l'activité. P>
C'est ainsi que vous n'avez pas à attendre 24 heures :) p>
Il n'est pas nécessaire de créer un nouveau champ booléen pour vérifier l'état d'ajout de fragment. Il y a aussi une méthode en fragment.
juste l'utiliser:
myfragment.Anadded () code> strong> p>
Le booléen n'est pas pour stocker l'état du fragment est ajouté. Il est utilisé pour stocker l'état avant (voir ma méthode onpaause ()). Je pense que vous n'avez pas compris le problème.
Où est SetContentView de l'activité?
essayez d'utiliser tx.replace (r.id.mainfragmentContainer, listfragment); Au lieu d'utiliser la méthode TX.Ajoute () .Read Ce . Pour plus de fragments
Merci@raghunandan. J'ai ajouté la ligne manquante dans le poteau.
@karannagpal: Merci pour le lien, mais j'ai déjà lu ce manuel. Bien sûr, je dois faire quelque chose de mal, mais je ne suis pas sûr de quoi. Je vais essayer la méthode de remplacement à coup sûr. Mais je veux comprendre pourquoi cela ne concerne que cette erreur que si l'application était très longue en arrière-plan. Je sais que Android va nettoyer les choses entre-temps, mais la récréation de l'activité semble être différente de celle du cycle de vie normal. C'est le point intéressant pour moi
@karannagpal Remplacer n'a pas fonctionné à coup sûr. Mon propre code n'est pas appelé dans ce cas. Peu importe la manière dont le fragment a été ajouté avant que l'application soit allée en arrière-plan