Udostępniaj niestandardową nawigację wstecz

Wsteczna nawigacja pozwala użytkownikom cofać się w historii odwiedzonych ekranów. Wszystkie urządzenia z Androidem mają przycisk Wstecz służący do tego typu nawigacji, dlatego nie dodawaj przycisku Wstecz do interfejsu aplikacji. W zależności od urządzenia z Androidem, z którego korzysta użytkownik, może to być przycisk fizyczny lub przycisk oprogramowania.

Android utrzymuje backendowy stos miejsc docelowych, gdy użytkownik porusza się po aplikacji. Dzięki temu po naciśnięciu przycisku Wstecz Android będzie prawidłowo przechodzić do poprzednich miejsc docelowych. Istnieje jednak kilka sytuacji, w których aplikacja może wymagać wdrożenia własnego działania wstecz, aby zapewnić użytkownikom jak najlepsze wrażenia.

Na przykład, korzystając z elementu WebView, możesz zastąpić domyślny sposób działania przycisku Wstecz, aby użytkownik mógł przechodzić wstecz po historii przeglądania internetu zamiast do poprzednich ekranów aplikacji.

Android 13 i nowsze wersje umożliwiają przewidywanie gestu wstecznego na urządzeniach z Androidem. Więcej informacji o tej funkcji znajdziesz w artykule Dodawanie obsługi gestu przewidywanego przejścia wstecz.

Wdrażanie niestandardowego przejścia wstecz

ComponentActivity, klasa podstawowa na potrzeby FragmentActivity i AppCompatActivity, pozwala kontrolować działanie przycisku Wstecz przy użyciu jego przycisku OnBackPressedDispatcher, który można pobrać, wywołując getOnBackPressedDispatcher().

OnBackPressedDispatcher określa sposób wysyłania zdarzeń przycisku Wstecz do co najmniej 1 obiektu OnBackPressedCallback. Konstruktor OnBackPressedCallback przyjmuje wartość logiczną określającą początkowy stan włączenia. Gdy włączone jest wywołanie zwrotne, czyli isEnabled() zwraca wartość true, dyspozytor wywołuje metodę handleOnBackPressed() wywołania zwrotnego, aby obsłużyć zdarzenie przycisku Wstecz. Możesz zmienić stan włączenia, wywołując metodę setEnabled().

Wywołania zwrotne są dodawane za pomocą metod addCallback. Zalecamy użycie metody addCallback(), która wymaga LifecycleOwner. Dzięki temu OnBackPressedCallback zostanie dodany tylko wtedy, gdy LifecycleOwner ma wartość Lifecycle.State.STARTED. Aktywność powoduje też usunięcie zarejestrowanych wywołań zwrotnych po zniszczeniu powiązanych z nimi wywołań zwrotnych (LifecycleOwner), co zapobiega wyciekom pamięci i sprawia, że LifecycleOwner jest odpowiedni do użycia we fragmentach lub innych właścicielach cyklu życia o krótszym czasie działania niż aktywność.

Oto przykład implementacji 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 odwrotnej kolejności od tej, w jakiej zostały dodane – wywołanie zwrotne dodane jako ostatnie umożliwia obsługę zdarzenia przycisku Wstecz. Jeśli na przykład dodasz 3 wywołania zwrotne o nazwach one, two i three, będą one wywoływane w tej kolejności w takiej kolejności: three, two i one.

Wywołania zwrotne są zgodne ze schematem Łańcuch odpowiedzialności. Każde wywołanie zwrotne w łańcuchu jest wywoływane tylko wtedy, gdy poprzednie wywołanie zwrotne nie było włączone. Oznacza to, że w poprzednim przykładzie wywołanie zwrotne two jest wywoływane tylko wtedy, gdy wywołanie zwrotne three nie jest włączone, a wywołanie zwrotne one jest wywoływane tylko wtedy, gdy wywołanie zwrotne two nie jest włączone.

Pamiętaj, że wywołanie zwrotne dodane za pomocą funkcji addCallback() nie jest dodawane do łańcucha odpowiedzialności, dopóki LifecycleOwner nie przejdzie do stanu Lifecycle.State.STARTED.

W przypadku zmian tymczasowych zalecamy zmianę stanu włączonego elementu OnBackPressedCallback, ponieważ zachowuje to kolejność opisaną powyżej. Jest to szczególnie ważne, jeśli masz zarejestrowane wywołania zwrotne dla wielu zagnieżdżonych właścicieli cyklu życia.

Jeśli chcesz całkowicie usunąć OnBackPressedCallback, możesz wywołać metodę remove(). Zwykle nie jest to konieczne, ponieważ wywołania zwrotne są automatycznie usuwane po zniszczeniu powiązanego z nimi elementu LifecycleOwner.

Aktywność onBackPressed()

Jeśli do obsługi zdarzeń przycisku Wstecz używasz zdarzenia onBackPressed(), zalecamy użycie zamiast tego metody OnBackPressedCallback. Jeśli jednak nie można wprowadzić tej zmiany, obowiązują następujące reguły:

  • Wszystkie wywołania zwrotne zarejestrowane za pomocą funkcji addCallback są oceniane w trakcie nawiązania połączenia super.onBackPressed().
  • W Androidzie 12 (poziom interfejsu API 32) i starszych interfejs onBackPressed jest zawsze wywoływany, niezależnie od zarejestrowanych instancji OnBackPressedCallback.