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 dusuper.onBackPressed()
aufrufst. - Unter Android 12 (API-Level 32) und niedriger wird
onBackPressed
immer aufgerufen, unabhängig von registrierten Instanzen vonOnBackPressedCallback
.