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, który służy do nawigacji, dlatego nie należy go dodawać 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. To zwykle umożliwia Androidowi prawidłową przechodzenie do poprzednich miejsc docelowych po naciśnięciu przycisku Wstecz. Istnieje jednak kilka sytuacji, w których aplikacja może wymagać wdrożenia własnego działania Back, 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 umożliwić użytkownikowi przewijanie historii przeglądania internetu zamiast do poprzednich ekranów aplikacji.

Wdrażanie niestandardowego przejścia wstecz

ComponentActivity, klasa podstawowa na potrzeby FragmentActivity i AppCompatActivity, pozwala kontrolować działanie przycisku Wstecz, wykorzystując jego klasę OnBackPressedDispatcher, którą 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. Tylko wtedy, gdy włączone jest wywołanie zwrotne (tj. isEnabled() zwraca true) pozwala dyspozytorowi wywołać metodę handleOnBackPressed() wywołania zwrotnego w celu obsługi zdarzenia przycisku Wstecz. Możesz zmienić stan włączenia, wywołując metodę setEnabled().

Wywołania zwrotne są dodawane za pomocą metod addCallback. Zdecydowanie zalecamy użycie metody addCallback(), która wymaga parametru LifecycleOwner. Dzięki temu OnBackPressedCallback zostanie dodany tylko wtedy, gdy LifecycleOwner ma wartość Lifecycle.State.STARTED. Aktywność usuwa też zarejestrowane wywołania zwrotne po zniszczeniu powiązanych z nimi wywołania LifecycleOwner, co zapobiega wyciekom pamięci i dzięki temu nadaje się 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 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()
    }
    ...
}

Za pomocą addCallback() możesz udostępnić wiele wywołań zwrotnych. Wywołania zwrotne są wówczas wywoływane w odwrotnej kolejności, w jakiej były dodawane – wywołanie zwrotne dodane jako ostatnie umożliwia obsługę zdarzenia przycisku Wstecz. Jeśli np. dodasz 3 wywołania zwrotne o nazwie one, two i three, zostaną one wywołane odpowiednio w 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 będzie wywoływane tylko wtedy, gdy wywołanie zwrotne three nie było włączone. Wywołanie zwrotne one jest wywoływane tylko wtedy, gdy wywołanie zwrotne two nie było włączone itd.

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

Zmiana stanu włączonego elementu OnBackPressedCallback jest zdecydowanie zalecana w przypadku zmian tymczasowych, ponieważ zachowuje opisaną powyżej kolejność, co jest szczególnie ważne, jeśli masz zarejestrowane wywołania zwrotne dla wielu różnych zagnieżdżonych właścicieli cyklu życia.

Jeśli jednak chcesz całkowicie usunąć OnBackPressedCallback, wywołaj remove(). Zwykle nie jest to jednak konieczne, ponieważ wywołania zwrotne są automatycznie usuwane po zniszczeniu powiązanego 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 będzie można wprowadzić tej zmiany, będą obowiązywać 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.