62 votes

Existe-t-il un moyen d'obtenir des références pour tous les fragments actuellement actifs dans une activité?

Je n'ai pas trouvé de moyen simple d'obtenir tous les fragments actuellement actifs (visibles, en état de reprise) d'une activité. Est-ce possible sans comptabilité dans mon activité? Il semble que FragmentManager ne supporte pas cette fonctionnalité.

111voto

didi_X8 Points 1728

Ressemble à l'API actuellement manque une méthode comme "getFragments".
Cependant, l'utilisation de l'événement "onAttachFragment" de l'Activité de la classe, il devrait être assez facile de faire ce que vous voulez. Je voudrais faire quelque chose comme:

List<WeakReference<Fragment>> fragList = new ArrayList<WeakReference<Fragment>>();
@Override
public void onAttachFragment (Fragment fragment) {
    fragList.add(new WeakReference(fragment));
}

public List<Fragment> getActiveFragments() {
    ArrayList<Fragment> ret = new ArrayList<Fragment>();
    for(WeakReference<Fragment> ref : fragList) {
        Fragment f = ref.get();
        if(f != null) {
            if(f.isVisible()) {
                ret.add(f);
            }
        }
    }
    return ret;
}

Dans le cas où il n'y a pas de méthode pour lire l'état de l'objet (est actif() dans l'exemple), je voudrais remplacer onResume et onPause de définir un indicateur (peut-être juste un bool champ).
C'est déjà quelque propre comptabilité, mais encore très limitée, à mon avis, compte tenu de la très spécifique de l'objectif que vous voulez atteindre (statut dépendant de la liste).

15voto

Michael Points 16659

Si vous utilisez la bibliothèque de support Android, vous pouvez appeler la méthode cachée FragmentManager.getFragments() :

 public List<Fragment> getVisibleFragments() {
    List<Fragment> allFragments = getSupportFragmentManager().getFragments();
    if (allFragments == null || allFragments.isEmpty()) {
        return Collections.emptyList();
    }

    List<Fragment> visibleFragments = new ArrayList<Fragment>();
    for (Fragment fragment : allFragments) {
        if (fragment.isVisible()) {
            visibleFragments.add(fragment);
        }
    }
    return visibleFragments;
}
 

3voto

theelfismike Points 1158

Une autre façon de procéder consiste à mettre des balises sur vos fragments lorsque vous les ajoutez à l'activité.

Par exemple, si vous ajoutez dynamiquement 4 fragments, vous pouvez les ajouter comme suit:

 for (int i = 0; i < NUM_FRAGMENTS; i++){
    MyFragment fragment = new Fragment(i);
    fragmentTransaction.add(R.id.containerId, fragment, SOME_CUSTOM_PREFIX + i).commit()
}
 

Ensuite, si vous avez besoin de récupérer tous les fragments plus tard, vous pouvez faire:

 for (int i = 0; i < NUM_FRAGMENTS; i++) {
     String tag = SOME_CUSTOM_PREFIX + i;
     fragmentList.add((MyFragment) fragmentManager.findFragmentByTag(tag));
}
 

3voto

J'ai résolu avec ceci:

 public ArrayList<Fragment> getAllFragments() {
    ArrayList<Fragment> lista = new ArrayList<Fragment>();

    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        try {
            fragment.getTag();
            lista.add(fragment);
        } catch (NullPointerException e) {

        }
    }

    return lista;

}
 

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