Android Jetpack Compose BottomNavigationBar With Compose Navigation

Include dependencies in Modules's build.gradle

dependencies {
  implementation 'androidx.navigation:navigation-compose:2.4.0-alpha10'
}

Activity

import android.os.Bundleimport androidx.activity.ComponentActivityimport androidx.activity.compose.setContentimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.paddingimport androidx.compose.material.*import androidx.compose.runtime.Composableimport androidx.compose.runtime.getValueimport androidx.compose.ui.Modifierimport androidx.navigation.NavDestination.Companion.hierarchyimport androidx.navigation.NavGraph.Companion.findStartDestinationimport androidx.navigation.compose.NavHostimport androidx.navigation.compose.composableimport androidx.navigation.compose.currentBackStackEntryAsStateimport androidx.navigation.compose.rememberNavControllerimport com.luasoftware.journey.ui.theme.JourneyThemeclass MainActivity : ComponentActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContent {            JourneyApp()        }    }}

Screens

sealed class Screen(val route: String, val label: String, val icon: ImageVector) {    object Home : Screen("home", "Home", Icons.Filled.Home)    object Collections : Screen("collection", "Collections", Icons.Filled.List)    object UserProfile : Screen("user_profile", "Profile", Icons.Filled.AccountCircle)}@Composablefun HomeScreen() {    Text(text = "Home")}@Composablefun CollectionsScreen() {    Text(text = "Collections")}@Composablefun UserProfileScreen() {    Text(text = "Profile")}

Main Compose

@Composablefun JourneyApp() {    JourneyTheme {        val navController = rememberNavController()        val screens = listOf(            Screen.Home,            Screen.Collections,            Screen.UserProfile        )        // https://developer.android.com/jetpack/compose/navigation        Scaffold(            bottomBar = {                BottomNavigation {                    val navBackStackEntry by navController.currentBackStackEntryAsState()                    val currentDestination = navBackStackEntry?.destination                    screens.forEach { screen ->                        BottomNavigationItem(                            icon = { Icon(imageVector = screen.icon, contentDescription = screen.label) },                            label = { Text(screen.label) },                            selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true,                            onClick = {                                navController.navigate(screen.route) {                                    // Pop up to the start destination of the graph to                                    // avoid building up a large stack of destinations                                    // on the back stack as users select items                                    popUpTo(navController.graph.findStartDestination().id) {                                        saveState = true                                    }                                    // Avoid multiple copies of the same destination when                                    // reselecting the same item                                    launchSingleTop = true                                    // Restore state when reselecting a previously selected item                                    restoreState = true                                }                            }                        )                    }                }            }        ) { innerPadding ->            Box(modifier = Modifier.padding(innerPadding)) {                // nav graph                NavHost(navController = navController, startDestination = Screen.Home.route) {                    composable(Screen.Home.route) { HomeScreen() }                    composable(Screen.Collections.route) { CollectionsScreen() }                    composable(Screen.UserProfile.route) { UserProfileScreen() }                }            }        }    }}

References:

❤️ Is this article helpful?

Buy me a coffee ☕ or support my work via PayPal to keep this space 🖖 and ad-free.

Do send some 💖 to @d_luaz or share this article.

✨ By Desmond Lua

A dream boy who enjoys making apps, travelling and making youtube videos. Follow me on @d_luaz

👶 Apps I built

Travelopy - discover travel places in Malaysia, Singapore, Taiwan, Japan.