2013-08-19 6 views
6

ich ein replaceFragmentTransaction umkehren können, wollen von addToBackStack() mit:Klicken auf Zurück-Taste nach einem Fragment Transaktion addToBackStack mit nichts tut

FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();   
Fragment scheduleFragment = new ScheduleFragment();  
fragmentTransaction.replace(R.id.content_container, scheduleFragment, "scheduleFragment"); 
fragmentTransaction.addToBackStack("scheduleFragment"); 
fragmentTransaction.commit(); 

aber danach, klicken Sie auf die Zurück-Taste nichts tut.

Aus dem Dokument und es soll die Transaktion rückgängig machen.

Was fehlt mir?

+2

Die [doc] (http://developer.android.com/training/implementing-navigation/temporal.html) (siehe "Implement Back Navigation for Fragments") sagt, '.add' statt' .replace zu verwenden '. Überprüfen Sie die Antworten hier: http://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack aber ich denke '' replace' wird nicht vollständig unterstützt, während '.add' scheint zu arbeiten korrekt. – electrocrat

+0

@Abel Paz 'Antwort unten ist die richtige Lösung für das Problem mit '.replace' – electrocrat

Antwort

4

Versuchen fragmentTransaction.addToBackStack(null) Der Parameter für addToBackStack() ein optionaler Namen für den Back-Zustand ist, müssen Sie nicht den Tag in der replace() Methode verwenden, die nur ein optionaler Tag für das Fragment ist. Sie können mehr über diese here lesen.

+0

Ich brauche das Tag. – jul

+0

Ja, Sie können das Tag beibehalten, um auf das Fragment zu verweisen, aber funktioniert 'addToBackStack (null)'? Was passiert, wenn Sie das verwenden? –

+0

Ich habe es nicht versucht, weil es für mich keinen Sinn ergibt. Also habe ich meinen eigenen "Fragment" Stack implementiert (siehe meine Antwort). – jul

0

ich meinen eigenen Fragment Stack implementiert:

public Fragment addFragmentToStack(Fragment fragment){ 
    if(MyApplication.fragmentStack.size()>20){ 
     MyApplication.fragmentStack.remove(0); 
    } 
    return MyApplication.fragmentStack.push(fragment); 
} 

public void onBackPressed() { 
     if (MyApplication.fragmentStack.size() > 0) { 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.replace(R.id.content_container, MyApplication.fragmentStack.pop()); 
      ft.commit(); 
     } 
     else{ 
      finish(); 
     } 
} 
24

Der richtige Weg, dies zu tun ist mit onBackPressed() Verfahren, dass mit popBackStack() Ereignis in Ihrem app, und dann „Pop“ die Backstack fangen zurück. Zum Beispiel:

public void onBackPressed() 
{ 
    // Catch back action and pops from backstack 
    // (if you called previously to addToBackStack() in your transaction) 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0){ 
     getSupportFragmentManager().popBackStack(); 
    } 
    // Default action on back pressed 
    else super.onBackPressed(); 
} 

PD: Entschuldigung für die verzögerte Antwort, aber ich habe gerade Ihre Frage gesehen. Ich hoffe es hilft!

+0

Dann, warum zur Hölle, in Android-Dokumentation, sie kommuniziert den falschen Weg. :( –

+2

Ich denke nicht, dass diese Logik notwendig ist. App wird genau das gleiche funktionieren, wenn Sie 'addToBackStack' verwenden. –

+0

Im Gegensatz zu der Art, wie alle Doco auf die Verwendung dieser Konstrukte zu zeigen scheint, kann ich auch nur das funktioniert wie beabsichtigt mit dem Hinzufügen dieses Codes in 'OnBackPressed':/ – bc3tech

2

Ich war eine Weile, aber ich hoffe, das wird jemandem helfen.

fragmentTransaction.addToBackStack(null) wird nicht funktionieren, wenn Sie AppCompatActivity erweitern. Es funktioniert gut in Activity. Ich konnte den Grund nicht finden.