Benutzerdefinierte Zurück-Navigation bereitstellen

Die Zurücknavigation ist die Art und Weise, wie Nutzer im Verlauf der Bildschirme rückwärts navigieren, besucht haben. Alle Android-Geräte verfügen über eine Zurück-Schaltfläche für diese Art von Navigationsbereich. Daher sollten Sie der Benutzeroberfläche Ihrer App keine Zurück-Schaltfläche hinzufügen. Je nach das Android-Gerät des Nutzers ist, kann es sich bei dieser Schaltfläche um eine physische Taste oder eine Software- Schaltfläche.

Android pflegt einen Back-Stack von Zielen, während der Nutzer navigiert. in Ihrer gesamten Anwendung. So kann Android in der Regel zu vorherigen Zielen, wenn Sie die Taste „Zurück“ drücken. Es gibt jedoch einige in denen Ihre App ein eigenes Back-Verhalten implementieren muss, die bestmögliche Nutzererfahrung zu bieten. Wenn Sie beispielsweise WebView verwenden, können Sie das Standardverhalten der Schaltfläche "Zurück" überschreiben, damit der Nutzer durch den Browserverlauf und nicht die vorherigen Bildschirme zurückkehren, in Ihrer App.

Benutzerdefinierte Zurück-Navigation implementieren

ComponentActivity, die Basis Kurs für FragmentActivity und AppCompatActivity, können Sie das Verhalten der Zurück-Schaltfläche mithilfe der OnBackPressedDispatcher die Sie durch Aufrufen von getOnBackPressedDispatcher() abrufen können.

Mit OnBackPressedDispatcher wird gesteuert, wie Ereignisse der Schaltfläche „Zurück“ gesendet werden auf ein oder mehrere OnBackPressedCallback Objekte. Der Konstruktor für OnBackPressedCallback verwendet einen booleschen Wert für die anfänglich aktiviert. Nur wenn ein Callback aktiviert ist (d.h. isEnabled() gibt true zurück) ruft der Disponent die handleOnBackPressed() um das Ereignis der Zurück-Schaltfläche zu verarbeiten. Sie können den Aktivierungsstatus ändern, indem Sie folgenden Befehl aufrufen: setEnabled()

Callbacks werden über die addCallback-Methoden hinzugefügt. Es wird dringend empfohlen, addCallback() verwenden für die ein LifecycleOwner-Zeichen verwendet wird. Dadurch wird OnBackPressedCallback nur hinzugefügt, wenn das LifecycleOwner Lifecycle.State.STARTED Durch die Aktivität werden auch registrierte Callbacks entfernt, wenn ihre zugehörigen LifecycleOwner wird gelöscht, wodurch Speicherlecks verhindert werden und die Anwendung geeignet ist. zur Verwendung in Fragmenten oder anderen Inhabern des Lebenszyklus mit kürzerer Lebensdauer als die Aktivität.

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 mehrere Callbacks über addCallback() bereitstellen. Dabei werden die Callbacks in umgekehrter Reihenfolge aufgerufen. hinzugefügt – der zuletzt hinzugefügte Callback ist der erste, der die Möglichkeit hat, den Ereignis zur Schaltfläche „Zurück“ Wenn Sie z. B. drei Callbacks mit dem Namen one, two und three der Reihe nach werden sie in der Reihenfolge three, two und one.

Callbacks folgen dem Verantwortungskette Muster zu ändern. Jeder Callback in der Kette wird nur aufgerufen, wenn die vorherige Callback war nicht aktiviert. Das bedeutet, dass in der Beispiel: Der Callback two wird nur aufgerufen, wenn der Callback three war nicht aktiviert. Der Rückruf one wird nur aufgerufen, wenn der Rückruf two nicht aktiviert war usw.

Beim Hinzufügen über addCallback() wird der Callback erst dann der Verantwortlichkeitskette hinzugefügt, wenn das Ereignis LifecycleOwner nimmt am Lifecycle.State.STARTED Bundesstaat.

Änderung des Aktivierungsstatus für OnBackPressedCallback wird dringend empfohlen für temporäre Änderungen empfohlen, da die oben beschriebene Reihenfolge beibehalten wird, Dies ist besonders wichtig, wenn Callbacks auf mehreren Inhaber unterschiedlicher Inhaber von verschachtelten Lebenszyklen nutzen.

Wenn Sie die OnBackPressedCallback vollständig entfernen möchten, solltest du anrufen remove() Das ist jedoch normalerweise nicht erforderlich, da Callbacks automatisch entfernt werden, wenn ihr verknüpftes LifecycleOwner gelöscht.

Aktivität onBackPressed()

Wenn Sie onBackPressed() zur Verarbeitung von Ereignissen der Schaltfläche „Zurück“ verwenden, OnBackPressedCallback. Falls Sie diese Änderung nicht vornehmen können, gelten folgende Regeln:

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