Udostępniaj niestandardową nawigację wstecz

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łączenia super.onBackPressed()
  • W Androidzie 12 (poziom interfejsu API 32) i starszych wersjach funkcja onBackPressed jest zawsze wywoływana, niezależnie od zarejestrowanych instancji OnBackPressedCallback.