Comment puis - je mettre un Fragment
« s Id
pour que je puisse utiliser getSupportFragmentManager().findFragmentById(R.id.--)
?
111
Comment puis - je mettre un Fragment
« s Id
pour que je puisse utiliser getSupportFragmentManager().findFragmentById(R.id.--)
?
Réponses:
Vous ne pouvez pas définir l'ID d'un fragment par programme .
Il existe cependant un
String tag
que vous pouvez définir dans FragmentTransaction qui peut être utilisé pour identifier de manière unique un Fragment.Comme l'a souligné Aleksey, vous pouvez transmettre un identifiant à
FragmentTransaction
laadd(int, Fragment)
méthode de. Cependant, cela ne spécifie pas l'ID d'un fragment. Il spécifie l'ID de aViewGroup
dans lequel insérerFragment
. Ce n'est pas très utile pour le but que j'attends de vous, car il n'identifie pas de façon unique lesFragment
s, mais l'ViewGroup
art. Ces ID sont des conteneurs auxquels un ou plusieurs fragments peuvent être ajoutés dynamiquement. L'utilisation d'une telle méthode pour identifier lesFragment
s vous obligerait à ajouter desViewGroup
s dynamiquement à la mise en page pour chaqueFragment
insertion. Ce serait assez fastidieux.Donc , si votre question est de savoir comment créer un identifiant unique pour un fragment que vous ajoutez dynamiquement, la réponse est d'utiliser
FragmentTransaction
« de l'add (int containerViewId, Fragment fragment, étiquette String) méthode etFragmentManager
» de findFragmentByTag (String) méthode.Dans l'une de mes applications, j'ai été obligé de générer des chaînes de manière dynamique. Mais ce n'est pas si cher que la FragmentTransaction réelle, de toute façon.
Un autre avantage de la méthode de balise est qu'elle peut identifier un fragment qui n'est pas ajouté à l'interface utilisateur. Consultez la méthode add (Fragment, String) de FragmentTransaction .
Fragment
s n'a pas besoin deView
s! Ils peuvent également être utilisés pour conserver l'état éphémère entre les changements de configuration!la source
Il s'avère que vous n'avez peut-être pas besoin de connaître l'ID du fragment.
À partir de la documentation:
La partie importante est «comme ID de conteneur lorsqu'il est ajouté dans une transaction».
alors:
puis
vous obtiendrez le fragment (génial) contenu dans R.id.fragment_holder.
la source
Dans la plupart des cas, vous pouvez utiliser la balise de fragment ainsi que l'ID.
Vous pouvez définir la valeur de la balise dans
FragmentTransaction.add(Fragment fragment, String tag );
. Ensuite, vous pouvez utiliser la commandeFragmentManager.findFragmentByTag(String tab)
pour trouver le fragment en question.la source
Comme Tom et d'autres l'ont déjà mentionné, il existe des moyens de mettre une étiquette sur un fragment et d'utiliser cette étiquette pour l'identification. Un problème ultérieur que j'ai rencontré avec ces solutions est que le fragment ne reçoit pas de balise tant qu'il n'est pas associé à l'activité (ou, en fait, à la
FragmentManager
). Que faire si l'on a besoin d'identifier un fragment avant qu'il n'ait été étiqueté?Jusqu'à présent, mes solutions reposent toutes sur la plus ancienne astuce (Java) au monde: créer un fragment de modèle minimaliste qui prend un identifiant dans l'un de ses constructeurs et fournit une
getFragmentId()
méthode qui renvoie cet identifiant. Je laisse ensuite ces fragments qui nécessitent une identification précoce étendre ce modèle et; voila! Problème résolu.Cette solution pourrait, malheureusement, nécessiter un ensemble de fragments de modèle, un pour chaque type de fragment
ListFragment
,DialogFragment
ou tout simplement ancienFragment
(POFO?!) Qui nécessitent une identification précoce. Mais c'est gérable dans le cas de fragments je pense, compte tenu des gains apportés.Désolé d'avoir déchiré des plaies cicatrisantes :-)
À votre santé!
la source
Utilisez le suivant:
Pour ajouter un fragment:
Pour identifier le fragment existant:
la source
Lorsque vous utilisez une balise, assurez-vous d'ajouter le
afin que votre Fragment soit repris au lieu d'être détruit comme indiqué dans les guides du développeur.
Vous pouvez le trouver à la fin de cette page .
J'ai perdu environ 30 minutes à essayer de comprendre pourquoi mon Fragment n'a pas été trouvé par un simple
findFragmentByTag();
appella source
En plus de la réponse de Tom, la méthode replace prend également en charge la balise fragment, en plus de la méthode add.
la source