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, dlatego 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. Zwykle pozwala to Androidowi prawidłowo przejść do
poprzednie miejsca docelowe po naciśnięciu przycisku Wstecz. Istnieje jednak kilka metod,
Przypadki, w których aplikacja może być zmuszona do wdrożenia własnego działania Wstecz, aby
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.
Wdróż niestandardową nawigację wsteczną
ComponentActivity
, podstawa
zajęcia: FragmentActivity
oraz AppCompatActivity
,
umożliwia sterowanie działaniem 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. Tylko wtedy, gdy włączone jest wywołanie zwrotne (np.
isEnabled()
zwraca true
) czy dyspozytor zadzwoni pod numer
handleOnBackPressed()
do obsługi zdarzenia przycisku Wstecz. Stan włączenia możesz zmienić, dzwoniąc
setEnabled()
Wywołania zwrotne są dodawane za pomocą metod addCallback
. Zdecydowanie zalecamy
skorzystaj z funkcji 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
Element LifecycleOwner
został zniszczony, co zapobiega wyciekom pamięci i umożliwia jego zniszczenie
do użytku we fragmentach lub u innych właścicieli cyklu życia, którzy mają krótszy okres życia
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ą przy tym wywoływane w odwrotnej kolejności.
dodano – wywołanie zwrotne dodane jako pierwsze umożliwia obsługę
Zdarzenie dotyczące przycisku Wstecz. Jeśli na przykład dodasz 3 wywołania zwrotne o nazwie
one
, two
i three
, są wywoływane w kolejności od
three
, two
i 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 poprzednim przykładzie wywołanie zwrotne two
zostanie wywołane tylko wtedy, gdy wywołanie zwrotne three
nie został włączony. Wywołanie zwrotne one
zostanie wywołane tylko wtedy, gdy wywołanie zwrotne two
nie została włączona itd.
Pamiętaj, że po dodaniu za pomocą addCallback()
,
wywołanie zwrotne nie zostanie dodane do łańcucha odpowiedzialności, dopóki
LifecycleOwner
trafia do
Lifecycle.State.STARTED
stanu.
Zdecydowanie zmiana stanu włączenia w: OnBackPressedCallback
jest zalecany w przypadku tymczasowych zmian, ponieważ zachowuje kolejność opisaną powyżej.
Jest to szczególnie ważne, jeśli masz wywołania zwrotne zarejestrowane
różnych zagnieżdżonych właścicieli cyklu życia.
Jeśli jednak chcesz całkowicie usunąć OnBackPressedCallback
,
Zadzwoń
remove()
Zwykle nie jest to jednak konieczne, ponieważ wywołania zwrotne są usuwane automatycznie, gdy powiązane z nimi LifecycleOwner
zostaje usunięte
zniszczone.
Aktywność onBackPressed()
Jeśli używasz
onBackPressed()
do obsługi zdarzeń przycisku Wstecz
OnBackPressedCallback
.
Jeśli jednak nie będzie można wprowadzić tej zmiany, będą obowiązywać następujące reguły:
- 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
.