2017-09-15 1 views
0

In dem folgenden Stück Code, was ist der Sinn der Verwendung detach/attach Fragmente statt nur replacing sie?Attach/detach vs ersetzen Fragment

private void showFragment(String tag) { 
    String oldTag = mSelectedTag; 
    mSelectedTag = tag; 
    final FragmentManager fm = getSupportFragmentManager(); 
    final FragmentTransaction ft = fm.beginTransaction(); 
    final Fragment oldFragment = fm.findFragmentByTag(oldTag); 
    final Fragment fragment = fm.findFragmentByTag(tag); 

    if (oldFragment != null && !tag.equals(oldTag)) { 
    ft.detach(oldFragment); 
    } 

    if (fragment == null) { 
    ft.replace(R.id.container, getContentFragment(tag), tag); 
    } else { 
    if (fragment.isDetached()) { 
     ft.attach(fragment); 
    } 
    } 
    ft.commit(); 
} 

Warum kann ich nicht einfach so etwas schreiben?

private void showFragment(String tag) { 
    final FragmentManager fm = getSupportFragmentManager(); 
    final FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.container, getContentFragment(tag), tag); 
    ft.addToBackStack(null); 
    ft.commit(); 
} 

getContentFragment Methode, für alle Fälle:

private Fragment getContentFragment(String tag) { 
    Fragment fragment = null; 
    if (Frag1.TAG.equals(tag)) { 
    fragment = new Frag1(); 
    } else if (Frag2.TAG.equals(tag)) { 
    fragment = new Frag2(); 
    } 
    return fragment; 
} 
+0

meiner Meinung nach beide nicht nützlich. Okay, es hängt von Ihrem Anwendungsfall ab. Mein System ist, um Fragmente zu zeigen/zu verstecken, Sie behalten den Lebenszyklus dann am Leben! –

+1

das ist ziemlich schlecht Ansatz und Sie verschwenden einfach Ressourcen –

+0

@Marcin Orlowski Sie meine schlechte Ansatz ist zu zeigen/zu verbergen, immer zu ersetzen, oder die attach/detach/ersetzen? – FelisManulus

Antwort

2

Hier ist die Dokumentation für FragmentTransaction.detach() (Hervorhebung hinzugefügt):

Detach das gegebene Fragment aus der Benutzeroberfläche. Dies ist derselbe Status wie beim Zurücksetzen auf den Backstack: Das Fragment wird aus der Benutzeroberfläche entfernt, jedoch wird sein Status weiterhin aktiv vom Fragmentmanager verwaltet. Wenn man in diesen Zustand geht, wird seine Ansichtshierarchie zerstört.

So ein abgelöst Fragment ist immer noch "lebendig" in den FragmentManager; seine Sicht wurde zerstört, aber sein logischer Zustand bleibt erhalten. Wenn Sie also attach() anrufen, erhalten Sie das gleiche Fragment zurück.

FragmentTransaction.replace(), die Übergabe eines new-Fragments führt jedoch dazu, dass Sie zwei verschiedene Instanzen derselben Fragmentklasse verwenden, anstatt eine einzelne Instanz erneut zu verwenden.

Ich persönlich hatte nie eine Notwendigkeit, detach() und attach() zu verwenden, und habe immer replace() verwendet. Aber das bedeutet nicht, dass es keinen Ort und keine Zeit gibt, an denen sie nützlich sein könnten.

+0

Es geht also darum, Ressourcen zu sparen, indem dieselbe Instanz des Fragments wiederverwendet wird. – FelisManulus

+0

Ich denke nicht, dass es der richtige Weg ist, um es zu betrachten. Es ist eher so, als könnten Sie Informationen innerhalb des Fragments selbst speichern (mit 'onSaveInstanceState()' usw.), anstatt diese Informationen zu verlieren, indem Sie eine neue Instanz erstellen. –

Verwandte Themen