FragmentTransaction : ersetzen und addToBackStack nicht zusammen arbeiten?
Ich bin ziemlich neu in Android development und läuft jetzt in ein komisches Verhalten.
- Ich habe eine leere FrameLayout werden die container von einem fragment.
- Wenn der Benutzer eine Taste drücken für die erste Zeit, generieren neue Fragment und setzen Sie in container.
- Wenn der Benutzer eine Taste drücken, später und es ist bestehende fragment in container, ersetzen Sie die vorhandenen mit neu erzeugten.
- Wenn Benutzer drücken Sie die zurück-Taste, pop entfernt das fragment im inneren 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 die Taste für die erste Zeit, Sie Verhalten sich wie das, was ich erwartete, neue fragment-container. Aber, das zweite mal, Benutzer drücken Sie die Taste, während der container enthält noch ein fragment, anstatt Sie zu ersetzen, so fügen neue an der Spitze des vorhandenen. So, 2 Fragmente in container, zurück 2 drücken Sie löschen, um alle fragment.
Ich festgestellt, dass wenn ich die Zeile entfernen
ft.addToBackStack();
Und Nacharbeit der onBackPress () - Methode wie folgt, funktioniert es wieder wie ich es erwartet hatte (1 fragment in container gleichzeitig)
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();
}
}
So, meine Frage sind
- ersetzen und addToBackStack ist nicht zusammen arbeiten?
- oder habe ich etwas falsch gemacht?
Schätzen alle Kommentare und Vorschläge.
- Ich denke, das ist der Grund: "Wenn Sie nicht aufrufen addToBackStack() beim durchführen einer Transaktion, die entfernt ein fragment, dann das fragment zerstört wird, wenn die Transaktion ein commit ausgeführt wird, und der Benutzer kann navigieren, um es zurück. In der Erwägung, dass, wenn Sie tun, rufen Sie addToBackStack() beim entfernen ein fragment, dann das fragment ist beendet und wird fortgesetzt, wenn der Benutzer zurück navigiert." Wenn Sie addToBackStack(), vorherigen Fragmente gestoppt und zurückgehalten. Siehe: developer.android.com/guide/components/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
addToBackstack
erstellt einen snapshot Ihrer Fragmente Zustand. Das heißt, wenn Sie die zurück-Taste drücken, Sie sind tatsächlich das zurücksetzen auf den letzten Stand, dassaddToBackstack
genannt wurde, auf.In Ihrem Fall, fügen Sie ein Fragment. Die zurück-Taste entfernen würde, dieses fragment Hinzugefügt. Beim Aufruf ersetzen, und fügen Sie backstack wieder, jetzt haben Sie zwei Staaten auf dem backstack (1. wenn Sie hatte das erste fragment Hinzugefügt, 2. wenn Sie hatte keine Fragmente Hinzugefügt). Wenn Sie die zurück-Schaltfläche entfernen Sie das aktuelle fragment, die nicht verwenden addToBackstack. Verwenden Sie nur addToBackstack, wenn Sie wollen, um die Erhaltung der Zustand der Fragmente in einer Ansicht.
Für diejenigen, die noch auf der Suche für die Lösung.
In der main -
Activity
- Klasse (die hosting-Fragmente)einfach überschreibenonBackPressed()
.Gibt es keine
onBackPressed()
Methode im fragment, und diese Methode ist nur für dieactivity
. Also,wenn wir drücken Sie die zurück-Taste, die Standard-Verhalten vonactivity
dargestellt, das istNun müssen wir diese Methode überschreiben, zu sagen, die
activity
dass wir, wenn wir drücken Sie die zurück-Taste, wenn es irgendwelche Fragmente zurück-stack, pop Sie heraus (und dies ist, wenn dieaddToBackStack()
kommt ins Bild). Ansonsten Folgen Sie den default-Verhalten.mehr details finden Sie hier hier