Comment définir une balise Fragment par code?

137

Je n'ai pas trouvé quelque chose comme setTag(String tagName)méthode dans la Fragmentclasse. La seule façon de définir une Fragmentbalise que j'ai trouvée est de faire un FragmentTransactionet de passer un nom de balise en paramètre.

Est-ce le seul moyen de définir explicitement une Fragmentbalise par code?

Axel M. Garcia
la source

Réponses:

118

Oui. Donc, le seul moyen est au moment de la transaction, par exemple en utilisant add,replace ou dans le cadre de la mise en page.

J'ai déterminé cela grâce à un examen des sources de compatibilité alors que je cherchais brièvement des éléments similaires à un moment donné dans le passé.

PJL
la source
2
Votre réponse se trouve [ici] [1] dans le post sur stackoverflow [1]: stackoverflow.com/questions/9363072/android-set-fragment-id
SME
2
L'ajout de l' utilisation FragmentTransaction (int containerViewId, fragment Fragment, balise String) comme décrit ici: stackoverflow.com/a/13244471/4002895 @PJL S'il vous plaît modifier vos answer.This répondre à tromper les gens
dasar
C'est assez gênant.
Ian Wambai
75

Vous pouvez définir la balise pour fragmenter de cette manière:

Fragment fragmentA = new FragmentA();
getFragmentManager().beginTransaction()
    .replace(R.id.MainFrameLayout,fragmentA,"YOUR_TARGET_FRAGMENT_TAG")
    .addToBackStack("YOUR_SOURCE_FRAGMENT_TAG").commit(); 
David
la source
7
Où j'utilise ce code? Dans getItem dans FragmentPagerAdapter?
Dr.jacky
35

Vous pouvez fournir une balise dans votre fichier xml de mise en page d'activité.

Fournir le android:tag attribute avec une chaîne unique.

Tout comme vous attribueriez un identifiant dans un format xml.

    android:tag="unique_tag"

lien vers le guide du développeur

Kuool
la source
33
Cela fonctionnerait si l'on utilisait un fichier de mise en page. Mais cette question fait référence à la définition dynamique de la balise en Java.
IgorGanapolsky
1
c'était la réponse dont j'avais besoin car parfois, lorsque vous utilisez certaines bibliothèques, vous n'avez pas de contrôle sur les transactions de fragment, vous ne pouvez donc pas définir la balise par programmation. Merci!
RJFares
3

Vous pouvez également obtenir tous les fragments comme ceci:

Pour les fragmets v4

List<Fragment> allFragments = getSupportFragmentManager().getFragments();

Pour app.fragment

List<Fragment> allFragments = getFragmentManager().getFragments();
Chris Fremgen
la source
0

C'est le meilleur moyen que j'ai trouvé:

   public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
          // Let's first dynamically add a fragment into a frame container
          getSupportFragmentManager().beginTransaction(). 
              replace(R.id.flContainer, new DemoFragment(), "SOMETAG").
              commit();
          // Now later we can lookup the fragment by tag
          DemoFragment fragmentDemo = (DemoFragment) 
              getSupportFragmentManager().findFragmentByTag("SOMETAG");
        }
    }
}
Kingsley Mitchell
la source
-1

Je sais que cela fait 6 ans mais si quelqu'un est confronté au même problème, faites comme moi:

Créez une Fragmentclasse personnalisée avec un champ d'étiquette:

public class MyFragment extends Fragment {
 private String _myTag;
 public void setMyTag(String value)
 {
   if("".equals(value))
     return;
   _myTag = value;
 }
 //other code goes here
}

Avant d'ajouter le fragment à l' sectionPagerAdapterensemble, la balise est juste comme ça:

 MyFragment mfrag= new MyFragment();
 mfrag.setMyTag("TAG_GOES_HERE");
 sectionPagerAdapter.AddFragment(mfrag);
Th3Wolf
la source
La question n'était pas de définir une propriété sur un fragment. Il s'agissait de pouvoir récupérer une instance de Fragment existante sans conserver de référence .
mkuech
-22

Vous pouvez ajouter la balise en tant que propriété des Fragmentarguments. Il sera automatiquement restauré si le fragment est détruit puis recréé par le système d'exploitation .

Exemple : -

    final Bundle args = new Bundle();
    args.putString("TAG", "my tag");
    fragment.setArguments(args);
farid_z
la source
J'ai compris ce que tu veux dire. Merci!
devhermluna
Qu'est-ce que vous obtenez?! Ce n'est pas comme ça que vous définissez un tag pour Fragment pas de loin
Farid