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/...
InformationsquelleAutor Tar_Tw45 | 2013-12-19
Schreibe einen Kommentar