2016-06-18 41 views
0

fragmentieren I haben eine Aktivität und 3 Fragmente A, B, C wenn app beginnt es Haupt Fragment A dann von Fragment A i bin Navigation zu Fragment B hält und von Fragment B bis Fragment C. Code funktioniert und es öffnet sich Fragment C von Fragment B, aber es eröffnet erstes Fragment A und nur dann Fragment C. Warum und wie kann ich das beheben? Benötige ich eine weitere Aktivität, um die Fragmente B, C zu hosten?etwas nicht in Ordnung, wenn sie von der Navigation Fragment

Methode, die Fragmente schaltet:

private Fragment contentFragment; 
    public void switchContent(Fragment fragment, String tag){ 
     FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 
     while (fragmentManager.popBackStackImmediate()); 
     if (fragment != null){ 
      FragmentTransaction transaction = fragmentManager 
        .beginTransaction(); 
      transaction.replace(R.id.content_frame,fragment,tag); 
      if (!(fragment instanceof FragmentB)){ 
       transaction.addToBackStack(tag); 
      } 
      transaction.addToBackStack(tag); 
      transaction.commit(); 
      contentFragment = fragment; 
     } 
    } 

R.id.content_frame ist id von Layout, das auf die AktivitätsetContentView verwendet wird.

+1

Alles was Sie brauchen Fragmente schalten die FragmentTransaction ist und das Verfahren ersetzen. Also, fangen Sie vielleicht an, das Backstack-Zeug zu kommentieren und zu sehen, was passiert –

Antwort

0

Dies passiert, weil Sie alle Fragmente im Backstack löschen, bevor Sie das aktuelle Fragment durch das nächste ersetzen.

Sie diese Zeile nicht brauchen:

while (fragmentManager.popBackStackImmediate()); 

Auch dieser Teil ist sinnlos:

if (!(fragment instanceof FragmentB)){ 
    transaction.addToBackStack(tag); 
} 
transaction.addToBackStack(tag); 

weil die letzte Zeile Bedingung ignoriert.

Wenn Sie Fragmente hinzufügen Stapel außer FragmentB zu sichern, dann versuchen Sie den Code nächsten Weg zu bearbeiten:

public void switchContent(Fragment fragment, String tag) { 
    if (fragment != null) { 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.content_frame, fragment, tag); 
     if (!(fragment instanceof FragmentB)){ 
      transaction.addToBackStack(tag); 
     } 
     transaction.commit(); 
     contentFragment = fragment; 
    } 
}