2012-12-04 3 views
15

Unterstützt der Back Stack die Interaktion mit verschachtelten Fragmenten in Android?Verschachtelte Fragmente und der hintere Stapel

Wenn ja, was mache ich falsch? In meiner Implementierung ignoriert die Zurück-Schaltfläche vollständig die Tatsache, dass ich diese Transaktion dem Back-Stack hinzugefügt habe. Ich hoffe, es liegt nicht an einem Problem mit verschachtelten Fragmenten und nur daran, dass ich etwas falsch mache.

Der folgende Code ist innerhalb eines meiner Fragmente und verwendet wird, ein neues Fragment zu tauschen mit verschachtelten Fragment was gerade angezeigt wird:

 MyFragment fragment = new MyFragment(); 
    FragmentTransaction ft = getChildFragmentManager().beginTransaction(); 
    ft.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_left, R.animator.slide_in_from_left, R.animator.slide_out_right); 
    ft.addToBackStack(null); 
    ft.replace(R.id.myFragmentHolder, fragment); 
    ft.commit(); 
+0

Jeder, der diese OP zu sehen nehmen ein Blick auf ein anderes, http://StackOverflow.com/Questions/13418436/android-4-2-back-Stack-behaviour-mit-Nested-fragments, die besser erklärt. – lcn

Antwort

28

ich das gleiche Problem haben, würde ich zu nisten Fragmente mögen, und einen Backstack für jedes verschachtelte Fragment zu behalten.

Aber ... es scheint, dass dieser Fall nicht von der v4-Support-Bibliothek behandelt wird. Im FragmentActivity Code in der Bibliothek, finde ich:

public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 

Die mFragments die FragmentManager der Aktivität darstellt, aber es diese Manager die Pop Kinder Manager scheint nicht „ausbreitet“. Eine Abhilfe manuell den popBackStackImmediate() auf dem Kind-Manager zu nennen, wie dies in der Aktivität geerbt von FragmentActivity würde:

private Fragment myFragmentContainer; 

    @Override 
    public void onBackPressed() { 
      if (!myFragmentContainer.getChildFragmentManager().popBackStackImmediate()) { 
       finish(); //or call the popBackStack on the container if necessary 
      } 
    } 

Es könnte sein, ein besserer Weg, und eine automatisierte Art und Weise, aber für meine Bedürfnisse es ist alles in Ordnung.

+0

Hmm, ich gebe das eine Sekunde später und akzeptiere, ob es funktioniert. – MikeS

+0

Dies scheint nicht zu funktionieren. Erstens haben Fragmente keine popBackStackImmediate() -Methode (nur FragmentManagers). Ich habe versucht, 'this.getFragmentManager(). PopBackStackImmediate()' zu ersetzen, aber im Grunde nichts anderes gesehen als das, was bereits passiert ist. – MikeS

+1

Nach der Arbeit mit dem, was Sie mir gegeben haben, habe ich die Lösung gefunden! Ich werde Ihre Antwort bearbeiten, um die Lösung zu enthalten und sie als akzeptiert markieren, wie Sie mir den größten Teil der richtigen Antwort ... – MikeS

-2
@Override 
public void onBackPressed() { 
    FragmentManager fm = getSupportFragmentManager(); 
    if (fm.getBackStackEntryCount() > 0) { 
     fm.popBackStack(); 
     return; 
    } 
    finish(); 
} 
+0

Bitte fügen Sie eine Erklärung auf Ihre Antwort hinzu. – DontVoteMeDown

4

In meinem aktuellen Projekt haben wir mehr „verschachtelte Ebene“ so dass ich mit folgenden Abhilfe habe kam nur für Backstack Top-Level-Fragment-Manager automatisch Pop:

@Override 
public void onBackPressed() { 
    SparseArray<FragmentManager> managers = new SparseArray<>(); 
    traverseManagers(getSupportFragmentManager(), managers, 0); 
    if (managers.size() > 0) { 
     managers.valueAt(managers.size() - 1).popBackStackImmediate(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

private void traverseManagers(FragmentManager manager, SparseArray<FragmentManager> managers, int intent) { 
    if (manager.getBackStackEntryCount() > 0) { 
     managers.put(intent, manager); 
    } 
    if (manager.getFragments() == null) { 
     return; 
    } 
    for (Fragment fragment : manager.getFragments()) { 
     if (fragment != null) traverseManagers(fragment.getChildFragmentManager(), managers, intent + 1); 
    } 
} 
Verwandte Themen