Exception obtenue: fragment déjà actif

J’ai un fragment ;

MyFragment myFrag = new MyFragment(); 

Je mets des données groupées sur ce fragment:

 Bundle bundle = new Bundle(); bundle.putSsortingng("TEST", "test"); myFrag.setArguments(bundle); 

Ensuite, je remplace l’ ancien fragment par celui-ci et je le place en arrière :

 //replace old fragment fragmentTransaction.replace(R.id.fragment_placeholder, myFrag, "MyTag"); //put on backstack fragmentTransaction.addToBackStack(null); //commit & get transaction ID int transId = fragmentTransaction.commit(); 

Plus tard, j’appuie le numéro de transaction ci-dessus ( transId ):

 //pop the transaction from backstack fragmentManager.popBackStack(transId,FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Plus tard, je redéfinis les données de bundle comme argument sur mon fragment ( myFrag ):

 //Got Java.lang.IllegalStateException: fragment already active myFrag.setArguments(bundle); 

Comme vous le voyez, mon code ci-dessus a reçu une exception, Java.lang.IllegalStateException: fragment already active . Je ne comprends pas pourquoi myFrag est toujours actif, même si je l’ai effacé de l’arrière-scène. de toute façon, puisque j’ai eu l’exception, je pensais que je n’avais pas d’autre choix que de désactiver le fragment, alors j’ai fait:

 Fragment activeFragment = fragMgr.findFragmentByTag("MyTag"); fragmentTransaction.remove(activeFragment); 

Je ne suis pas sûr si mon code ci-dessus peut réellement désactiver le fragment, car je n’ai pas trouvé comment désactiver un fragment. 🙁

Après cela, lorsque j’essaie de définir à nouveau les données de l’ensemble sur mon fragment myFrag , j’ai toujours la même erreur:

 Java.lang.IllegalStateException: fragment already active 

Semble même que j’ai enlevé le fragment, il est toujours actif … Pourquoi? Comment désactiver un fragment?

La lecture de la source setArguments (Bundle args) vous aidera à comprendre:

 /** * Supply the construction arguments for this fragment. This can only * be called before the fragment has been attached to its activity; that * is, you should call it immediately after constructing the fragment. The * arguments supplied here will be retained across fragment destroy and * creation. */ public void setArguments(Bundle args) { if (mIndex >= 0) { throw new IllegalStateException("Fragment already active"); } mArguments = args; } 

Vous ne pouvez plus utiliser setArguments (arguments Bundle) dans votre code sur le même fragment . Ce que vous voulez faire, je suppose, c’est soit créer un nouveau fragment et redéfinir les arguments. Vous pouvez également utiliser getArguments () , puis utiliser la méthode put du bundle pour modifier ses valeurs.

Essayez de supprimer le fragment précédent avant d’append le nouveau: https://stackoverflow.com/a/6266144/969325

remove () modifie le statut du fragment pour le désactiver. Dans votre cas, vous n’avez simplement pas appelé commit () après remove (..).

 fragmentTransaction.remove(activeFragment); 

Vous feriez aussi commit () après remove ().

 fragmentTransaction.remove(activeFragment).commit(); 

Eu le même problème. J’ajoutais le fragment au backstack. Et l’erreur était parce que je n’ai pas appelé popbackstack (). L’utilisation de popbackstack m’a aidé

Je rencontre le même problème sur Xamarin.android. Voici ce que dit la documentation .

Cela ne peut être appelé que si le fragment a été attaché à son activité

Appelez simplement la méthode publique à partir de fragment

 if(userFragment==null){ userFragment = new UserFragment(); Bundle bundle = new Bundle(); bundle.putSsortingng(Constants.EXTRA_CUSTOMER, result); userFragment.setArguments(bundle); }else{ try { Customer customer = new Customer(); customer.parseCustomer(new JSONObject(result)); userFragment.updateVeiw(customer); } catch (JSONException e) { e.printStackTrace(); } } 

Tout d’abord, je commence par décrire pourquoi cela se produit et ensuite je trouverai la solution que j’ai trouvée en train de fonctionner ….

Ce problème se produit lorsque Android supprime le fragment de la stack mais qu’il n’a pas encore fini de le supprimer. Pour vérifier cela, vous pouvez utiliser la méthode isRemoving() du fragment. Si false , c’est-à-dire que le fragment n’est pas actif, vous pouvez continuer à définir les arguments à l’aide de setArguments(bundle) . Sinon, vous ne pouvez pas définir d’arguments sur un fragment déjà actif et ne pouvez le remplacer qu’en adressant les mêmes arguments avec getArguments().putAll(bundle) .

Résumer,

  if (myFrag.isRemoving()) { myFrag.getArguments().putAll(bundle); } else { myFrag.setArguments(bundle); } 

Si vous voulez éviter cela, c’est-à-dire supprimer le fragment immédiatement pour qu’il n’y ait pas de fragment actif, vous pouvez utiliser onBackPressed() dans onBackStackChangedListener() , ce qui définira isRemoving() sur false .

  1. Vérifiez si votre mise en page actuelle ou ancienne par exemple

     setContentView(R.layout.activity_main); 
  2. Supprimez l’ancien fichier .gradle dans votre fichier de projet et reconstruisez le fichier de dégradé pour le projet.