0

Ich habe den folgenden Code:Wie vermeidet man Fragmentierungsprobleme?

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

Der Code funktioniert gut, aber ich habe eine Sorge, würde dieser Code:

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

Ursache Duplikate, wenn ein Bildschirm neu erstellt wird oder ft.replace() wird eingesetzt?

Gibt es einen besseren Weg dazu? ohne viel Code zu ersetzen oder ohne getsupportfragmentmanager.getfragments() zu verwenden?

Danke!

Antwort

1

Ein Weg, um sicherzustellen, dass es keine Duplikate gibt, ist die Verwendung einer Karte. Man könnte diese Linie an die Spitze der Klasse

private static final String TAG = "MyFragmentClassName"; 

Dann stattdessen eine ArrayList zu verwenden, können Sie

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

und fügen Fragmente der Karte verwenden, fügen Sie mit

map.put(TAG, myWeakReferenceInstance); 

Wenn Sie Elemente hinzufügen möchten, können Sie überprüfen, ob sich bereits eine Stelle an dieser Stelle befindet, indem Sie

überprüfen

Dies sollte für Sie arbeiten, aber ich muss immer noch getSupportFragmentManager() empfehlen. All das und mehr kannst du damit machen. Zum Beispiel ist dies einige Code, den ich habe in dieser Musik App Ich habe den Aufbau:

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

Wenn Sie Doppelarbeit vermeiden wollten, könnten Sie fügen Sie einfach ein paar Zeilen:

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

Gibt es keine andere Möglichkeit, dass Duplikation nicht passieren kann? Kannst du mir meinen Code soweit möglich erläutern, wäre das einfacher zu verstehen. nicht sehr gut bei hashmap –

+0

Der einfachste Weg, den ich mir vorstellen kann, ohne einen fragmentManager zu benutzen, ist ein eindeutiges Attribut (wahrscheinlich ein String), das für jede Instanz Ihres Fragments konstant ist und für jeden Fragmenttyp unterschiedlich ist (ich rufe gerne an) mein "TAG"). Dann können Sie Ihre ArrayList durchlaufen und prüfen, ob eines Ihrer Fragmente den TAG des Fragments enthält, das Sie dort einfügen möchten, und falls ja, ersetzen Sie sie. – evanklicker

+1

Gibt es einen bestimmten Grund, warum Sie einen FragmentManager nicht verwenden können? Genau dafür sind sie konzipiert. – evanklicker