Dodano obsługę gestu przewidywanego przejścia wstecz

Rysunek 1. Przykład wyglądu i sposobu działania gestu cofania się na telefonie

Android 14 (poziom interfejsu API 34) dodaje obsługę dodatkowych animacji systemowych i interfejsów API w celu tworzenia animacji niestandardowych. Więcej informacji: Dodano obsługę wbudowanych i niestandardowych animacji wstecznych (prognozowanych).

Na przykład użycie gestu cofania może spowodować wyświetlenie animowanego podglądu na ekranie głównym aplikacji, tak jak na ilustracji 1. Począwszy od Androida 13: przetestuj tę animację powrotu na stronę główną, włączając opcję programisty (jak opisano na tej stronie).

Obsługa gestu przewidywanego cofania wymaga aktualizacji aplikacji za pomocą zgodność wsteczna OnBackPressedCallback AppCompat 1.6.0-alpha05 (AndroidX) lub nowszy interfejs API albo nowy interfejs API OnBackInvokedCallback API platformy. Większość aplikacji będzie używać zgodnego wstecznie interfejsu API AndroidX.

Ta aktualizacja zapewnia ścieżkę migracji, która pozwala prawidłowo przechwycić nawigację wsteczną, co obejmuje zastąpienie przechwytów wstecznych z KeyEvent.KEYCODE_BACK i wszystkich klas z metodami onBackPressed, takimi jak Activity czy Dialog z nowym systemowym interfejsami Back API.

Ćwiczenia z programowania i konferencje Google I/O

Oprócz skorzystania z dokumentacji dostępnej na tej stronie wypróbuj też nasze ćwiczenia z programowania. Udostępnia typową implementację przypadku użycia komponentu WebView obsługującego gestu przewidywanego wstecznego za pomocą interfejsów AndroidX Activity API.

Zachęcamy też do obejrzenia filmu z konferencji Google I/O, w którym przedstawiamy dodatkowe przykłady wdrażanie interfejsów API platformy AndroidX i platformy.

Aktualizowanie aplikacji, która używa domyślnej nawigacji wstecz

Aktualizowanie aplikacji w celu obsługi tej funkcji jest proste, jeśli aplikacja nie obsługuje tej funkcji nie stosować niestandardowych funkcji cofania (inaczej mówiąc, zmniejsza to obsługę klienta do systemu). Włącz tę funkcję w sposób opisany w Google.

Jeśli Twoja aplikacja używa fragmentów lub komponentu Nawigacja, zaktualizuj ją też do Aktywność w Androidzie 1.6.0-alfa05 lub wyższą.

Aktualizowanie aplikacji, która używa niestandardowej nawigacji wstecz

Jeśli Twoja aplikacja ma skonfigurowane niestandardowe działanie cofania, dostępne będą różne ścieżki migracji w zależności od tego, czy używa AndroidaX i jak obsługuje nawigację wstecz.

Twoja aplikacja korzysta z AndroidaX Jak aplikacja obsługuje nawigację wstecz Zalecana ścieżka migracji (link na tej stronie)
Tak Interfejsy API AndroidX Migracja istniejącej implementacji AndroidaX
Interfejsy API nieobsługiwanej platformy Migracja do interfejsów API AndroidaX aplikacji na Androida X, które zawierają nieobsługiwane interfejsy API nawigacji wstecz,
Nie Interfejsy API platformy nieobsługiwanej platformy, możliwe do migracji Przenoszenie aplikacji, która korzysta z nieobsługiwanych interfejsów API nawigacji wstecz, do interfejsów API platformy
Migracja nie jest możliwa w przypadku nieobsługiwanych interfejsów API platformy Odłóż zgodę do czasu, aż ta funkcja stanie się wymagana

Migracja poprzedniej wersji nawigacji na AndroidzieX

Jest to najczęstszy (i najbardziej zalecany) przypadek użycia. Ma zastosowanie do nowych lub w istniejących aplikacjach, które implementują niestandardową obsługę nawigacji przy użyciu gestów OnBackPressedDispatcher, jak opisano w Skonfiguruj niestandardową nawigację Wstecz.

Jeśli Twoja aplikacja należy do tej kategorii, wykonaj poniższe czynności, aby dodać obsługę gest przewidywanego przejścia wstecz:

  1. Aby mieć pewność, że interfejsy API, które używają już OnBackPressedDispatcher interfejsów API, (np. Fragmenty czy Komponent Nawigacja) bezproblemowo współpracują z gest przewidywania tekstu wstecz, przejdź na Aktywność na Androidzie 1.6.0-alfa05.

    // In your build.gradle file:
    dependencies {
    
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0-alpha05"
    
  2. Wyrażanie zgody na gest cofania się, tak jak to opisano na tę stronę.

Przenoszenie aplikacji na AndroidaX, które zawierają nieobsługiwane interfejsy API nawigacji wstecz, do interfejsów API AndroidaX

Jeśli Twoja aplikacja korzysta z bibliotek AndroidaX, ale implementuje lub odwołuje się do nieobsługiwanych interfejsów API wstecznej nawigacji, musisz przejść na interfejsy API AndroidX. pod kątem obsługi nowych zasad.

Aby przenieść nieobsługiwane interfejsy API do interfejsów AndroidX:

  1. Przenieś logikę obsługi wstecznej systemu do AndroidaX OnBackPressedDispatcher z implementacją OnBackPressedCallback Szczegółowe wskazówki znajdziesz w artykule Skonfiguruj niestandardową nawigację Wstecz.

  2. Wyłącz OnBackPressedCallback, gdy chcesz przestać przechwytywać plecy gest.

  3. Zatrzymaj przechwytywanie zdarzeń wstecznych za pomocą funkcji OnBackPressed lub KeyEvent.KEYCODE_BACK

  4. Pamiętaj, aby przejść na Aktywność na AndroidzieX w wersji 1.6.0-alfa05.

    // In your build.gradle file:
    dependencies {
    
    // Add this in addition to your other dependencies
    implementation "androidx.activity:activity:1.6.0-alpha05"
    
  5. Gdy przeniesiesz aplikację, włącz funkcję przewidywania tekstu Wstecz (tak jak to opisano w tę stronę), aby zobaczyć animację systemu powrotu na stronę główną.

Przenoszenie aplikacji, która korzysta z nieobsługiwanych interfejsów API nawigacji wstecz, do interfejsów API platformy

Jeśli aplikacja nie może używać bibliotek AndroidaX, a zamiast tego implementuje odniesienia do niestandardowej nawigacji Wstecz przy użyciu nieobsługiwanych interfejsów API, musisz dokonać migracji. do interfejsu API platformy OnBackInvokedCallback.

Aby przenieść nieobsługiwane interfejsy API do interfejsu API platformy, wykonaj te czynności:

  1. używać nowego interfejsu API OnBackInvokedCallback na urządzeniach z Androidem 13 lub i korzystać z nieobsługiwanych interfejsów API na urządzeniach z Androidem 12 lub obniżysz się.

  2. Zarejestruj niestandardową logikę cofania w usłudze OnBackInvokedCallback w: onBackInvokedDispatcher Uniemożliwia to zapisanie bieżącej aktywności na koniec, a oddzwonienie ma szansę zareagować na akcję Wstecz użytkownik kończy w systemie nawigację wstecz.

  3. Wyrejestruj OnBackInvokedCallback, gdy chcesz przestać przechwytywać gest cofania. W przeciwnym razie użytkownicy mogą zauważyć niepożądane zachowanie podczas korzystania z powrót do poprzedniego systemu, np. „utknięcie”; między widokami zmuszając ich do zamknięcia aplikacji.

    Oto przykład migracji logiki z onBackPressed:

    Kotlin

    @Override
    fun onCreate() {
        if (BuildCompat.isAtLeastT()) {
            onBackInvokedDispatcher.registerOnBackInvokedCallback(
                OnBackInvokedDispatcher.PRIORITY_DEFAULT
            ) {
                /**
                 * onBackPressed logic goes here. For instance:
                 * Prevents closing the app to go home screen when in the
                 * middle of entering data to a form
                 * or from accidentally leaving a fragment with a WebView in it
                 *
                 * Unregistering the callback to stop intercepting the back gesture:
                 * When the user transitions to the topmost screen (activity, fragment)
                 * in the BackStack, unregister the callback by using
                 * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback
                 * (https://developer.android.com/reference/kotlin/android/window/OnBackInvokedDispatcher#unregisteronbackinvokedcallback)
                 */
            }
        }
    }
    

    Java

    @Override
    void onCreate() {
      if (BuildCompat.isAtLeastT()) {
        getOnBackInvokedDispatcher().registerOnBackInvokedCallback(
            OnBackInvokedDispatcher.PRIORITY_DEFAULT,
            () -> {
              /**
               * onBackPressed logic goes here - For instance:
               * Prevents closing the app to go home screen when in the
               * middle of entering data to a form
               * or from accidentally leaving a fragment with a WebView in it
               *
               * Unregistering the callback to stop intercepting the back gesture:
               * When the user transitions to the topmost screen (activity, fragment)
               * in the BackStack, unregister the callback by using
               * OnBackInvokeDispatcher.unregisterOnBackInvokedCallback
               * (https://developer.android.com/reference/kotlin/android/view/OnBackInvokedDispatcher#unregisteronbackinvokedcallback)
               */
            }
        );
      }
    }
    
  4. Przestań przechwytywać zdarzenia za pomocą funkcji OnBackPressed lub KeyEvent.KEYCODE_BACK na Androida 13 lub nowszego.

  5. Gdy przeniesiesz aplikację, włącz funkcję przewidywania tekstu Wstecz (tak jak to opisano w tę stronę), aby zasada OnBackInvokedCallback zaczęła obowiązywać.

Możesz zarejestrować OnBackInvokedCallback u dostawcy PRIORITY_DEFAULT lub PRIORITY_OVERLAY, niedostępnej na podobnych urządzeniach z AndroidemX OnBackPressedCallback Rejestracja wywołania zwrotnego u sprzedawcy PRIORITY_OVERLAY to w niektórych przypadkach. Może to mieć zastosowanie podczas migracji od użytkownika onKeyPreIme(), a oddzwonienie musi odczytać gest cofania otwartego edytora IME. edytory IME rejestrują wywołania zwrotne za pomocą funkcji PRIORITY_DEFAULT po otwarciu. Zarejestruj oddzwonienie u firmy PRIORITY_OVERLAY, aby mieć pewność, OnBackInvokedDispatcher wysyła gest cofnięcia do wywołania zwrotnego otwartego edytora IME.

Wyraź zgodę na gest przewidywanego przejścia wstecz

Gdy już zdecydujesz, jak zaktualizować aplikację w zależności od przypadku, włącz obsługującego gest przewidywania tekstu wstecz.

Aby włączyć tę funkcję, w sekcji AndroidManifest.xml w tagu <application> ustaw parametr android:enableOnBackInvokedCallback flaga do true.

<application
    ...
    android:enableOnBackInvokedCallback="true"
    ... >
...
</application>

Jeśli nie podasz wartości, zostanie użyta domyślna wartość false:

  • Wyłącza animację systemową gestów przewidywania.
  • Ignoruje połączenia OnBackInvokedCallback, ale OnBackPressedCallback mogą kontynuować pracę.

Wyrażanie zgody na poziomie aktywności

Od Androida 14 flaga android:enableOnBackInvokedCallback umożliwia włączysz prognozowane animacje systemowe na poziomie aktywności. To zachowanie łatwiejsza w zarządzaniu jest migracja dużych aplikacji o wielu działaniach do aplikacji prognozującej, gestami wstecz.

Poniżej znajduje się przykład użycia funkcji enableOnBackInvokedCallback do: włącz animację systemu powrotu na stronę główną z elementu MainActivity:

<manifest ...>
    <application . . .

        android:enableOnBackInvokedCallback="false">

        <activity
            android:name=".MainActivity"
            android:enableOnBackInvokedCallback="true"
            ...
        </activity>
        <activity
            android:name=".SecondActivity"
            android:enableOnBackInvokedCallback="false"
            ...
        </activity>
    </application>
</manifest>

W poprzednim przykładzie ustawienie atrybutu android:enableOnBackInvokedCallback=true dla atrybutu ".SecondActivity" włącza animację systemu obejmującego wiele aktywności.

Podczas korzystania z atrybutu Flaga android:enableOnBackInvokedCallback:

  • Ustawienie android:enableOnBackInvokedCallback=false wyłącza prognozowanie z powrotem w animacji – na etapie na poziomie aplikacji lub na poziomie aplikacji, w zależności od tego, gdzie został ustawiony tag, i zawiera instrukcje system ignorowania wywołań interfejsu API platformy OnBackInvokedCallback. Wywołania OnBackPressedCallback są jednak nadal wykonywane, ponieważ Funkcja OnBackPressedCallback jest zgodna wstecznie i wywołuje metodę onBackPressed API, który nie jest obsługiwany w wersjach starszych niż Android 13.
  • Ustawienie flagi enableOnBackInvokedCallback na poziomie aplikacji ustanawia domyślną wartość dla wszystkich aktywności w aplikacji. Możesz zastąpić domyślnie za aktywność, ustawiając flagę na poziomie aktywności, tak jak w sekcji z poprzedniego przykładu kodu.

Sprawdzone metody dotyczące wywołań zwrotnych

Oto sprawdzone metody korzystania z obsługiwanych systemowych wywołań zwrotnych: BackHandler (tworzenie wiadomości), OnBackPressedCallback lub OnBackInvokedCallback

Określ stan UI, który włącza i wyłącza każde wywołanie zwrotne

Stan interfejsu to właściwość opisująca interfejs użytkownika. Zalecamy przestrzeganie tych zasad kroków.

  1. Określ stan interfejsu, w którym każde wywołanie zwrotne zostanie włączone lub wyłączone.

  2. Zdefiniuj ten stan za pomocą obserwowalnego posiadacza danych type, na przykład StateFlow lub Utwórz stan i włącz lub wyłącz wywołanie zwrotne po zmianie stanu.

Jeśli Twoja aplikacja łączyła wcześniej logikę wsteczną z instrukcjami warunkowymi, może to oznaczać, że zareagujesz na zdarzenie wstecz, gdy miało ono miejsce już wystąpił – wzorzec, którego należy unikać w przypadku nowszych wywołań zwrotnych. Jeśli to możliwe, przenieś wywołanie zwrotne poza instrukcję warunkową, a zamiast tego powiązania wywołania zwrotnego z obserwowalnym typem właściciela danych,

Używaj systemowych wywołań zwrotnych w UI Logic

Elementy interfejsu określa sposób wyświetlania UI. Używaj systemowych wywołań zwrotnych do uruchamiania logiki interfejsu, takiej jak przy wyświetlaniu wyskakującego okienka lub animacji.

Jeśli aplikacja zezwala na wywołanie zwrotne systemu, animacje prognozowane nie są uruchamiane Trzeba zająć się zdarzeniem wstecz. Nie twórz wyłącznie wywołań zwrotnych w celu uruchamiania bez interfejsu użytkownika logikę logiczną.

Jeśli np. przechwytujesz zdarzenia tylko w celu rejestrowania, zaloguj się w Cykl życia aktywności lub fragmentu.

  • W przypadku zgłoszeń dotyczących aktywności lub fragmentów do aktywności zapisz, jeśli isFinishing w onDestroy ma wartość true w cyklu życia aktywności.
  • W przypadku przypadków z fragmentami na fragmenty rejestruj, jeśli isRemoving w onDestroy to true w ramach cyklu życia widoku fragmentu; lub, zaloguj się za pomocą Metody onBackStackChangeStarted lub onBackStackChangeCommitted w FragmentManager.OnBackStackChangedListener.

W przypadku zgłoszenia utwórz log w wywołaniu zwrotnym onCleared() wywołania ViewModel powiązane z miejscem docelowym tworzenia wiadomości. To najlepszy sygnał, aby wiedzieć, gdy miejsce docelowe tworzenia wiadomości zostało wyrzucone ze stosu wstecznego i zniszczone.

Tworzenie pojedynczych wywołań zwrotnych

Jest to możliwe, ponieważ możesz dodać wiele wywołań zwrotnych do dyspozytora. Wywołania zwrotne są dodawane do stosu, w którym ostatnio dodano włączone wywołanie zwrotne obsługuje następny gest cofania z jednym wywołaniem zwrotnym na każdy gest wstecz.

Przetestuj animację gestu przewidywania gestu wstecz

Począwszy od ostatecznej wersji Androida 13, powinno być możliwe włączenie jako opcję dla programistów, która pozwala przetestować powrót do strony głównej przedstawioną na rys. 1.

Aby przetestować tę animację, wykonaj te czynności:

  1. Na urządzeniu wybierz kolejno Ustawienia > System > Opcje programisty.

  2. Wybierz Animacje przewidywanego przejścia wstecz.

  3. Uruchom zaktualizowaną aplikację i użyj gestu cofania, aby zobaczyć, jak działa ta wersja.