Une application Android n’est pas un site web ! Contrairement au web où la navigation est très libre, une application native suit des patterns de navigation et des guidelines de design système stricts (Material Design) pour assurer une expérience utilisateur cohérente et familière.
Vous allez avoir besoin d’un ou plusieurs patterns de navigation pour structurer votre application.
Les informations sont récupérées depuis le site de Material Design : Layout
Sur Android il existe un pattern de navigation très populaire : le Navigation Drawer. Il s’agit d’un menu latéral qui permet d’accéder à des destinations principales dans une application.
On ne le retrouve pas sur iOS initialement, mais il est possible de l’implémenter depuis quelques version d’iOS.

📚 Ressources
Une bottom navigation permet d’accéder rapidement à des destinations principales dans une application. Elle est généralement utilisée pour des applications avec 3 à 5 destinations principales.


📚 Ressources
Une fois que vous avez un pattern de navigation principal, vous allez surement avoir besoin de sous-structures de navigation pour organiser votre application.
📚 Ressources
List-Detail pattern par exemple.📚 Ressources
Comme vous l’avez vu dans les ressources, si vous vous baladez sur le site de Material Design, vous trouverez des guidelines très précises pour le design d’applications Android.
Et surtout vous allez trouver des liens direct vers du code permettant d’implémenter ces designs dans vos applications !
Sur-utilisez ce site !
C’est un gain de temps considérable et cela permet de garantir une expérience utilisateur cohérente et familière.
A l’instar d’un react-router ou un vue-router, Compose propose une bibliothèque “Navigation” qui permet de gérer la navigation dans votre application.
Pour mettre en place la navigation sur Compose, vous avez 2 options :
StringElle est très simple à mettre en place, mais elle est moins puissante que la navigation “Type-Safe”.
On peut trouver facilement de la documentation
🛟 Installation
Exemple d’une navigation “Classique” :
// Définition des routes
object Routes {
const val HOME = "home"
const val PROFILE = "profile?userId={userId}"
const val DETAIL = "detail/{itemId}" // Path parameter
fun createProfileRoute(userId: String) = "profile?userId=$userId"
fun createDetailRoute(itemId: Int) = "detail/$itemId"
}
// Setup de la navigation
NavHost(navController, startDestination = Routes.HOME) {
composable(Routes.HOME) {
HomeScreen(onNavigateToProfile = {
navController.navigate(Routes.createProfileRoute("123"))
})
}
composable(
route = Routes.PROFILE,
arguments = listOf(
navArgument("userId") {
type = NavType.StringType
nullable = true
defaultValue = null
}
)
) { backStackEntry ->
val userId = backStackEntry.arguments?.getString("userId")
ProfileScreen(userId = userId)
}
composable(
route = Routes.DETAIL,
arguments = listOf(
navArgument("itemId") { type = NavType.IntType }
)
) { backStackEntry ->
val itemId = backStackEntry.arguments?.getInt("itemId") ?: 0
DetailScreen(itemId = itemId)
}
}
Introduite en début d’année 2024, la navigation “Type-Safe” est une manière plus robuste de gérer la navigation dans votre application, mais aussi plus jeune et donc moins documentée.
🛟 Installation
🛟 Mise en place avec un Bottom Navigation
Et je vous donne un exemple simple pour vous aider à démarrer :
@Serializable
data object HomeScreen
@Serializable
data class ProfileScreen(val userId: String? = null)
@Serializable
data class DetailScreen(val itemId: Int)
// Setup de la navigation
NavHost(navController, startDestination = HomeScreen) {
composable<HomeScreen> {
HomeScreen(onNavigateToProfile = {
navController.navigate(ProfileScreen("123"))
})
}
composable<ProfileScreen> { backStackEntry ->
val profileScreen = backStackEntry.toRoute<ProfileScreen>()
ProfileScreen(userId = profileScreen.userId)
}
composable<DetailScreen> { backStackEntry ->
val detailScreen = backStackEntry.toRoute<DetailScreen>()
DetailScreen(itemId = detailScreen.itemId)
}
}