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?

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é.


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(); 

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


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();

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");
        }
    }
}

-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);

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);

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.