web-dev-qa-db-de.com

wie gehe ich zum vorherigen Fragment zurück, wenn Sie die Taste des einzelnen Fragments manuell drücken?

Ich habe nur eine activity und mehrere fragments in meiner Anwendung.

Zwei Hauptfragment A(left) und B (rechts).

Fragment A1 called from A

B1 called from B

B2 called from B1

Alle fragments haben individuelle Rückentasten.

Wenn ich also die back-Taste von fragmentA1 drücke, sollte sie auf A zurückgehen. Ähnlich, wenn die Back-Taste von B2 gedrückt wird, erscheint B1 und von B1 bis B und so weiter.

Wie implementiere ich diese Art von Funktionalität?

24
Mihir Shah
public void onBackPressed()
{
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack();
}
31
Manitoba

Ich habe gerade das ähnliche Szenario implementiert. 

Aktivität 'A' -> Ruft ein Fragment 'A1' auf. Wenn Sie auf den Menüpunkt klicken, wird das Fragment 'A2' aufgerufen. Wenn der Benutzer die Taste "A2" drückt, wird der Wert auf "A1" zurückgesetzt, und der Benutzer drückt danach von 'A1' zurück, beendet er die Aktivität 'A' und kehrt zurück.

Siehe den folgenden Code:

Activity 'A' - OnCreate () - Methode:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activityA);

    if (savedInstanceState == null) {
        Fragment fragInstance;

        //Calling the Fragment newInstance Static method
        fragInstance = FragmentA1.newInstance();

        getFragmentManager().beginTransaction()
                .add(R.id.container, fragInstance)
                .commit();
    }
}

Fragment: 'A1'

Ich ersetze das vorhandene Fragment durch das neue Fragment, wenn die Klickaktion des Menüelements ausgeführt wird:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_edit_columns) {
        //Open the Fragment A2 and add this to backstack
        Fragment fragment = FragmentA2.newInstance();
        this.getFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .addToBackStack(null)
                .commit();

        return true;
    }
    return super.onOptionsItemSelected(item);
}

Activity 'A' - onBackPressed () - Methode:

Da alle Fragmente über eine übergeordnete Aktivität verfügen (was 'A' ist), können Sie mit der Methode 'onBackPressed ()' Fragmente platzieren, wenn welche vorhanden sind, oder einfach zur vorherigen Aktivität zurückkehren.

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
    else {
        getFragmentManager().popBackStack();
    }
}

Wenn Sie nach Fragmenten von Fragmenten in Fragmenten suchen, verwenden Sie bitte den Link: http://developer.Android.com/about/versions/Android-4.2.html#NestedFragments

23
TrueBlue

Die Antwort von @ trueblue brachte mich mit einem kleineren, aber nervenden Thema in Fahrt. Wenn sich nur ein Fragment im Backstack befindet und Sie die Zurück-Taste drücken, wird dieser Frame entfernt und die App bleibt mit leerem Bildschirm aktiv. Der Benutzer musste noch einmal die Zurück-Taste drücken, um die App zu beenden. Ich habe den ursprünglichen Code folgendermaßen geändert, um diese Situation zu bewältigen

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
    else if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        getFragmentManager().popBackStack();
    }
}

Wenn sich nur ein Fragment im Backstack befindet, empfehlen wir Android, die gesamte App in den Hintergrund zu verschieben. 

Update (und wahrscheinlich eine bessere Antwort)

Nachdem ich nun etwas mehr darüber gelesen hatte, fand ich heraus, dass Sie Fragment-Manager-Transaktionen zum Back-Stack hinzufügen können und dann Android-Befehle automatisch und in der gewünschten Weise erledigt. Das folgende Codefragment zeigt, wie das geht

Fragment fragment; //Create and instance of your fragment class here
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(null);

Die letzte Zeile zeigt, wie Sie eine Transaktion zum Back-Stack hinzufügen. In den meisten Situationen, außer in einer, wird das Problem der Backpresse für Fragmente gelöst. Wenn Sie die Zurück-Taste erneut drücken, erreichen Sie schließlich einen Punkt, an dem sich nur ein Fragment im hinteren Stapel befindet. An diesem Punkt möchten Sie eines der beiden Dinge tun

  1. Entfernen Sie die Aktivität, die das Fragment enthält, aus dem hinteren Stapel der Aufgabe, in der die Aktivität ausgeführt wird. Dies liegt daran, dass Sie nicht mit einer leeren Aktivität enden möchten
  2. Wenn die Aktivität die einzige Aktivität im hinteren Stapel der Task ist, drücken Sie die Task im Hintergrund. 

In meinem Fall war es der spätere, also habe ich die überschriebene onBackPressed-Methode von meiner vorherigen Antwort so geändert, dass sie wie folgt aussieht

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        super.onBackPressed();
    }
}

Dieser Code ist einfacher, da er weniger Logik aufweist und auf Frameworks als auf unseren benutzerdefinierten Code basiert. Leider ist es mir nicht gelungen, Code für die erste Situation zu implementieren, da ich dies nicht musste.

13
Suhas

Mach einfach

getActivity().getFragmentManager().popBackStack();
4
user4853635

Sie müssen Ihre eigene Backstack-Implementierung wie hier beschrieben implementieren.

Sie können popFragments() aufrufen, wenn Sie in einem Fragment auf die Zurück-Schaltfläche klicken, und pushFragments() aufrufen, wenn Sie von einem Fragment zu einem anderen navigieren.

4
TNR

Versuchen Sie es mit seiner Arbeit für mich.

public void onBackPressed() {
    if (mainLayout.isMenuShown()) {
        mainLayout.toggleMenu();
    } else {
        FragmentManager fm = getSupportFragmentManager();
        Log.print("back stack entry", fm.getBackStackEntryCount() + "");

        if (fm.getBackStackEntryCount() > 1) {
            fm.popBackStack();
            // super.onBackPressed();
            // return;
        } else {
            if (doubleBackToExitPressedOnce) {
                fm.popBackStack();
                super.onBackPressed();
                return;
            }

            this.doubleBackToExitPressedOnce = true;
            Toast.makeText(this, "Press one more time to exit",
                    Toast.LENGTH_SHORT).show();

            new Handler().postDelayed(new Runnable() {

                @Override
                public void run() {

                    doubleBackToExitPressedOnce = false;
                }
            }, 3000);

        }
    }
}
1
Shreyans Patel

Die Schaltfläche "Zurück" wird in der Reihenfolge durchlaufen, in der die Fragmente zum Backstack hinzugefügt wurden. Diese wird standardmäßig als Navigationsfunktion bereitgestellt. Wenn Sie nun zu einem bestimmten Fragment gehen möchten, können Sie zeigen aus dem Backstack.

0
S.D.

Sie können damit umgehen, indem Sie ein Tag in der Variablen backStack hinzufügen. Überprüfen Sie meine Antwort hier: 

https://stackoverflow.com/a/19477957/1572408

ich hoffe es hilft 

0
Rudi