35 Stimmen

Android Fragment und Ansicht aus BackStack entfernen

enter image description here

Ich weiß, dass diese Frage schon einmal gestellt wurde, aber die bisherigen Antworten haben mich so weit gebracht. Das Szenario ist wie folgt: Wir haben ein Dashboard-Fragment (A), das einen Benutzer zu einem Anmeldebildschirm (B) führt. Nach erfolgreicher Anmeldung gelangen sie zu einer Listenansicht (C). Beim Zurückdrücken würde ich gerne zu A zurückkehren, da der Benutzer den Anmeldebildschirm nicht noch einmal sehen muss. Außerdem speichern wir bei erfolgreicher Anmeldung die Details in den gemeinsamen Einstellungen und automatisieren beim nächsten Mal die Anmeldung in B, was alles wie geplant funktioniert.

Ich habe die folgende FragmentHelper-Methode:

public static void goToNextFragement(Fragment fragment, int container, boolean addToBackStack, Fragment ctx)
    {
        // Create new fragment and transaction
        FragmentTransaction transaction = ctx.getSupportFragmentManager().beginTransaction();
        transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(container, fragment);

        if(addToBackStack)
            transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

In der Transaktion von B nach C habe ich den booleschen Wert addToBackStack auf false gesetzt, damit die transaction.addToBackStack(null); nicht aufgerufen wird. Dies wiederum funktioniert gut, aber nach ist, wo mein Problem beginnt.

Wenn der Benutzer wieder auf C drückt und zu A zurückkehrt, kann ich immer noch die aufgeblähte Ansicht von C unter der Ansicht von A sehen.

Für jede Hilfe wären wir dankbar. Ich hoffe, mein Diagramm hilft, dies einfach zu halten.

0voto

Yoda066 Punkte 194

Hallo, ich wollte nur eine elegante Lösung mitteilen, die ich gefunden habe.

public static void performNoBackStackTransaction(FragmentManager fragmentManager, String tag, Fragment fragment) {
final int newBackStackLength = fragmentManager.getBackStackEntryCount() +1;

fragmentManager.beginTransaction()
    .replace(R.id.content, fragment, tag)
    .addToBackStack(tag)
    .commit();

fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
  @Override
  public void onBackStackChanged() {
    int nowCount = fragmentManager.getBackStackEntryCount();
    if (newBackStackLength != nowCount) {
      // we don't really care if going back or forward. we already performed the logic here.
      fragmentManager.removeOnBackStackChangedListener(this);

      if ( newBackStackLength > nowCount ) { // user pressed back
        fragmentManager.popBackStackImmediate();
      }
    }
  }
});
}

Quelle mit erklärter Logik .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X