2016-08-26 1 views
1

Je tente d'ajouter/supprimer DialogFragments dynamiquement à/de mon FragmentManager dynamiquement qu'un utilisateur effectue différentes actions. Le problème est que le FragmentManager ne supprime pas tous correctement. J'appelle la fonction remove(), donc je suis curieux de savoir pourquoi ces Fragments ne sont pas supprimés. J'ai cherché en ligne, et la méthode de suppression est ce que les gens disent que vous devez utiliser afin de supprimer Fragments du FragmentManager.FragmentManager ne supprime pas les fragments ajoutés dynamiquement

Exemple de code ci-dessous montrant ce que je fais:

  // originally added `LoginRestFragment` with TAG_LOGIN_REST_FRAGMENT tag to Fragment Manager 
      rest = new SettingsDialogFragment(); 
      FragmentManager fm = getFragmentManager(); 
      rest.setArguments(bundle); 
      Fragment fragment = fm.findFragmentByTag(TAG_LOGIN_REST_FRAGMENT); 
      Log.d("frag_type", fragment.toString()); 
      fm.beginTransaction().remove(fragment).commit(); 
      fragment = fm.findFragmentByTag(TAG_LOGIN_REST_FRAGMENT); 
      Log.d("is_frag_removed", fragment.toString()); 
      // why does this return a Fragment type ^^ shouldn't it throw null errror? 
      Log.d("rest", rest.toString()); 
      //^this shows rest has been updated from LoginRestFrament to SettingsDialogFragment 
      fm.beginTransaction().add(rest, TAG_LOGIN_REST_FRAGMENT).commit(); 
      fragment = fm.findFragmentByTag(TAG_LOGIN_REST_FRAGMENT); 
      Log.d("frag_type", fragment.toString()); 
      // why is this not SettingsDialogFragment?? 

Déclarations de journal indiquant ce qui est représenté. Je devrais noter que ce qui est montré sur l'écran n'est plus le LoginRestFragment, mais le SettingsDialogFragment (comme prévu), et reste est une variable de classe.

D/frag_type: LoginRestFragment 
D/is_frag_removed: LoginRestFragment 
D/rest: SettingsDialogFragment 
D/frag_type: LoginRestFragment 
+1

Je crois que vous devez attendre qu'un cycle de thread UI se termine avant que les commits ne passent réellement. – DeeV

Répondre

1

Merci DeeV! Ce que vous avez dit est vrai, et c'est comment j'ai trouvé une solution de contournement pour résoudre ce qui est répondu dans this Entrée StackOverflow. Vous pouvez essentiellement utiliser executePendingTransactions() sur votre FragmentManager pour effectuer des validations dynamiquement.