Użytkownicy mogą cofać się do poprzednich ekranów za pomocą przechodzenia wstecz. Większość urządzeń z Androidem ma przycisk Wstecz – fizyczny, programowy lub oparty na gestach. Zwykle nie należy dodawać przycisku Wstecz do aplikacji. Jednak urządzenia z systemem operacyjnym Android Automotive (AAOS) w trybie zgodności używają systemowego przycisku Wstecz. Obsługuje ona nawigację, więc nie musisz dodawać własnej. Więcej informacji znajdziesz w sekcji Tryb zgodności AAOS.
Android utrzymuje stos wsteczny miejsc docelowych, gdy użytkownik porusza się po aplikacji. Zwykle umożliwia to Androidowi prawidłowe przechodzenie do poprzednich miejsc docelowych po naciśnięciu przycisku Wstecz. W kilku przypadkach aplikacja może jednak wymagać wdrożenia własnego działania przycisku Wstecz, aby zapewnić użytkownikom jak najlepsze wrażenia. Na przykład podczas korzystania z WebView możesz zastąpić domyślne działanie przycisku Wstecz, aby umożliwić użytkownikowi powrót do historii przeglądania internetu zamiast do poprzednich ekranów w aplikacji.
Implementowanie niestandardowego przechodzenia wstecz w Compose
W Jetpack Compose możesz obsługiwać niestandardowe przechodzenie wstecz za pomocą komponentu BackHandler.
Gdy używasz Navigation Compose, zwykle używasz NavController.navigateUp() lub NavController.popBackStack(), aby przejść do poprzedniego ekranu na stosie wstecznym. Jest on jednak przydatny w przypadkach, gdy chcesz wdrożyć niestandardowe działanie, gdy użytkownik naciśnie systemowy przycisk Wstecz lub użyje gestu cofania.BackHandler Jeśli na przykład w aplikacji wyświetlasz WebView, możesz zezwolić użytkownikom na powrót do poprzednich stron w historii przeglądania po naciśnięciu systemowego przycisku Wstecz.
Jeśli masz kilka włączonych funkcji kompozycyjnych BackHandler na różnych poziomach drzewa funkcji kompozycyjnych, tylko najbardziej wewnętrzna z nich przechwyci zdarzenie powrotu.
Implementowanie niestandardowej nawigacji wstecz za pomocą widoków
ComponentActivity, klasa bazowa dla FragmentActivity i AppCompatActivity, umożliwia kontrolowanie działania przycisku Wstecz za pomocą właściwości OnBackPressedDispatcher, którą można pobrać, wywołując getOnBackPressedDispatcher().
Element OnBackPressedDispatcher określa, jak zdarzenia przycisku Wstecz są wysyłane do co najmniej 1 obiektu OnBackPressedCallback. Konstruktor OnBackPressedCallback przyjmuje wartość logiczną określającą początkowy stan włączenia. Tylko wtedy, gdy wywołanie zwrotne jest włączone, np. gdy isEnabled() zwraca true, dyspozytor wywołuje handleOnBackPressed() wywołania zwrotnego, aby obsłużyć zdarzenie przycisku Wstecz. Stan włączenia możesz zmienić, wywołując funkcję setEnabled().
Wywołania zwrotne są dodawane za pomocą metod addCallback. używaj metody addCallback(), która przyjmuje argument LifecycleOwner. W ten sposób znak OnBackPressedCallback jest dodawany tylko wtedy, gdy znak LifecycleOwner jest Lifecycle.State.STARTED. Aktywność usuwa też zarejestrowane wywołania zwrotne, gdy powiązany z nimi obiekt LifecycleOwner zostanie zniszczony, co zapobiega wyciekom pamięci i sprawia, że nadaje się ona do użycia we fragmentach lub innych właścicielach cyklu życia, których okres istnienia jest krótszy niż okres istnienia aktywności.
Oto przykładowa implementacja 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ć kilka wywołań zwrotnych za pomocą addCallback().
W takim przypadku wywołania zwrotne są wywoływane w odwrotnej kolejności, w jakiej zostały dodane – wywołanie zwrotne dodane jako ostatnie jest wywoływane jako pierwsze, aby mogło obsłużyć zdarzenie przycisku Wstecz. Jeśli na przykład dodasz 3 wywołania zwrotne o nazwach one, two i three w tej kolejności, zostaną one wywołane w kolejności three, two i one.
Wywołania zwrotne są zgodne ze wzorcem Chain of Responsibility (Łańcuch odpowiedzialności). Każde wywołanie zwrotne w łańcuchu jest wywoływane tylko wtedy, gdy poprzednie wywołanie zwrotne nie zostało włączone. Oznacza to, że w powyższym przykładzie wywołanie zwrotne two zostanie wywołane tylko wtedy, gdy wywołanie zwrotne three nie będzie włączone. Wywołanie zwrotne one zostanie wywołane tylko wtedy, gdy wywołanie zwrotne two nie będzie włączone itd.
Pamiętaj, że gdy wywołanie zwrotne jest dodawane za pomocą addCallback(), nie jest ono dodawane do łańcucha odpowiedzialności, dopóki LifecycleOwner nie przejdzie w stan Lifecycle.State.STARTED.
W przypadku tymczasowych zmian zdecydowanie zalecamy zmianę stanu włączenia w OnBackPressedCallback, ponieważ zachowuje to opisaną powyżej kolejność, co jest szczególnie ważne, jeśli masz zarejestrowane wywołania zwrotne w wielu różnych zagnieżdżonych właścicielach cyklu życia.
Jeśli jednak chcesz całkowicie usunąć OnBackPressedCallback, zadzwoń pod numer remove().
Zwykle nie jest to jednak konieczne, ponieważ wywołania zwrotne są automatycznie usuwane, gdy powiązany z nimi obiekt LifecycleOwner jest niszczony.