120 votes

Android - Définir l'id du fragment

Comment puis-je définir un Fragment 's Id afin que je puisse utiliser getSupportFragmentManager().findFragmentById(R.id.--) ?

0 votes

Vous pouvez le définir dans le fichier xml de mise en page

119voto

Tom Dignan Points 4065

Vous ne pouvez pas définir l'ID d'un fragment de manière programmatique. .

Il existe cependant un String tag que vous pouvez définir dans la FragmentTransaction et qui peut être utilisée pour identifier de manière unique un fragment.

Comme Aleksey l'a souligné, vous pouvez passer un ID à FragmentTransaction 's add(int, Fragment) méthode. Cependant, cela ne spécifie pas l'ID d'un Fragment. Il spécifie l'ID d'un ViewGroup pour insérer le Fragment en. Ce n'est pas très utile pour l'objectif que vous poursuivez, car cela ne permet pas d'identifier de manière unique Fragment mais ViewGroup s. Ces ID sont de conteneurs celui-là ou plus Les fragments peuvent être ajoutés de manière dynamique. L'utilisation d'une telle méthode pour identifier Fragment vous obligerait à ajouter ViewGroup de façon dynamique au Layout pour chaque Fragment que vous insérez. Ce serait plutôt encombrant.

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 's add(int containerViewId, Fragment fragment, String tag) et FragmentManager 's findFragmentByTag(Chaîne) méthode.

Dans une de mes applications, j'ai été obligé de générer des chaînes de caractères de façon dynamique. Mais ce n'est pas si coûteux par rapport à la FragmentTransaction réelle, de toute façon.

Un autre avantage de la méthode des balises est qu'elle peut identifier un fragment qui n'est pas ajouté à l'interface utilisateur. Voir la méthode FragmentTransaction add(Fragment, String) méthode. Fragment ne doivent pas avoir View s ! Ils peuvent également être utilisés pour faire persister un état éphémère entre les changements de configuration !

0 votes

Si j'utilise la balise et non l'ID du fragment, comment puis-je utiliser l'appel replace qui nécessite un ID de ressource de fragment ?

12 votes

@TomDignan que diriez-vous d'un fragment qui sera ajouté dans un ViewPager ? Comment puis-je définir sa balise ? Je ne peux pas utiliser les transactions dans cette situation.

1 votes

@GuilhE L'activité fournit une méthode addFragment() que vous pouvez référencer depuis le viewpager. Garder le tag avant cela pourrait être accompli avec un hashmap.

45voto

Moose Morals Points 301

Il s'avère que vous n'avez pas besoin de connaître l'identifiant du fragment.

Dans la documentation :

public abstract Fragment findFragmentById (int id)

Finds a fragment that was identified by the given id either
when inflated from XML or as the container ID when added in
a transaction.

La partie importante est "comme l'ID du conteneur lorsqu'il est ajouté dans une transaction".

donc :

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.fragment_holder, new AwesomeFragment())
    .commit();

et ensuite

AwesomeFragment awesome = (AwesomeFragment)
     getSupportFragmentManager()
          .findFragmentById(R.id.fragment_holder);

vous obtiendra le fragment (génial) contenu dans R.id.fragment_holder.

4voto

user2014118 Points 11

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 commande FragmentManager.findFragmentByTag(String tab) pour trouver le fragment en question.

2voto

dbm Points 3814

Comme Tom et d'autres l'ont déjà mentionné, il existe des moyens de placer 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 n'obtient pas de balise avant d'être associé à l'activité (ou, en fait, à l'objet de l'activité). FragmentManager ). Que faire si l'on a besoin d'identifier un fragment avant qu'il n'ait été étiqueté ?

Les solutions que j'ai trouvées jusqu'à présent reposent toutes sur la plus vieille astuce (Java) du monde : créer un fragment de modèle minimaliste qui prend un id dans l'un de ses constructeurs et fournit un getFragmentId() qui renvoie cet identifiant. Je laisse ensuite les fragments qui ont besoin d'une identification précoce étendre ce modèle et voilà ! Le problème est résolu.

Cette solution pourrait, malheureusement, nécessiter un ensemble de fragments modèles, un pour chaque type de fragment, ListFragment , DialogFragment ou tout simplement Fragment (POFO ?!) qui nécessitent une identification précoce. Mais cela est gérable dans le cas des fragments je pense, compte tenu des gains fournis.

Désolé de déchirer des blessures en cours de guérison :-)

A la vôtre !

-2voto

oren zvi Points 48

En plus de la réponse de Tom, la méthode replace supporte également la balise fragment, en plus de la méthode add.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X