El componente Navigation funciona con el sistema operativo Android para mantener la pila de actividades a medida que el usuario navega en tu app. En algunos casos, podría ser útil mantener varias pilas de actividades al mismo tiempo, mientras que el usuario se mueve entre ellas. Por ejemplo, si tu app incluye navegación inferior o un panel lateral de navegación, la compatibilidad con varias pilas de actividades permite a los usuarios cambiar con libertad entre flujos en tu app sin perder su lugar en ninguno de ellos.
El componente Navigation proporciona APIs que admiten varias pilas de actividades cuando se guarda y se restablece el estado de los destinos en el gráfico de navegación. La clase NavigationUI
incluye métodos que controlan esto automáticamente, pero también puedes usar las APIs subyacentes de forma manual para una implementación más personalizada.
Cómo implementar la compatibilidad automática con NavigationUI
La clase NavigationUI
incluye APIs que guardan y restablecen automáticamente el estado de los elementos de menú a medida que el usuario se mueve entre ellos. Estas APIs admiten varias pilas de actividades de forma predeterminada en los siguientes casos:
- Cuando usas la sobrecarga adecuada de
setupWithNavController()
para asociar una instancia deNavigationView
oBottomNavigationView
con unaNavController
, como se describe en el artículo para agregar un panel lateral de navegación o Navegación inferior. - Cuando usas
onNavDestinationSelected()
para crear una IU personalizada del menú de navegación vinculada a destinos alojados por una instanciaNavController
.
Estas APIs no requieren más cambios de código para implementar la compatibilidad con varias pilas de actividades. Además, son la forma recomendada de admitir varias pilas de actividades en tu app.
Cómo implementar la compatibilidad manual con las APIs subyacentes
Si los elementos que brinda NavigationUI
no satisfacen tus requisitos, puedes usar las APIs subyacentes para guardar y restablecer pilas de actividades a través de una de las otras plataformas de API que proporciona el componente de Navigation.
XML de Navigation
En el archivo XML de Navigation, los elementos <action>
de tu gráfico de navegación pueden usar el atributo app:popUpToSaveState
para guardar el estado de cualquier destino que la acción muestre con app:popUpTo
. También pueden usar el atributo app:restoreState
para restablecer cualquier estado guardado previamente para el destino definido en el atributo app:destination
.
Puedes usar estos atributos para admitir varias pilas de actividades. Cuando una acción de navegación necesite mover al usuario de una pila de actividades a otra, configura app:popUpToSaveState
y app:restoreState
en true
en el elemento <action>
correspondiente. De esa manera, la acción guarda el estado de la pila de actividades actual y, al mismo tiempo, se restablece el estado que había guardado anteriormente.
En el siguiente ejemplo, se muestra una acción que usa ambos atributos:
<action
android:id=”@+id/swap_stack”
app:destination=”@id/second_stack”
app:restoreState=”true”
app:popUpTo=”@id/first_stack_start_destination”
app:popUpToSaveState=”true” />
NavOptions
La clase NavOptions
te permite pasar opciones de navegación especiales para guardar y restablecer pilas de actividades cuando navegas usando una NavController
. Esto es así, ya sea que crees tu instancia de NavOptions
con el DSL de Kotlin o con NavOptions.Builder
:
Kotlin
// Use the navigate() method that takes a navOptions DSL Builder navController.navigate(selectedBottomNavRoute) { launchSingleTop = true restoreState = true popUpTo(navController.graph.findStartDestination().id) { saveState = true } }
Java
NavOptions navOptions = new NavOptions.Builder() .setLaunchSingleTop(true) .setRestoreState(true) .setPopUpTo(NavGraph.findStartDestination(navController.getGraph()).getId(), false, // inclusive true) // saveState .build(); navController.navigate(selectedBottomNavId, null, navOptions);
Si quieres obtener más información para pasar las opciones de navegación, consulta Cómo aplicar NavOptions de manera programática.
Recursos adicionales
Para obtener más información sobre la compatibilidad con varias pilas de actividades con el componente Navigation, consulta los siguientes recursos adicionales:
Entradas de blog
- MAD Skills: Navega por varias pilas de actividades en Medium
- Navigation: Análisis detallado de varias pilas de actividades en Medium
Ejemplos
- Ahora en Android app en GitHub
- Jetnews en GitHub
- Jetsnack en GitHub