0

je le code suivant:Comment éviter les problèmes de duplication de fragments?

private List<WeakReference<Fragment>> mFragList = new ArrayList<WeakReference<Fragment>>(); 

@Override 
public void onAttachFragment (Fragment fragment) { 
    mFragList.add(new WeakReference(fragment)); 
} 

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

public Fragment findFragement(String tClass) { 

    List<Fragment> fragments = getActiveFragments(); 
    for (Fragment fragment : fragments) { 
     if (tClass.equalsIgnoreCase("Home")) { 
      if (fragment instanceof ToggleFragment) { 
       return fragment; 

      } 
     } else if (tClass.equalsIgnoreCase("Contacts")) { 
      if (fragment instanceof ContactFragment) { 
       return fragment; 
      } 
     } 
    } 
    return null; 
} 

Le code fonctionne très bien, mais je crains, pas ce code:

@Override 
public void onAttachFragment (Fragment fragment) { 
    mFragList.add(new WeakReference(fragment)); 
} 

doublons de cause lorsqu'un écran est recréée ou ft.replace() est utilisé?

Y a-t-il un meilleur moyen de contourner ce problème? sans remplacer beaucoup de code ou sans utiliser getsupportfragmentmanager.getfragments()?

Merci!

Répondre

1

Une façon de garantir qu'il n'y a pas de doublons est d'utiliser une carte. Vous pouvez ajouter cette ligne au-dessus de votre classe

private static final String TAG = "MyFragmentClassName"; 

Ensuite, au lieu d'utiliser un ArrayList, vous pouvez utiliser

Map<String, WeakReference<Fragment>> fragmentMap = new HashMap<>(); 

et ajouter des fragments à la carte avec

map.put(TAG, myWeakReferenceInstance); 

Lorsque vous voulez ajouter des articles, vous pouvez vérifier si quelque chose est déjà dans cet endroit en vérifiant

if (map.get(TAG) != null) { 
    //do something 
} 

Cela devrait fonctionner pour vous, mais je dois toujours recommander d'utiliser getSupportFragmentManager(). Vous pouvez faire tout cela et plus avec cela. Par exemple, voici un code que je l'ai utilisé dans cette application musicale que j'ai construit:

private void showAlbumListFragment() { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    albumListFragment = new AlbumListFragment(); 
    fragmentManager.beginTransaction() 
      .replace(R.id.fragment_container, albumListFragment, AlbumListFragment.TAG) 
      .commit(); 
} 

Si vous voulez éviter les doubles emplois, vous pouvez simplement ajouter quelques lignes:

private void showAlbumListFragment() { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    albumListFragment = (AlbumListFragment) fragmentManager.findFragmentByTag(AlbumListFragment.TAG); 
    if (albumListFragment == null) { 
     albumListFragment = new AlbumListFragment(); 
    } 
    fragmentManager.beginTransaction() 
      .replace(R.id.fragment_container, albumListFragment, AlbumListFragment.TAG) 
      .commit(); 
    } 
+0

n'y a-t-il pas d'autre moyen que je peux assurer que la duplication ne se produise pas? pouvez-vous expliquer en ce qui concerne mon code si possible, serait plus facile à comprendre. pas très bon à hashmap –

+0

La manière la plus simple que je puisse penser sans utiliser un fragmentManager est de faire un attribut unique (probablement une chaîne) qui est constant pour chaque instance de votre fragment, et différent pour chaque type de fragment (j'aime appeler le mien "TAG"). Ensuite, vous pouvez parcourir votre ArrayList et vérifier si l'un de vos fragments possède le TAG du fragment que vous essayez d'y placer, et si c'est le cas, remplacez-les. – evanklicker

+1

Y at-il une raison particulière pour laquelle vous ne pouvez pas utiliser un fragmentManager? C'est exactement ce qu'ils sont conçus pour gérer. – evanklicker