déplacer Android fragment à un autre conteneur ne Peut pas changer l'ID de conteneur de fragment
Voici ce que je voudrais que mon application est à faire sur une tablette.
Fragment (0) a un menu qui va afficher les fragments (1)...(n) comme ceci:
-----------------
| | | | |
| | | | |
|(0)| X | X | X |
| | | | |
| | | | |
-----------------
becomes
-----------------
| | | | |
| | | | |
|(0)|(1)| X | X |
| | | | |
| | | | |
-----------------
and then
-----------------
| | | | |
| | | | |
|(0)|(2)|(1)| X |
| | | | |
| | | | |
-----------------
etc...
Fragment0 ne se déplace jamais, les autres sont décalés vers la droite. Fragments d'aller au large de la pointe vers la droite sera détruit.
J'ai donc configurer mon XML de mise en page horizontale un LinearLayout et contenant 4 FrameLayout avec le bon Id (fragment0... fragment3)
Je peux instancier et d'affichage fragment0 et puis fragment1, mais je ne suis pas en mesure de le déplacer vers la droite après, je reçois:
ERROR/AndroidRuntime(343): FATAL EXCEPTION: main
java.lang.IllegalStateException: Can't change container ID of fragment ...
La seule relation que les questions que j'ai trouvé sont cette une et que l'on, essayé toutes les différentes solutions proposées avec pas de chance.
Essayé FragmentTransaction.remove()
suivie par .add()
, essayé .replace()
, essayé dans des ordres différents et à s'engager à mi-chemin à travers (même en essayant de commettre deux fois comme quelqu'un l'a suggéré), essayé d'appeler addToBackStack()
... toujours pas de chance.
Question est de savoir si il est possible de déplacer les fragments comme ça avec un FragmentTransaction. Si oui, ce que je fais mal (et en bonus, est-il possible d'animer?). Si non, quelle serait la bonne façon de mettre en œuvre cette?
Noter que je ne veux pas ré-instancier les fragments à chaque fois (chaque faire quelques requêtes sur le web qui peut prendre un certain temps). Il est possible d'extraire toutes les données de l'activité pour recréer un, mais je préfère ne pas le faire si c'est possible...
OriginalL'auteur Matthieu | 2012-11-28
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas si c'est tout à fait ce que vous voulez, mais j'ai fait un petit exemple de ce qui concerne votre problème. Fondamentalement, vous serez à faire la bonne déplacement en utilisant le fichier de mise en page, ayant une enveloppe contenant pour chacun de ces déplacement des fragments. L'exemple de code est un peu gros pour une réponse si j'ai posté dans un résumé de ce que vous pouvez trouver ici. Dans cet exemple de communiqué de chacun des
ListFragment
'éléments(Fragment 1 -> Fragment 2 -> fragment 3) pour voir le comportement.A été capable de faire ce dont j'avais besoin... ne Pouvait pas comprendre comment pousser mes modifications pour l'essentiel que vous avez créé, donc je l'ai mis là: gist.github.com/4166640
Excusez-moi. C'est qu'une faute de frappe, qu'il doit être
LinearLayout
au lieu deRelativeLayout
dansfrag_fragaccordion.xml
?Pourquoi demandez-vous cela? Les deux échantillons d'utilisation
RelativeLayout
dans ce fichier de mise en page.j'ai voulu dire dans @Matthieu exemple, la ligne 33
LinearLayout main_linear = (LinearLayout) getActivity().findViewById(R.id.main_linear);
est étrange pour moi.OriginalL'auteur Luksprog
Oui récipient contenant le fragment peut être modifié à l'aide de
remove()
fonction.Le problème ici est
commit()
. C'est un appel asynchrone, et de planifier l'être sur le thread principal. Donc, à force de leFragmentManager
à le faire immédiatement avant de l'ajouter à l'autre récipient.Pour cela, nous allons utiliser
executePendingTransactions()
fonction. Après l'appel de cette essayez d'ajouter le fragment à nouveau conteneur.Docs : executePendingTransactions()
Exemple De Code :
Profiter. Les Feed-backs sont accueillis
Modifier
Je voudrais ajouter un point ici. Comme j'ai eu le même problème, est venu à travers de ce fil et appliqué les modifications suggérées. Problème persistait. Puis j'ai regardé dans le dernier commentaire en bas de ce fil qui a résolu mon problème: supprimer
addToBackStack()
méthode lors de la perpétration d'une transaction ou si vous avez intentionnellement à l'utiliser, enlever le fragment de la pile de retour avant de l'ajouter à un autre conteneur. J'espère que ça aidera à l'avenir lecteur.Pavan.....Je ne sais même pas vous....vous ne savez même pas moi.....mais j'ai de graves amour pour vous, mon ami.
Je suis content qu'u a été utile 🙂
hey bro merci pour votre amour...m a touché 😉 🙂 😀
Le problème avec cette solution est qu'il n'est pas possible d'ajouter de la première transaction de la pile de retour. De cette manière, l'origine de l'erreur "ne Peut pas changer l'ID de conteneur" s'affiche à nouveau.
OriginalL'auteur