Benutzerdefinierte Zurück-Navigation bereitstellen

Die Zurück-Navigation ist die Art und Weise, wie sich Nutzer durch den Verlauf von Bildschirmen rückwärts navigieren, die sie zuvor besucht haben. Bei allen Android-Geräten gibt es für diese Art der Navigation eine Zurück-Schaltfläche. Fügen Sie also keine Zurück-Schaltfläche zur App-Benutzeroberfläche hinzu. Je nach Android-Gerät des Nutzers kann diese Taste eine physische Taste oder eine Softwaretaste sein.

Android verwaltet einen Back-Stack aus Zielen, während der Nutzer durch deine App navigiert. So kann Android korrekt zu vorherigen Zielen navigieren, wenn die Schaltfläche „Zurück“ gedrückt wird. Es gibt jedoch einige Fälle, in denen Ihre App ihr eigenes „Back“-Verhalten implementieren muss, um die bestmögliche Nutzererfahrung zu bieten.

Wenn Sie beispielsweise ein WebView verwenden, können Sie das Standardverhalten der Schaltfläche „Zurück“ überschreiben, damit der Nutzer anstatt zu den vorherigen Bildschirmen in Ihrer App durch seinen Browserverlauf zurückspringen kann.

Android 13 und höher bietet auf Android-Geräten eine vorausschauende Touch-Geste „Zurück“. Weitere Informationen zu dieser Funktion finden Sie unter Unterstützung für die vorausschauende „Zurück“-Touch-Geste hinzufügen.

Benutzerdefinierte Rückwärtsnavigation implementieren

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

Mit OnBackPressedDispatcher wird festgelegt, wie Ereignisse für die Schaltfläche „Zurück“ an ein oder mehrere OnBackPressedCallback-Objekte gesendet werden. Der Konstruktor für OnBackPressedCallback verwendet einen booleschen Wert für den anfänglichen aktivierten Status. Wenn ein Callback aktiviert ist – isEnabled() also true zurückgibt – ruft der Disponent den handleOnBackPressed() des Callbacks auf, um das Ereignis für die Schaltfläche „Zurück“ zu verarbeiten. Sie können den aktivierten Status durch Aufrufen von setEnabled() ändern.

Callbacks werden mit den addCallback-Methoden hinzugefügt. Wir empfehlen die Verwendung der Methode addCallback(), für die ein LifecycleOwner erforderlich ist. Dadurch wird sichergestellt, dass OnBackPressedCallback nur dann hinzugefügt wird, wenn LifecycleOwner gleich Lifecycle.State.STARTED ist. Durch die Aktivität werden auch registrierte Callbacks entfernt, wenn der zugehörige LifecycleOwner gelöscht wird. Dadurch werden Speicherlecks verhindert und LifecycleOwner für die Verwendung in Fragmenten oder anderen Lebenszyklusinhabern mit einer kürzeren Lebensdauer als die Aktivität geeignet.

Hier ist ein Beispiel für eine Callback-Implementierung:

Kotlin

class MyFragment : Fragment() {

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

        // This callback is only 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 is only 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()
    }
    ...
}

Mit addCallback() kannst du mehrere Callbacks angeben. In diesem Fall werden die Callbacks in umgekehrter Reihenfolge von der Reihenfolge, in der Sie sie hinzufügen, aufgerufen. Der zuletzt hinzugefügte Callback ist die erste mit der Möglichkeit, das Ereignis für die Zurück-Schaltfläche zu verarbeiten. Wenn Sie beispielsweise drei Callbacks mit den Namen one, two und three in dieser Reihenfolge hinzufügen, werden sie in der Reihenfolge three, two, one aufgerufen.

Callbacks folgen dem Muster der Chain of Responsibility. Jeder Callback in der Kette wird nur aufgerufen, wenn der vorherige Callback nicht aktiviert war. Das bedeutet, dass im vorherigen Beispiel der Callback two nur dann aufgerufen wird, wenn der Callback three nicht aktiviert ist, und der Callback one nur dann, wenn der Callback two nicht aktiviert ist.

Wenn der Callback mit addCallback() hinzugefügt wird, wird er erst dann der Verantwortungskette hinzugefügt, wenn LifecycleOwner den Status Lifecycle.State.STARTED erhält.

Wir empfehlen, den aktivierten Status für OnBackPressedCallback für temporäre Änderungen zu ändern, um so die oben beschriebene Reihenfolge beizubehalten. Das ist besonders wichtig, wenn Sie Callbacks für mehrere verschachtelte Lebenszyklusinhaber registriert haben.

Wenn Sie das OnBackPressedCallback vollständig entfernen möchten, können Sie remove() aufrufen. Dies ist in der Regel nicht erforderlich, da Callbacks automatisch entfernt werden, wenn die zugehörige LifecycleOwner gelöscht wird.

Aktivität onBackPressed()

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

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