Android Fragment - passer d'un mode à l'autre?
Puis-je ajouter d'abord un Fragment de Vue, "détacher de", et puis "re-attacher" à un autre point de Vue?
Dans le code, je veux:
fragOne one = new fragOne();
getSupportFragmentManager().beginTransaction()
.add(R.id.left, one, "tag").commit();
getSupportFragmentManager().beginTransaction()
.detach(one).commit(); //or .remove(), or .addToBackStack(null).remove()
getSupportFragmentManager().executePendingTransactions();
getSupportFragmentManager().beginTransaction()
.add(R.id.right, one).commit();
Mais il déclenche une erreur:
04-05 13:28:03.492: E/AndroidRuntime(7195): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.trybackstack/com.example.trybackstack.MainActivity}: java.lang.IllegalStateException: Can't change container ID of fragment fragOne{40523130 #0 id=0x7f080000 tag}: was 2131230720 now 2131230721
Merci pour l'aide!
Vous êtes confrontés à cette exception parce que vous êtes à l'aide de deux différents identifiant de fragment de récipient(j'.e R. id.droit et R. id.gauche) pour ajouter le "Fragment".Utiliser un id unique pour le conteneur..
En effet. Mais je veux déplacer ce fragment de gauche à droite.
Dans ce cas, vous devez vous engager à la précédente transaction en premier, puis à nouveau commencer une nouvelle transaction pour ajouter le même fragment de point de vue différent
Je pense que je l'ai fait, ce que vous avez dit. La dernière ligne est à l'origine de cette exception. C'est une nouvelle transaction.
j'ai juste essayé une nouvelle solution à ce problème. je pense que cela fonctionnera..venir sur le chat
En effet. Mais je veux déplacer ce fragment de gauche à droite.
Dans ce cas, vous devez vous engager à la précédente transaction en premier, puis à nouveau commencer une nouvelle transaction pour ajouter le même fragment de point de vue différent
Je pense que je l'ai fait, ce que vous avez dit. La dernière ligne est à l'origine de cette exception. C'est une nouvelle transaction.
j'ai juste essayé une nouvelle solution à ce problème. je pense que cela fonctionnera..venir sur le chat
OriginalL'auteur midnite | 2013-04-05
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème mais j'ai trouvé que ce que j'ai vraiment besoin était de reparent le fragment de la vue et de ne pas le fragment lui-même, en évitant toute fragmentManager transaction.
Oui je suis totalement d'accord, parce que le conteneur est un simple FrameLayout dans la plupart des senarios, et cette approche évite de jouer avec le FragmentManager et Fragment de cycles de vie.
Cela n'a pas fonctionné pour moi, car je veux déplacer le fragment d'un parent à l'autre, sur le changement d'orientation. Donc, après le changement d'orientation du fragment vue d'hôte est détruit.
OriginalL'auteur befstrat
après avoir essayé toutes les réponses à partir des questions similaires, on dirait que je ai trouvé un moyen de faire le tour.
Première question - vous avez vraiment de commettre et exécuter retirer de la transaction avant de tenter d'ajouter un fragment à un autre conteneur. Merci pour qui va à nef de la réponse
Mais cela ne fonctionne pas à chaque fois. La deuxième question est une pile de retour. C'est en quelque sorte blocs de la transaction.
Donc le code complet, qui fonctionne pour moi ressemble:
Dans certains cas, cela ne fonctionnera pas. J'ai obtenu de meilleurs résultats avec la séquence dans la nef d'origine de réponse: supprimer des fragments, tuer backstack puis ajouter les fragments.
OriginalL'auteur Yan.Yurkin
Je suppose que vous auriez ce compris maintenant, mais je ne vois pas de réponse satisfaisante.
Donc, je vais poster ce que pour les autres, qui peuvent se référer à ce sujet dans l'avenir.
Si vous souhaitez déplacer un fragment d'une vue à l'autre, vous procédez de la manière suivante:
De cette façon, vous n'avez pas à dupliquer le fragment.
En fait, qui ne de travailler. Testé sur Nexus7/2012/4.4 et Galaxy SII/4.1.2. Ce que je fais mal? =)
Ressemble à ceci fonctionne uniquement si vous avez un vide pile de retour. Ici est l'amélioration du code: stackoverflow.com/a/21328919/1855764
Cela provoque l'affichage d'être détruits et recréés, pas préservé – Greg Ennis 41 secondes auparavant modifier
OriginalL'auteur nave
Veuillez vérifier la solution,vous devez créer une nouvelle instance de la même fragment et de l'instancier avec l'état de l'ancien fragment si vous souhaitez enregistrer l'état de l'ancien fragment.
Bienvenue @midnite
OriginalL'auteur Karan_Rana
J'ai couru dans un problème. Parfois, le déplacement des fragments d'œuvres, parfois, vous devez créer une nouvelle instance. Il semble que le déplacement de fragments ne fonctionne pas, si le fragment continue à être dans le "isRemoving" de l'état.
Étant retiré semble également être évités par la présence d'un fragment de la backstack.
OriginalL'auteur Burtan
Ajoutant à la Yan. Yurkin réponse. Assurez-vous de ne pas avoir toutes les transitions appliqué à l'opération comme ceux-ci semblent retarder le fragment de s'en détacher.
OriginalL'auteur bkant