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 gest cofania może wyświetlić animowany podgląd ekranu głównego za aplikacją, jak pokazano na makiecie na rysunku 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 nawigacji, uaktualnij je do wersji AndroidX Activity 1.6.0-alpha05 lub nowszej.

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
Nieobsługiwane interfejsy API platform Migracja do interfejsów API AndroidaX aplikacji na Androida X, które zawierają nieobsługiwane interfejsy API nawigacji wstecz,
Nie Interfejsy API nieobsługiwanych platform, które można przenieść Przejście z aplikacji korzystającej z nieobsługiwanych interfejsów API nawigacji wstecz na interfejsy API platformy
Nieobsługiwane interfejsy API platformy, ale nie można przeprowadzić migracji Odłóż zgodę do czasu, aż ta funkcja stanie się wymagana

Migracja poprzedniej wersji nawigacji na AndroidzieX

Ten przypadek użycia jest najczęstszy (i najbardziej zalecany). 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. Włącz gest przewidywanego przejścia wstecz zgodnie z opisem na tej stronie.

Migracja aplikacji AndroidX zawierającej nieobsługiwane interfejsy API nawigacji wstecz na interfejsy AndroidX

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. Zaktualizuj do AndroidX Activity 1.6.0-alpha05.

    // 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ą.

Migracja 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ę w funkcji OnBackInvokedCallback za pomocą funkcji 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. Gdy chcesz przestać przechwytywać gest wstecz, zarejestruj OnBackInvokedCallback. 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 się to zdarzyć, gdy migrujesz z onKeyPreIme() i Twoje wywołanie zwrotne musi otrzymać gest wstecz zamiast otwartego 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ę.

Akceptacja na poziomie aktywności

Od Androida 14 flaga android:enableOnBackInvokedCallback umożliwia włączysz prognozowane animacje systemowe na poziomie aktywności. Takie działanie ł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 flagi android:enableOnBackInvokedCallback należy wziąć pod uwagę te kwestie:

  • Ustawienie android:enableOnBackInvokedCallback=false wyłącza przewidywane animacje wsteczne na poziomie aktywności lub aplikacji (w zależności od tego, gdzie ustawisz tag), a także zleci systemowi zignorowanie 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 interfejsu użytkownika, który włącza i wyłącza poszczególne wywołania zwrotne.

Stan interfejsu to właściwość opisująca interfejs użytkownika. Zalecamy wykonanie tych ogólnych czynności.

  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 wcześniej powiązała logikę cofnięcia z oświadczeniami warunkowymi, może to oznaczać, że reagujesz na zdarzenie cofnięcia po tym, jak już nastąpiło. Należy unikać takiego wzorca w przypadku nowych 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 wywołań zwrotnych systemu do wykonywania logiki interfejsu, np. wyświetlania wyskakującego okienka lub animacji.

Jeśli Twoja aplikacja umożliwia wywołanie systemu wstecz, animacje przewidujące nie są uruchamiane i musisz obsłużyć zdarzenie 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 przypadków aktywności do aktywności lub fragmentu do aktywności odnotuj, czy isFinishingonDestroy jest true w cyklu życia aktywności.
  • W przypadku fragmentów względem siebie rejestruj, czy w funkcji isRemoving w elementach onDestroy jest spełniony warunek true w cyklu życia widoku fragmentu. Możesz też rejestrować za pomocą metod onBackStackChangeStarted lub onBackStackChangeCommitted w elementach 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ż do modułu rozsyłającego można dodać wiele wywołań zwrotnych. 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

Od wersji końcowej Androida 13 możesz włączyć opcję dla deweloperów, aby przetestować animację powrotu do ekranu głównego, która jest widoczna na rysunku 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.