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. Da alle Android-Geräte für diese Art der Navigation eine Zurück-Schaltfläche haben, sollten Sie der Benutzeroberfläche Ihrer App keine Zurück-Schaltfläche hinzufügen. 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 in der Regel 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 Verhalten „Back“ 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 durch seinen Browserverlauf zurückkehren kann, anstatt zu den vorherigen Bildschirmen in Ihrer App.

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. Nur wenn ein Callback aktiviert ist (z.B. isEnabled() gibt true zurück) ruft der Disponent die handleOnBackPressed() des Callbacks auf, um das Ereignis der Schaltfläche „Zurück“ zu verarbeiten. Sie können den aktivierten Status durch Aufrufen von setEnabled() ändern.

Callbacks werden mithilfe der addCallback-Methoden hinzugefügt. Es wird dringend empfohlen, die Methode addCallback() zu verwenden, die ein LifecycleOwner-Element verwendet. Dadurch wird sichergestellt, dass OnBackPressedCallback nur dann hinzugefügt wird, wenn LifecycleOwner gleich Lifecycle.State.STARTED ist. Die Aktivität entfernt auch registrierte Callbacks, wenn die zugehörige LifecycleOwner gelöscht wird. Dadurch werden Speicherlecks vermieden und die Aktivität eignet sich zur Verwendung in Fragmenten oder anderen Lebenszyklusinhabern, die eine kürzere Lebensdauer als die Aktivität haben.

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

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()
    }
    ...
}

Du kannst über addCallback() mehrere Callbacks angeben. Dabei werden die Callbacks in umgekehrter Reihenfolge aufgerufen, in der sie hinzugefügt werden. Der zuletzt hinzugefügte Callback ist die erste mit der Möglichkeit, das Ereignis der Zurück-Schaltfläche zu verarbeiten. Wenn Sie beispielsweise drei Callbacks mit den Namen one, two und three der Reihe nach hinzufügen, werden sie in der Reihenfolge three, two bzw. 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 der Callback two im vorherigen Beispiel nur dann aufgerufen wird, wenn der Callback three nicht aktiviert ist. Der Callback one wird nur aufgerufen, wenn der Callback two nicht aktiviert ist, usw.

Beim Hinzufügen über addCallback() wird der Callback erst dann der Verantwortungskette hinzugefügt, wenn LifecycleOwner in den Status Lifecycle.State.STARTED wechselt.

Das Ändern des aktivierten Status für das OnBackPressedCallback wird für temporäre Änderungen dringend empfohlen, da dabei die oben beschriebene Reihenfolge beibehalten wird. Dies ist besonders wichtig, wenn Sie Callbacks für mehrere verschiedene verschachtelte Lebenszyklusinhaber registriert haben.

Wenn Sie das OnBackPressedCallback jedoch vollständig entfernen möchten, sollten Sie remove() aufrufen. Dies ist jedoch 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.