Cómo agregar compatibilidad para el gesto atrás predictivo

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.
Figura 1: Simulación del aspecto y la experiencia del gesto atrás predictivo en un teléfono

Android 13 (nivel de API 33) introduce un gesto atrás predictivo para dispositivos Android, como teléfonos, pantallas grandes y dispositivos plegables. Es parte de un lanzamiento que se extiende durante varios años. Cuando se implemente por completo, esta función permitirá a los usuarios obtener una vista previa del destino u otro resultado de un gesto de retroceso antes de completarlo por completo, lo que les permitirá decidir si desean continuar o permanecer en la vista actual.

Por ejemplo, con un gesto atrás, se puede mostrar una vista previa animada de la pantalla principal detrás de la app, como se muestra en simulación de la Figura 1. A partir de Android 13, puedes probar esta animación de regreso a la página principal habilitando una opción para desarrolladores (como se describe en esta página).

Para admitir el gesto atrás predictivo, se requiere actualizar la app, con OnBackPressedCallback AppCompat 1.6.0-alpha05 (AndroidX) retrocompatible o una API posterior, o bien con la nueva API de plataforma OnBackInvokedCallback. La mayoría de las apps usarán la API de AndroidX retrocompatible.

Esta actualización proporciona una ruta de migración para interceptar correctamente la navegación hacia atrás, lo que implica reemplazar las interceptaciones de retroceso de KeyEvent.KEYCODE_BACK y cualquier clase con métodos onBackPressed, como Activity y Dialog con las nuevas APIs de retroceso del sistema.

Codelab y video de Google I/O

Además de usar la documentación en esta página, prueba nuestro codelab. Este proporciona una implementación de casos de uso común de un WebView que controla el gesto atrás predictivo mediante las APIs de actividad de AndroidX.

También puedes ver nuestro video de Google I/O, que abarca ejemplos adicionales sobre la implementación de AndroidX y las APIs de la plataforma.

Actualiza una app que usa la navegación hacia atrás predeterminada

Actualizar tu app para que sea compatible con esta función es sencillo si esta no implementa ningún comportamiento de navegación hacia atrás personalizada (es decir, permite que el sistema continúe controlando este tipo de navegación). Simplemente, habilita esta función, como se describe en esta página.

Si tu app usa Fragments o el componente Navigation, también actualiza a AndroidX Activity 1.6.0-alpha05 o versiones posteriores.

Actualiza una app que usa una navegación hacia atrás personalizada

Si tu app implementa un comportamiento de navegación hacia atrás personalizada, existen diferentes rutas de migración, en función de si usa AndroidX y cómo controla este tipo de navegación.

Tu app usa AndroidX Cómo tu app controla la navegación hacia atrás Ruta de migración recomendada (vínculo en esta página)
API de AndroidX Migra una implementación actual de AndroidX
APIs de plataforma no compatibles Migra una app de AndroidX que contiene APIs de navegación hacia atrás no compatibles a las APIs de AndroidX
No APIs de plataforma no compatibles, que se pueden migrar Migra una app que usa APIs de navegación hacia atrás no compatibles a las APIs de la plataforma
APIs de plataforma no compatibles, pero que no se pueden migrar No habilitesla función hasta que esta se convierta en obligatoria

Migra una implementación de navegación hacia atrás de AndroidX

Este caso de uso es el más común (y el más recomendado). Se aplica a apps nuevas o existentes que implementan el manejo de navegación por gestos personalizada con OnBackPressedDispatcher, como se describe en Cómo brindar navegación personalizada hacia atrás.

Si tu app se ajusta a esta categoría, sigue los pasos que se mencionan a continuación para agregar compatibilidad con el gesto atrás predictivo:

  1. Para asegurarte de que las APIs que ya usan las APIs de OnBackPressedDispatcher (como Fragments y Navigation Component) funcionen sin problemas con el gesto atrás predictivo, actualiza a 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"
    
  2. Habilita el gesto atrás predictivo, como se describe en esta página.

Migra una app de AndroidX que contiene APIs de navegación hacia atrás no compatibles con las APIs de AndroidX

Si tu app usa bibliotecas de AndroidX, pero implementa APIs de navegación hacia atrás no compatibles o hace referencia a estas, deberás migrar al uso de las APIs de AndroidX para admitir el nuevo comportamiento.

Para migrar APIs no compatibles a las APIs de AndroidX, haz lo siguiente:

  1. Migra la lógica del control de navegación hacia atrás del sistema a OnBackPressedDispatcher de AndroidX con una implementación de OnBackPressedCallback. Para obtener ayuda detallada, consulta Cómo brindar navegación hacia atrás personalizada.

  2. Inhabilita OnBackPressedCallback cuando todo esté listo para dejar de interceptar el gesto de retroceso.

  3. Deja de interceptar eventos de retroceso mediante OnBackPressed o KeyEvent.KEYCODE_BACK.

  4. Asegúrate de actualizar a 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. Una vez que migres la app de forma correcta, habilita el gesto atrás predictivo (como se describe en esta página) para ver la animación del sistema para volver a la pantalla principal.

Migra una app que usa APIs de navegación hacia atrás no compatibles con las APIs de la plataforma

Si tu app no puede usar bibliotecas de AndroidX y, en su lugar, implementa la navegación hacia atrás personalizada o hace referencia a esta mediante las API no compatibles, debes migrar a la API de la plataforma OnBackInvokedCallback.

Sigue estos pasos para migrar APIs no compatibles a la API de la plataforma:

  1. Usa la nueva API de OnBackInvokedCallback en dispositivos que ejecutan Android 13 o versiones posteriores y usa las APIs no compatibles en dispositivos que ejecutan Android 12 o versiones anteriores.

  2. Registra la lógica de navegación hacia atrás personalizada en OnBackInvokedCallback con onBackInvokedDispatcher. De esta manera, se evita que se complete la actividad actual, y la devolución de llamada tendrá la oportunidad de reaccionar a la acción de atrás una vez que el usuario complete la navegación hacia atrás del sistema.

  3. Cancela el registro de OnBackInvokedCallback cuando todo esté listo para dejar de interceptar el gesto atrás. De lo contrario, los usuarios podrían ver un comportamiento no deseado cuando usen la navegación hacia atrás del sistema, por ejemplo, podrían "atascarse" entre vistas y obligarlas a forzar el cierre de tu app.

    Este es un ejemplo de cómo migrar la lógica fuera de 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. Deja de interceptar eventos de navegación hacia atrás mediante OnBackPressed o KeyEvent.KEYCODE_BACK para Android 13 y versiones posteriores.

  5. Una vez que se migró la app de forma correcta, habilita el gesto atrás predictivo (como se describe en esta página) para que OnBackInvokedCallback entre en vigencia.

Habilita el gesto atrás predictivo

Una vez que hayas determinado cómo actualizar tu app según el caso, es sencillo habilitar la compatibilidad con el gesto de retroceso predictivo.

Para habilitarlo, en AndroidManifest.xml, en la etiqueta <application>, establece la marca android:enableOnBackInvokedCallback en true.

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

Si no proporcionas un valor, el valor predeterminado es false y hace lo siguiente:

  • Inhabilita la animación de gesto atrás predictivo del sistema.
  • Ignora OnBackInvokedCallback, pero las llamadas OnBackPressedCallback siguen funcionando.

Prueba la animación del gesto atrás predictivo

A partir de la versión final de Android 13, deberías poder habilitar una opción para desarrolladores a fin de probar la animación para volver a la pantalla principal que se muestra en la Figura 1.

Para probar esta animación, sigue estos pasos:

  1. En tu dispositivo, ve a Configuración > Sistema > Opciones para desarrolladores.

  2. Selecciona Animaciones de retroceso predictivas.

  3. Inicia la app actualizada y usa el gesto de retroceso para verlo en acción.