Nawigacja wstecz to sposób, w jaki użytkownicy poruszają się wstecz po historii ekranów, które wyświetlali. Poprzednio odwiedzone. Wszystkie urządzenia z Androidem mają przycisk Wstecz nawigacji, więc nie dodawaj przycisku Wstecz do interfejsu aplikacji. W zależności od urządzenia z Androidem, może to być przycisk fizyczny lub oprogramowanie. Przycisk
Android przechowuje tylny stos miejsc docelowych, gdy użytkownik porusza się po aplikacji podczas korzystania z aplikacji. Dzięki temu Android będzie mógł prawidłowo przejść do poprzednie miejsca docelowe po naciśnięciu przycisku Wstecz. Istnieje jednak kilka metod, w których aplikacja musi wdrożyć własne działanie Wstecz, zapewniają użytkownikom najlepsze wrażenia.
Na przykład gdy używasz WebView
,
możesz zastąpić domyślne działanie przycisku Wstecz, aby umożliwić użytkownikowi
mogą wrócić do przeglądania swojej historii przeglądania zamiast do poprzednich ekranów
w aplikacji.
Android 13 i nowsze wersje obsługują gest przewidywania gestu cofania na urządzeniach z Androidem. Do więcej informacji o tej funkcji znajdziesz w artykule Dodawanie obsługi gestu przewidywania tekstu cofania.
Wdróż niestandardową nawigację wsteczną
ComponentActivity
, podstawa
zajęcia: FragmentActivity
oraz AppCompatActivity
,
umożliwia kontrolowanie działania przycisku Wstecz za pomocą jego
OnBackPressedDispatcher
który można pobrać, wywołując metodę getOnBackPressedDispatcher()
.
Element OnBackPressedDispatcher
określa sposób wysyłania zdarzeń związanych z przyciskiem Wstecz
do co najmniej jednego OnBackPressedCallback
obiektów. Konstruktor dla funkcji OnBackPressedCallback
przyjmuje wartość logiczną dla funkcji
początkowe włączenie. Gdy włączone jest wywołanie zwrotne, czyli
isEnabled()
zwraca true
– dyspozytor wywołuje
handleOnBackPressed()
do obsługi zdarzenia przycisku Wstecz. Stan włączenia możesz zmienić, dzwoniąc
setEnabled()
Wywołania zwrotne są dodawane przy użyciu metod addCallback
. Zalecamy użycie
addCallback()
, która pobiera LifecycleOwner
.
Dzięki temu pole OnBackPressedCallback
zostanie dodane tylko wtedy, gdy LifecycleOwner
będzie
Lifecycle.State.STARTED
.
Aktywność usuwa też zarejestrowane wywołania zwrotne, jeśli są powiązane
LifecycleOwner
jest zniszczony, co zapobiega wyciekom pamięci i sprawia, że
LifecycleOwner
odpowiednie
do użytku we fragmentach lub u innych właścicieli cyklu życia, którzy mają krótszy okres życia
niż aktywność.
Oto przykładowa implementacja wywołania zwrotnego:
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() } ... }
Możesz podać wiele wywołań zwrotnych za pomocą funkcji addCallback()
.
Wywołania zwrotne są wtedy wywoływane w kolejności odwrotnej niż
dodawanie ich – wywołanie zwrotne dodane jako pierwsze daje szansę na obsługę
Zdarzenie dotyczące przycisku Wstecz. Jeśli na przykład dodasz trzy wywołania zwrotne o nazwie
one
, two
i three
w tej kolejności są wywoływane w kolejności
three
, two
, one
.
Wywołania zwrotne występują po
Łańcuch odpowiedzialności
wzorcem. Każde wywołanie zwrotne w łańcuchu jest wywoływane tylko wtedy, gdy poprzedzające
oddzwanianie nie zostało włączone. Oznacza to, że w polu
w poprzednim przykładzie wywołanie zwrotne two
jest wywoływane tylko wtedy, gdy wywołanie zwrotne three
nie jest włączona, a wywołanie zwrotne one
jest wywoływane tylko wtedy, gdy wywołanie zwrotne two
nie jest włączony.
Pamiętaj, że po dodaniu wywołania zwrotnego za pomocą funkcji addCallback()
nie zostanie dodana do łańcucha odpowiedzialności, dopóki
LifecycleOwner
przechodzi w stan Lifecycle.State.STARTED
.
Zalecamy zmianę stanu włączenia w: OnBackPressedCallback
w przypadku zmian tymczasowych, co pozwala zachować opisaną powyżej kolejność.
Jest to szczególnie ważne, jeśli masz zarejestrowane wywołania zwrotne
zagnieżdżonych właścicieli cyklu życia.
Jeśli chcesz całkowicie usunąć OnBackPressedCallback
,
Możesz zadzwonić
remove()
Zwykle nie jest to konieczne, ponieważ wywołania zwrotne są automatycznie usuwane po
powiązane z nim LifecycleOwner
to
zniszczone.
Aktywność onBackPressed()
Jeśli używasz
onBackPressed()
do obsługi zdarzeń przycisku Wstecz
OnBackPressedCallback
.
Jeśli jednak nie możesz wprowadzić tej zmiany, obowiązują te zasady:
- Wszystkie wywołania zwrotne zarejestrowane przez
addCallback
są oceniane podczas połączeniasuper.onBackPressed()
- W Androidzie 12 (poziom interfejsu API 32) i starszych wersjach funkcja
onBackPressed
jest zawsze wywoływana, niezależnie od zarejestrowanych instancjiOnBackPressedCallback
.