631 Stimmen

Wie implementiert man onBackPressed() in Fragments?

Gibt es eine Möglichkeit, wie wir die onBackPressed() in Android Fragment ähnlich wie in Android Activity implementieren?

Da der Fragment-Lebenszyklus nicht über onBackPressed() . Gibt es eine andere alternative Methode zur Überwindung onBackPressed() in Android 3.0-Fragmenten?

67voto

HaMMeReD Punkte 2430

Wenn Sie diese Art von Funktionalität wünschen, müssen Sie sie in Ihrer Aktivität außer Kraft setzen und dann eine YourBackPressed Schnittstelle für alle Ihre Fragmente, die Sie auf dem entsprechenden Fragment aufrufen, sobald die Zurück-Taste gedrückt wird.

Edit: Ich möchte meine vorherige Antwort ergänzen.

Wenn ich das heute machen würde, würde ich einen Broadcast verwenden, oder möglicherweise einen geordneten Broadcast, wenn ich erwarte, dass andere Panels im Einklang mit dem Master/Hauptinhaltspanel aktualisiert werden.

LocalBroadcastManager in der Support-Bibliothek kann dabei helfen, und Sie senden die Sendung einfach in onBackPressed und abonnieren Sie in Ihren Fragmenten, die Sie interessieren. Ich denke, dass Messaging ist eine entkoppelte Implementierung und würde besser skalieren, so dass es meine offizielle Implementierung Empfehlung jetzt sein würde. Verwenden Sie einfach die Intent Aktion als Filter für Ihre Nachricht. Senden Sie Ihre neu erstellte ACTION_BACK_PRESSED senden Sie es aus Ihrer Aktivität heraus und hören Sie es in den entsprechenden Fragmenten ab.

56voto

Sterling Diaz Punkte 3548

Nichts davon ist einfach zu realisieren und wird optimal funktionieren.

Fragmente haben einen Methodenaufruf onDetach, der diese Aufgabe übernimmt.

@Override
    public void onDetach() {
        super.onDetach();
        PUT YOUR CODE HERE
    }

DIES WIRD DIE AUFGABE ERFÜLLEN.

56voto

Amjad Alwareh Punkte 2598

Google hat eine neue API veröffentlicht, die sich mit onBackPressed in Fragment :

activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {

            }
        })

34voto

Sanjay Joshi Punkte 1857

Neuer und besserer Ansatz: Folgendes Codestück in einer Fragment wird Ihnen helfen, das Backpress-Ereignis zu erfassen.

JAVA

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);

    OnBackPressedCallback callback = new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            Toast.makeText(mContext, "back pressed", Toast.LENGTH_SHORT).show();

            // And when you want to go back based on your condition
            if (yourCondition) {
                this.setEnabled(false);
                requireActivity().onBackPressed();
            }
        }
    };

    requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
}

Kotlin

activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {

    }
})

31voto

Rudi Punkte 4290

Einfach hinzufügen addToBackStack während des Übergangs zwischen den Fragmenten wie unten dargestellt:

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

wenn Sie schreiben addToBackStack(null) wird es selbständig verarbeitet, aber wenn Sie ein Tag angeben, sollten Sie es manuell verarbeiten.

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