Benutzerdefinierte Zurück-Navigation bereitstellen

Nutzer können mithilfe der Zurück-Navigation durch die Bildschirme blättern. Die meisten Android-Geräte haben eine Rückwärtstaste – physisch, softwarebasiert oder gestenbasiert. Normalerweise sollten Sie Ihrer App keine Schaltfläche „Zurück“ hinzufügen. Auf Android Automotive OS-Geräten (AAOS) im Kompatibilitätsmodus wird jedoch eine systemeigene Schaltfläche „Zurück“ verwendet. Die Navigation wird dadurch übernommen, sodass Sie keine eigene hinzufügen müssen. Weitere Informationen finden Sie unter AAOS-Kompatibilitätsmodus.

Android verwaltet einen Backstack mit Zielen, während sich der Nutzer in Ihrer App bewegt. So kann Android normalerweise beim Drücken der Schaltfläche „Zurück“ ordnungsgemäß zu vorherigen Zielen wechseln. Es gibt jedoch einige Fälle, in denen Ihre App ein eigenes Zurück-Verhalten implementieren muss, um die bestmögliche Nutzerfreundlichkeit zu bieten. Wenn Sie beispielsweise eine WebView verwenden, können Sie das Standardverhalten der Schaltfläche „Zurück“ überschreiben, damit Nutzer durch ihren Webbrowserverlauf zurückgehen können, anstatt zu den vorherigen Bildschirmen in Ihrer App zurückzukehren.

Benutzerdefinierte Rückwärtsnavigation implementieren

Mit ComponentActivity, der Basisklasse für FragmentActivity und AppCompatActivity, können Sie das Verhalten der Schaltfläche „Zurück“ über OnBackPressedDispatcher steuern. Sie können OnBackPressedDispatcher durch Aufrufen von getOnBackPressedDispatcher() abrufen.

Mit OnBackPressedDispatcher wird gesteuert, wie Ereignisse der Zurück-Schaltfläche an ein oder mehrere OnBackPressedCallback-Objekte gesendet werden. Der Konstruktor für OnBackPressedCallback nimmt einen booleschen Wert für den ursprünglichen Aktivierungsstatus an. Nur wenn ein Rückruf aktiviert ist (d.h. isEnabled() zurückgibt, ruft der Dispatcher handleOnBackPressed() des Callbacks auf, um das Ereignis „Zurück-Schaltfläche“ zu verarbeiten.true Sie können den aktivierten Status ändern, indem Sie setEnabled() aufrufen.

Callbacks werden über die addCallback-Methoden hinzugefügt. Wir empfehlen dringend, die Methode addCallback() zu verwenden, die einen LifecycleOwner annimmt. So wird sichergestellt, dass OnBackPressedCallback nur hinzugefügt wird, wenn LifecycleOwner Lifecycle.State.STARTED ist. Die Aktivität entfernt auch registrierte Rückrufe, wenn die zugehörige LifecycleOwner zerstört wird. Dadurch werden Speicherlecks verhindert und die Aktivität eignet sich für die Verwendung in Fragmenten oder anderen Lebenszykluseigentümern, die eine kürzere Lebensdauer als die Aktivität haben.

Hier ein Beispiel für eine Rückrufimplementierung:

Kotlin

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback will only be called when MyFragment is at least Started.
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

Java

public class MyFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This callback will only be called when MyFragment is at least Started.
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

Über addCallback() kannst du mehrere Rückrufe angeben. Dabei werden die Rückruffunktionen in umgekehrter Reihenfolge aufgerufen, in der sie hinzugefügt wurden. Der zuletzt hinzugefügte Rückruf wird zuerst aufgerufen, um das Ereignis „Zurück-Schaltfläche“ zu verarbeiten. Wenn Sie beispielsweise drei Rückrufe mit den Namen one, two und three hinzufügen, werden sie in der Reihenfolge three, two und one aufgerufen.

Callbacks folgen dem Muster der Verantwortungskette. Jeder Rückruf in der Kette wird nur aufgerufen, wenn der vorherige Rückruf nicht aktiviert war. Im vorherigen Beispiel würde also der Callback two nur aufgerufen, wenn der Callback three nicht aktiviert ist. Callback one wird nur aufgerufen, wenn Callback two nicht aktiviert ist, und so weiter.

Hinweis: Wenn der Rückruf über addCallback() hinzugefügt wird, wird er der Aufrufabfolge erst hinzugefügt, wenn LifecycleOwner den Status Lifecycle.State.STARTED eintritt.

Wir empfehlen dringend, den aktivierten Status in OnBackPressedCallback für temporäre Änderungen zu ändern, da dadurch die oben beschriebene Reihenfolge beibehalten wird. Das ist besonders wichtig, wenn Sie Callbacks für mehrere verschachtelte Lebenszykluseigentümer registriert haben.

Wenn Sie die OnBackPressedCallback jedoch vollständig entfernen möchten, sollten Sie remove() aufrufen. Das ist jedoch in der Regel nicht erforderlich, da Callbacks automatisch entfernt werden, wenn die zugehörige LifecycleOwner zerstört wird.

Aktivität „onBackPressed()“

Wenn Sie onBackPressed() verwenden, um Ereignisse für die Schaltfläche „Zurück“ zu verarbeiten, empfehlen wir stattdessen die Verwendung von OnBackPressedCallback. Wenn Sie diese Änderung jedoch nicht vornehmen können, gelten die folgenden Regeln:

  • Alle über addCallback registrierten Rückrufe werden ausgewertet, wenn du super.onBackPressed() aufrufst.
  • Unter Android 12 (API-Level 32) und niedriger wird onBackPressed immer aufgerufen, unabhängig von registrierten Instanzen von OnBackPressedCallback.