Użytkownicy mogą przechodzić do poprzednich ekranów za pomocą nawigacji wstecz. Większość urządzeń z Androidem ma przycisk Wstecz – fizyczny, oprogramowania lub gestów. Zazwyczaj nie musisz dodawać do aplikacji przycisku Wstecz. Jednak urządzenia z systemem operacyjnym Android Automotive (AAOS) w trybie zgodności korzystają z systemowego przycisku Wstecz. Obsługuje on nawigację, więc nie musisz dodawać własnej. Więcej informacji znajdziesz w artykule Tryb zgodności AAOS.
Android zachowuje strefę wstecz, która zawiera strony, po których użytkownik się porusza w aplikacji. Zwykle pozwala to Androidowi na prawidłowe przekierowywanie do poprzednich miejsc docelowych po naciśnięciu przycisku Wstecz. Są jednak sytuacje, w których aplikacja może wymagać wdrożenia własnego zachowania przycisków Wstecz, aby zapewnić użytkownikom jak najlepsze wrażenia. Na przykład podczas korzystania z WebView
możesz zmienić domyślne działanie przycisku Wstecz, aby umożliwić użytkownikowi powrót do historii przeglądania zamiast do poprzednich ekranów w aplikacji.
Wdrażanie niestandardowej nawigacji wstecz
ComponentActivity
, podstawowa klasa dla FragmentActivity
i AppCompatActivity
, umożliwia kontrolowanie działania przycisku Wstecz za pomocą jego OnBackPressedDispatcher
, który możesz pobrać, wywołując getOnBackPressedDispatcher()
.
OnBackPressedDispatcher
określa sposób wysyłania zdarzeń przycisku Wstecz do co najmniej 1 obiektu OnBackPressedCallback
. Konstruktor klasy OnBackPressedCallback
przyjmuje wartość logiczną odpowiadającą początkowemu stanowi włączenia. Tylko wtedy, gdy jest włączone wywołanie zwrotne (czyli
isEnabled()
zwraca true
) wywoła wywołanie zwrotne handleOnBackPressed()
, aby obsłużyć zdarzenie przycisku Wstecz. Możesz zmienić stan włączenia, wywołując funkcję setEnabled()
.
Powroty są dodawane za pomocą metod addCallback
. Zdecydowanie zalecamy użycie metody addCallback()
, która przyjmuje argument LifecycleOwner
.
Dzięki temu element OnBackPressedCallback
jest dodawany tylko wtedy, gdy element LifecycleOwner
ma wartość Lifecycle.State.STARTED
.
Aktywność usuwa też zarejestrowane wywołania zwrotne po usunięciu powiązanego z nimi elementu LifecycleOwner
, co zapobiega wyciekom pamięci i czyni ją odpowiednią do użycia w fragmentach lub innych właścicielach cyklu życia, które mają krótszy czas trwania niż aktywność.
Oto przykład implementacji wywołania zwrotnego:
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() } ... }
Możesz podać wiele wywołań zwrotnych za pomocą addCallback()
.
Wywołania zwrotne są wywoływane w odwrotnej kolejności do kolejności ich dodawania – ostatnio dodane wywołanie zwrotne ma pierwszeństwo w obsługiwaniu zdarzenia przycisku Wstecz. Jeśli na przykład dodasz 3 funkcje zwrotne o nazwach one
, two
i three
, będą one wywoływane kolejno w kolejności three
, two
i one
.
Wywołania zwrotne są zgodne z wzorcem łańcucha odpowiedzialności. Każdy wywołanie zwrotne w łańcuchu jest wywoływany tylko wtedy, gdy poprzednie wywołanie zwrotne nie zostało włączone. Oznacza to, że w poprzednim przykładzie funkcja wywołania zwrotnego two
zostanie wywołana tylko wtedy, gdy funkcja wywołania zwrotnego three
nie była włączona. Funkcja one
zostanie wywołana tylko wtedy, gdy funkcja two
nie była włączona, itd.
Pamiętaj, że gdy funkcja jest dodawana za pomocą addCallback()
, funkcja wywołania zwrotnego nie jest dodawana do łańcucha odpowiedzialności, dopóki funkcja LifecycleOwner
nie wejdzie w stan Lifecycle.State.STARTED
.
W przypadku tymczasowych zmian zdecydowanie zalecamy zmianę stanu włączenia na OnBackPressedCallback
, ponieważ zachowuje to kolejność opisaną powyżej. Jest to szczególnie ważne, jeśli masz zarejestrowane wywołania zwrotne w przypadku wielu różnych zagnieżdżonych właścicieli cyklu życia.
Jeśli jednak chcesz całkowicie usunąć OnBackPressedCallback
, zadzwoń pod numer remove()
.
Zwykle nie jest to jednak konieczne, ponieważ funkcje zwrotne są automatycznie usuwane, gdy powiązany z nimi obiekt LifecycleOwner
zostanie zniszczony.
Aktywność onBackPressed()
Jeśli używasz zdarzenia onBackPressed()
do obsługi zdarzeń przycisku Wstecz, zalecamy użycie zdarzenia OnBackPressedCallback
.
Jeśli jednak nie możesz wprowadzić tej zmiany, obowiązują te zasady:
- Wszystkie powrotne połączenia zarejestrowane za pomocą funkcji
addCallback
są oceniane, gdy dzwonisz dosuper.onBackPressed()
. - W Androidzie 12 (poziom API 32) i starszych funkcja
onBackPressed
jest zawsze wywoływana niezależnie od zarejestrowanych instancji funkcjiOnBackPressedCallback
.