Ich bin ziemlich neu in Android-Entwicklung und jetzt in seltsames Verhalten läuft.FragmentTransaction: ersetzen und addToBackStack nicht zusammenarbeiten?
- Ich habe ein leeres FrameLayout, um den Container eines Fragments zu sein.
- Wenn der Benutzer zum ersten Mal eine Taste drückt, erzeuge ein neues Fragment und lege den Behälter hinein.
- Wenn der Benutzer später eine Taste drückt und ein Fragment im Container vorhanden ist, ersetzen Sie den vorhandenen durch einen neu erzeugten.
- Wenn der Benutzer die Zurück-Taste drückt, entfernen Sie das Fragment im Container.
Hier ist mein Code
public void showFragment(View v) {
FragmentA f = new FragmentA();
FragmentManager fm = getSupportFragmentManager();
String tag = f.getFragmentTag(); // instance method of a to get a tag
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_top, 0, 0, R.anim.slide_out_top);
ft.replace(R.id.container, f, tag);
ft.addToBackStack(tag);
ft.commit();
}
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
} else {
super.onBackPressed();
}
}
Wenn der Benutzer drücken Sie die Taste zum ersten Mal, verhält es wie das, was ich erwartet hatte, neue Fragment zu Container hinzufügen. Aber wenn der Benutzer das zweite Mal die Taste drückt, während der Behälter noch ein Fragment enthält, wird anstelle eines Ersatzes ein neues hinzugefügt. Also, 2 Fragmente im Container, 2 zurück drücken, um alle Fragmente zu entfernen.
Ich fand, dass, wenn ich die Zeile entfernen
ft.addToBackStack();
und Nacharbeit der onBackPress() -Methode wie folgt, es funktioniert wieder wie ich (zu einem Zeitpunkt 1 Fragment in Behälter) erwartet
grundsätzlich manuell entfernen Fragment statt popFromBackStack Methode
private FragmentA currentFragment = null; // to hold the reference to exising fragment, if any.
@Override
public void onBackPressed() {
if (currentFragment != null) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(0, R.anim.slide_out_top);
ft.remove(currentFragment);
ft.commit();
currentFragment = null;
} else {
super.onBackPressed();
}
}
Also, meine questio n sind
- Ersetzen und AddToBackStack funktioniert nicht zusammen?
- oder habe ich etwas falsch gemacht?
Schätzen Sie alle Kommentare und Vorschläge.
Ich denke, dies ist der Grund: „Wenn Sie rufen addToBackStack nicht(), wenn Sie eine Transaktion ausführen, die ein Fragment entfernt, dann ist das Fragment zerstört wird, wenn die Transaktion festgeschrieben wird Wenn Sie beim Entfernen eines Fragments addToBackStack() aufrufen, wird das Fragment gestoppt und fortgesetzt, wenn der Benutzer zurück navigiert. " Wenn Sie addToBackStack() verwenden, werden vorherige Fragmente gestoppt und beibehalten. Siehe: https://developer.android.com/guide/components/fragments.html#Transactions –