Vous ne pouvez pas définir un fragment de l'ID par programme.
Il existe, cependant, un String tag que vous pouvez définir à l'intérieur de la FragmentTransaction qui peut être utilisé pour identifier de manière unique un Fragment.
Comme Alex l'a souligné, vous pouvez passer un ID à FragmentTransaction's add(int, Fragment) méthode. Cependant, cela ne permet pas de spécifier l'ID d'un Fragment. Il spécifie l'ID d'un ViewGroup pour insérer le Fragment. Ce n'est pas très utile pour l'usage que je espérer que vous avez, car il n'a pas d'identifier de manière unique Fragments, mais ViewGroups. Ces Id sont de conteneurs que l'on ou plus fragments peuvent être ajoutés dynamiquement. L'utilisation d'une telle méthode pour identifier Fragments vous obligerait à ajouter ViewGroups dynamiquement à la Mise en page pour chaque Fragment vous insérez. Qui serait assez lourd.
Dans une de mes applications, j'ai été obligé de générer des chaînes de caractères de manière dynamique. Mais il n'est pas cher par rapport à la réelle FragmentTransaction, de toute façon.
Un autre avantage de la méthode de la balise est qu'il peut identifier un Fragment qui n'est pas ajouté à l'INTERFACE utilisateur. Voir FragmentTransaction de ajouter(Fragment de Chaîne) méthode. Fragments n'ont pas besoin de Views! Ils peuvent également être utilisés pour persister éphémère de l'état entre les modifications de configuration!
Si j'utilise la balise et pas l'ID pour le fragment, comment puis-je utiliser le remplacer appel qui a besoin d'un fragment id de ressource? vous ne pouvez pas. comment sur un fragment qui sera ajouté dans un ViewPager? Comment puis-je mettre son étiquette? Je ne peux pas utiliser les transactions dans cette situation. L'activité fournit une addFragment() méthode qui vous pouvez faire référence à partir de la viewpager. Garder l'étiquette avant qui pourrait être accompli avec une table de hachage. Peut-elle être modifié un tout petit peu à souligner que vous pouvez définir l'id dans l'xml de mise en page? Parce que personnellement, je n'ai pas lu d'autres questions, a été sous l'impression que il n'y a aucun moyen de définir l'id de l'fragment...
S'avère que vous ne pouvez pas besoin de connaître le fragment id.
De la documentation:
publicabstractFragment findFragmentById (int id)Finds a fragment that was identified by the given id either
when inflated from XML oras the container ID when added in
a transaction.
Le plus important est "comme le numéro du conteneur lorsqu'il est ajouté dans une transaction".
Dans la plupart des cas, vous pouvez utiliser le fragment de la balise ainsi que l'ID.
Vous pouvez définir la valeur de balise dans FragmentTransaction.add(Fragment fragment, String tag );.
Ensuite, vous pouvez utiliser la commande FragmentManager.findFragmentByTag(String tab) pour trouver le fragment en question.
Comme Tom et les autres déjà dit, il existe des moyens de mettre un tag sur un fragment d'utiliser cette balise pour l'identification. Subséquente d'un problème que j'ai rencontré avec ces solutions est que le fragment n'est pas obtenir une étiquette jusqu'à ce qu'il est associé à l'Activité (ou, en fait, la FragmentManager). Que faire si on a besoin d'identifier un fragment avant qu'il ait été identifié?
Mes solutions jusqu'à présent reposent toutes sur le plus ancien (Java) truc dans le monde: créer un minimaliste fragment de template qui prend un id dans l'un de ses constructeurs et fournit un getFragmentId() méthode qui retourne l'identifiant. J'ai alors laissé ces fragments qui ont besoin d'une identification précoce d'étendre ce modèle; et le tour est joué! Le problème est résolu.
Cette solution pourrait, malheureusement, ont besoin d'un ensemble de fragments de modèle, un pour chaque fragment type, ListFragment, DialogFragment ou tout simplement l' Fragment (POFO?!) qu'il faut les identifier rapidement. Mais c'est gérable dans le cas de fragments je pense que, considérant les gains fournis.
Désolé pour déchirer la cicatrisation des plaies 🙂
Lors de l'utilisation d'une balise n'hésitez pas à ajouter le
fragmentTransaction.addToBackStack(null);
méthode afin que votre Fragment est repris au lieu d'détruit comme mentionné dans les guides du développeur.
Si vous n'appelez pas addToBackStack() lorsque vous effectuez une transaction qui supprime un fragment, alors que le fragment est détruite lorsque la transaction est validée et l'utilisateur ne peut pas revenir en arrière. Tandis que si vous faites appel addToBackStack() lors de la suppression d'un fragment, puis le fragment est arrêté et est reprise ultérieurement si l'utilisateur navigue en arrière.
Vous ne pouvez pas définir un fragment de l'ID par programme.
Il existe, cependant, un
String tag
que vous pouvez définir à l'intérieur de la FragmentTransaction qui peut être utilisé pour identifier de manière unique un Fragment.Comme Alex l'a souligné, vous pouvez passer un ID à
FragmentTransaction
'sadd(int, Fragment)
méthode. Cependant, cela ne permet pas de spécifier l'ID d'un Fragment. Il spécifie l'ID d'unViewGroup
pour insérer leFragment
. Ce n'est pas très utile pour l'usage que je espérer que vous avez, car il n'a pas d'identifier de manière uniqueFragment
s, maisViewGroup
s. Ces Id sont de conteneurs que l'on ou plus fragments peuvent être ajoutés dynamiquement. L'utilisation d'une telle méthode pour identifierFragment
s vous obligerait à ajouterViewGroup
s dynamiquement à la Mise en page pour chaqueFragment
vous insérez. Qui serait assez lourd.Donc, si votre question est de savoir comment créer un identifiant unique pour un Fragment que vous êtes en train d'ajouter de manière dynamique, la réponse est d'utiliser
FragmentTransaction
's ajouter(int containerViewId, Fragment par fragment de Chaîne tag) méthode etFragmentManager
's findFragmentByTag(String) méthode.Dans une de mes applications, j'ai été obligé de générer des chaînes de caractères de manière dynamique. Mais il n'est pas cher par rapport à la réelle FragmentTransaction, de toute façon.
Un autre avantage de la méthode de la balise est qu'il peut identifier un Fragment qui n'est pas ajouté à l'INTERFACE utilisateur. Voir FragmentTransaction de ajouter(Fragment de Chaîne) méthode.
Fragment
s n'ont pas besoin deView
s! Ils peuvent également être utilisés pour persister éphémère de l'état entre les modifications de configuration!vous ne pouvez pas.
comment sur un fragment qui sera ajouté dans un ViewPager? Comment puis-je mettre son étiquette? Je ne peux pas utiliser les transactions dans cette situation.
L'activité fournit une addFragment() méthode qui vous pouvez faire référence à partir de la viewpager. Garder l'étiquette avant qui pourrait être accompli avec une table de hachage.
Peut-elle être modifié un tout petit peu à souligner que vous pouvez définir l'id dans l'xml de mise en page? Parce que personnellement, je n'ai pas lu d'autres questions, a été sous l'impression que il n'y a aucun moyen de définir l'id de l'fragment...
OriginalL'auteur Thomas Dignan
S'avère que vous ne pouvez pas besoin de connaître le fragment id.
De la documentation:
Le plus important est "comme le numéro du conteneur lorsqu'il est ajouté dans une transaction".
donc:
et puis
vous obtiendrez ce que (génial) fragment est tenue à R. id.fragment_holder.
OriginalL'auteur Moose Morals
Dans la plupart des cas, vous pouvez utiliser le fragment de la balise ainsi que l'ID.
Vous pouvez définir la valeur de balise dans
FragmentTransaction.add(Fragment fragment, String tag );
.Ensuite, vous pouvez utiliser la commande
FragmentManager.findFragmentByTag(String tab)
pour trouver le fragment en question.OriginalL'auteur user2014118
Comme Tom et les autres déjà dit, il existe des moyens de mettre un tag sur un fragment d'utiliser cette balise pour l'identification. Subséquente d'un problème que j'ai rencontré avec ces solutions est que le fragment n'est pas obtenir une étiquette jusqu'à ce qu'il est associé à l'Activité (ou, en fait, la
FragmentManager
). Que faire si on a besoin d'identifier un fragment avant qu'il ait été identifié?Mes solutions jusqu'à présent reposent toutes sur le plus ancien (Java) truc dans le monde: créer un minimaliste fragment de template qui prend un id dans l'un de ses constructeurs et fournit un
getFragmentId()
méthode qui retourne l'identifiant. J'ai alors laissé ces fragments qui ont besoin d'une identification précoce d'étendre ce modèle; et le tour est joué! Le problème est résolu.Cette solution pourrait, malheureusement, ont besoin d'un ensemble de fragments de modèle, un pour chaque fragment type,
ListFragment
,DialogFragment
ou tout simplement l'Fragment
(POFO?!) qu'il faut les identifier rapidement. Mais c'est gérable dans le cas de fragments je pense que, considérant les gains fournis.Désolé pour déchirer la cicatrisation des plaies 🙂
Cheers!
OriginalL'auteur dbm
Utiliser les éléments suivants:
Pour ajouter un fragment:
Afin d'identifier les fragment:
OriginalL'auteur Jaydev
En plus de Tom réponse, remplacez la méthode prend également en charge le fragment de la balise, en plus d'ajouter une méthode.
OriginalL'auteur oren zvi
Lors de l'utilisation d'une balise n'hésitez pas à ajouter le
méthode afin que votre Fragment est repris au lieu d'détruit comme mentionné dans les guides du développeur.
Vous pouvez la trouver sur la fin de cette page.
J'ai perdu environ 30 minutes à essayer de comprendre pourquoi mon Fragment n'a pas été trouvé par le biais d'un simple
findFragmentByTag();
appelOriginalL'auteur Panos Gr