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é.
Réponses
Trop de publicités?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).
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;
}
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));
}