Site icon C1CTech

Bottom Navigation in Jetpack Compose Android

&NewLine;<p>This post is about how to add bottom navigation in Jetpack Compose using navigation compose&period;<&sol;p> &NewLine; &NewLine; &NewLine; &NewLine;<div class&equals;"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-a89b3969 wp-block-buttons-is-layout-flex"> &NewLine;<div class&equals;"wp-block-button"><a class&equals;"wp-block-button&lowbar;&lowbar;link has-white-color has-text-color has-background" style&equals;"background-color&colon; &num;1c0274&semi;" href&equals;"https&colon;&sol;&sol;github&period;com&sol;arunk7839&sol;JetpackComposeBottomNavigationExp"><strong>DOWNLOAD<&sol;strong> <strong>CODE<&sol;strong><&sol;a><&sol;div> &NewLine;<&sol;div> &NewLine; &NewLine; &NewLine; &NewLine;<h4> <&sol;h4> &NewLine;<h4><span style&equals;"color&colon; &num;000080&semi;"><strong>Creating New Project<&sol;strong><&sol;span><&sol;h4> &NewLine;<p>1 &period; Create a new project by going to <strong>File &Implies; New Android Project<&sol;strong>&comma; select <strong>Empty Compose Activity<&sol;strong>&comma; provide <strong>app<&sol;strong> name and then finally click on <strong>finish<&sol;strong>&period;<&sol;p> &NewLine;<p>2 &period; Open app-level build&period;gradle file and under the <strong>dependencies<&sol;strong> section add the below navigation-compose library and then <strong>sync<&sol;strong> the project<strong>&colon;<&sol;strong><&sol;p> &NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>build&period;gradle<&sol;strong><&sol;span><&sol;p> &NewLine;<pre>dependencies &lbrace;<br &sol;><strong><span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol;navigation with compose<&sol;span><&sol;strong><br &sol;> implementation&lpar;"androidx&period;navigation&colon;navigation-compose&colon;2&period;4&period;2"&rpar;<br &sol;>&rcub;<&sol;pre> &NewLine;<p>Get the latest navigation-compose dependency from <strong><a href&equals;"https&colon;&sol;&sol;developer&period;android&period;com&sol;jetpack&sol;compose&sol;navigation&num;setup">here<&sol;a><&sol;strong>&period;<&sol;p> &NewLine;<p>3&period; Now create a sealed class with the name <span style&equals;"color&colon; &num;008000&semi;"><strong>NavigationItem<&sol;strong><&sol;span> with bottom navigation item title&comma; item icon&comma; and item route which we will use later for navigation between screens&period;<&sol;p> &NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>NavigationItem&period;kt<&sol;strong><&sol;span><&sol;p> &NewLine;<pre>sealed class NavigationItem&lpar;var route&colon; String&comma; var icon&colon; ImageVector&comma; var title&colon; String&rpar; &lbrace;<br &sol;> object Home &colon; NavigationItem&lpar;"home"&comma; Icons&period;Filled&period;Home&comma; "Home"&rpar;<br &sol;> object Place &colon; NavigationItem&lpar;"place"&comma; Icons&period;Filled&period;Place&comma; "Place"&rpar;<br &sol;> object Favorites &colon; NavigationItem&lpar;"favorites"&comma; Icons&period;Filled&period;Favorite&comma; "Favorites"&rpar;<br &sol;>&rcub;<&sol;pre> &NewLine;<p>4&period; Inside <span style&equals;"color&colon; &num;008000&semi;"><strong>MainActivity&period;kt<&sol;strong><&sol;span> file&comma; create three composable functions <span style&equals;"color&colon; &num;0000ff&semi;"><strong>Home&comma; Place&comma; and Favorites <&sol;strong><&sol;span>which define the screen&&num;8217&semi;s content<strong>&period;<&sol;strong><&sol;p> &NewLine;<pre>&commat;Composable<br &sol;>fun Home&lpar;&rpar; &lbrace;<br &sol;><br &sol;> Box&lpar;<br &sol;> modifier &equals; Modifier&period;fillMaxSize&lpar;&rpar;<br &sol;> &rpar; &lbrace;<br &sol;> Icon&lpar;<br &sol;> imageVector &equals; Icons&period;Filled&period;Home&comma;<br &sol;> contentDescription &equals; "home"&comma;<br &sol;> tint &equals; Color&period;Blue&comma;<br &sol;> modifier &equals; Modifier<br &sol;> &period;size&lpar;150&period;dp&rpar;<br &sol;> &period;align&lpar;Alignment&period;Center&rpar;<br &sol;> &rpar;<br &sol;> &rcub;<br &sol;>&rcub;<br &sol;><br &sol;>&commat;Composable<br &sol;>fun Place&lpar;&rpar; &lbrace;<br &sol;><br &sol;> Box&lpar;<br &sol;> modifier &equals; Modifier&period;fillMaxSize&lpar;&rpar;<br &sol;> &rpar; &lbrace;<br &sol;> Icon&lpar;<br &sol;> imageVector &equals; Icons&period;Filled&period;Place&comma;<br &sol;> contentDescription &equals; "contacts"&comma;<br &sol;> tint &equals; Color&period;Blue&comma;<br &sol;> modifier &equals; Modifier<br &sol;> &period;size&lpar;150&period;dp&rpar;<br &sol;> &period;align&lpar;Alignment&period;Center&rpar;<br &sol;> &rpar;<br &sol;> &rcub;<br &sol;>&rcub;<br &sol;><br &sol;>&commat;Composable<br &sol;>fun Favorites&lpar;&rpar; &lbrace;<br &sol;><br &sol;> Box&lpar;<br &sol;> modifier &equals; Modifier&period;fillMaxSize&lpar;&rpar;<br &sol;> &rpar; &lbrace;<br &sol;> Icon&lpar;<br &sol;> imageVector &equals; Icons&period;Filled&period;Favorite&comma;<br &sol;> contentDescription &equals; "favorites"&comma;<br &sol;> tint &equals; Color&period;Blue&comma;<br &sol;> modifier &equals; Modifier<br &sol;> &period;size&lpar;150&period;dp&rpar;<br &sol;> &period;align&lpar;Alignment&period;Center&rpar;<br &sol;> &rpar;<br &sol;> &rcub;<br &sol;>&rcub;<&sol;pre> &NewLine;<p>5&period; Create a composable function with the name <span style&equals;"color&colon; &num;0000ff&semi;"><strong>NavigationHost<&sol;strong><&sol;span> in MainActivity&period;kt which will contain NavHost and the Composable for navigation&period; <&sol;p> &NewLine;<pre>&commat;Composable<br &sol;>fun NavigationHost&lpar;navController&colon; NavHostController&rpar; &lbrace;<br &sol;> NavHost&lpar;<br &sol;> navController &equals; navController&comma;<br &sol;> startDestination &equals; NavigationItem&period;Home&period;route<br &sol;> &rpar; &lbrace;<br &sol;> composable&lpar;NavigationItem&period;Home&period;route&rpar; &lbrace;<br &sol;> Home&lpar;&rpar;<br &sol;> &rcub;<br &sol;> composable&lpar;NavigationItem&period;Place&period;route&rpar; &lbrace;<br &sol;> Place&lpar;&rpar;<br &sol;> &rcub;<br &sol;> composable&lpar;NavigationItem&period;Favorites&period;route&rpar; &lbrace;<br &sol;> Favorites&lpar;&rpar;<br &sol;> &rcub;<br &sol;> &rcub;<br &sol;>&rcub;<&sol;pre> &NewLine;<p>6&period; Create object <span style&equals;"color&colon; &num;0000ff&semi;"><strong>NavBarItems<&sol;strong><&sol;span>&comma; and define a <strong><span style&equals;"color&colon; &num;008000&semi;">BarItems<&sol;span><&sol;strong> list that contains bottom navigation items&period;<&sol;p> &NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">NavBarItems&period;kt<&sol;span><&sol;strong><&sol;p> &NewLine;<pre>object NavBarItems &lbrace;<br &sol;> val BarItems &equals; listOf&lpar;<br &sol;> NavigationItem&period;Home&comma;<br &sol;> NavigationItem&period;Place&comma;<br &sol;> NavigationItem&period;Favorites&comma;<br &sol;> &rpar;<br &sol;>&rcub;<&sol;pre> &NewLine;<p>7&period; Create a new composable function <strong><span style&equals;"color&colon; &num;0000ff&semi;">BottomNavigationBar<&sol;span><&sol;strong> to define bottom navigation&comma; its item&comma; and handling bottom navigation backstack&period;<&sol;p> &NewLine;<pre>&commat;Composable<br &sol;>fun BottomNavigationBar&lpar;navController&colon; NavHostController&rpar; &lbrace;<br &sol;><br &sol;> BottomNavigation &lbrace;<br &sol;><br &sol;><strong><span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol;observe the backstack<&sol;span><&sol;strong><br &sol;> val backStackEntry by navController&period;currentBackStackEntryAsState&lpar;&rpar;<br &sol;><span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol;observe current route to change the item icon&comma;label when navigated<&sol;strong><&sol;span><br &sol;> val currentRoute &equals; backStackEntry&quest;&period;destination&quest;&period;route<br &sol;><br &sol;> <strong><span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol;bottom nav items we declared<&sol;span><&sol;strong><br &sol;> NavBarItems&period;BarItems&period;forEach &lbrace; navItem -&gt&semi;<br &sol;><br &sol;><strong><span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol;place the bottom nav items<&sol;span><&sol;strong><br &sol;> BottomNavigationItem&lpar;<br &sol;> selected &equals; currentRoute &equals;&equals; navItem&period;route&comma;<br &sol;> onClick &equals; &lbrace;<br &sol;><strong><span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol;navigate on click<&sol;span><&sol;strong><br &sol;> navController&period;navigate&lpar;navItem&period;route&rpar; &lbrace;<br &sol;> popUpTo&lpar;navController&period;graph&period;findStartDestination&lpar;&rpar;&period;id&rpar; &lbrace;<br &sol;> saveState &equals; true<br &sol;> &rcub;<br &sol;> launchSingleTop &equals; true<br &sol;> restoreState &equals; true<br &sol;> &rcub;<br &sol;> &rcub;&comma;<br &sol;><br &sol;><span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol;icon of navItem<&sol;strong><&sol;span><br &sol;> icon &equals; &lbrace;<br &sol;> Icon&lpar;<br &sol;> imageVector &equals; navItem&period;icon&comma;<br &sol;> contentDescription &equals; navItem&period;title<br &sol;> &rpar;<br &sol;> &rcub;&comma;<br &sol;><span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol;label<&sol;strong><&sol;span><br &sol;> label &equals; &lbrace;<br &sol;> Text&lpar;text &equals; navItem&period;title&rpar;<br &sol;> &rcub;&comma;<br &sol;> &rpar;<br &sol;> &rcub;<br &sol;> &rcub;<br &sol;>&rcub;<&sol;pre> &NewLine;<p>8&period; Create a new composable function with <strong><span style&equals;"color&colon; &num;008000&semi;">Scaffold&lpar;&rpar;<&sol;span><&sol;strong> so that you can define the topBar&comma; bottom bar&comma; and content&period;<&sol;p>&NewLine;<&excl;-- WP QUADS Content Ad Plugin v&period; 2&period;0&period;98&period;1 -->&NewLine;<div class&equals;"quads-location quads-ad2" id&equals;"quads-ad2" style&equals;"float&colon;none&semi;margin&colon;0px&semi;">&NewLine;&NewLine;<&sol;div>&NewLine; &NewLine;<pre>&commat;Composable<br &sol;>fun MainScreen&lpar;&rpar; &lbrace;<br &sol;> val navController &equals; rememberNavController&lpar;&rpar;<br &sol;><br &sol;> Scaffold&lpar;<br &sol;> topBar &equals; &lbrace; TopAppBar&lpar;title &equals; &lbrace; Text&lpar;"Bottom Navigation Demo"&rpar; &rcub;&rpar; &rcub;&comma;<br &sol;> content &equals; &lbrace; NavigationHost&lpar;navController &equals; navController&rpar; &rcub;&comma;<br &sol;> bottomBar &equals; &lbrace; BottomNavigationBar&lpar;navController &equals; navController&rpar; &rcub;<br &sol;> &rpar;<br &sol;><br &sol;>&rcub;<&sol;pre> &NewLine;<p>9&period; At last just call the MainScreen&lpar;&rpar; function from onCreate method of your activity&colon;<&sol;p> &NewLine;<pre>override fun onCreate&lpar;savedInstanceState&colon; Bundle&quest;&rpar; &lbrace;<br &sol;> super&period;onCreate&lpar;savedInstanceState&rpar;<br &sol;> setContent &lbrace;<br &sol;> JetpackComposeBottomNavigationExpTheme &lbrace;<br &sol;><span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol; A surface container using the 'background' color from the theme<&sol;strong><&sol;span><br &sol;> Surface&lpar;<br &sol;> modifier &equals; Modifier&period;fillMaxSize&lpar;&rpar;&comma;<br &sol;> color &equals; MaterialTheme&period;colors&period;background<br &sol;> &rpar; &lbrace;<br &sol;> MainScreen&lpar;&rpar;<br &sol;> &rcub;<br &sol;> &rcub;<br &sol;> &rcub;<br &sol;>&rcub;<&sol;pre> &NewLine;<h4><span style&equals;"color&colon; &num;000080&semi;"><strong>Complete MainActivity Code&colon;<&sol;strong><&sol;span><&sol;h4> &NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">MainActivity&period;kt<&sol;span><&sol;strong><&sol;p> &NewLine;<pre>package com&period;c1ctech&period;jetpackcomposebottomnavigationexp<br &sol;><br &sol;>import android&period;os&period;Bundle<br &sol;>import androidx&period;activity&period;ComponentActivity<br &sol;>import androidx&period;activity&period;compose&period;setContent<br &sol;>import androidx&period;compose&period;foundation&period;layout&period;Box<br &sol;>import androidx&period;compose&period;foundation&period;layout&period;fillMaxSize<br &sol;>import androidx&period;compose&period;foundation&period;layout&period;size<br &sol;>import androidx&period;compose&period;material&period;&ast;<br &sol;>import androidx&period;compose&period;material&period;icons&period;Icons<br &sol;>import androidx&period;compose&period;material&period;icons&period;filled&period;Favorite<br &sol;>import androidx&period;compose&period;ui&period;graphics&period;Color<br &sol;>import androidx&period;compose&period;material&period;icons&period;filled&period;Home<br &sol;>import androidx&period;compose&period;material&period;icons&period;filled&period;Place<br &sol;>import androidx&period;compose&period;runtime&period;Composable<br &sol;>import androidx&period;compose&period;runtime&period;getValue<br &sol;>import androidx&period;compose&period;ui&period;Alignment<br &sol;>import androidx&period;compose&period;ui&period;Modifier<br &sol;>import androidx&period;compose&period;ui&period;unit&period;dp<br &sol;>import androidx&period;navigation&period;NavGraph&period;Companion&period;findStartDestination<br &sol;>import androidx&period;navigation&period;NavHostController<br &sol;>import androidx&period;navigation&period;compose&period;NavHost<br &sol;>import androidx&period;navigation&period;compose&period;composable<br &sol;>import androidx&period;navigation&period;compose&period;currentBackStackEntryAsState<br &sol;>import androidx&period;navigation&period;compose&period;rememberNavController<br &sol;>import com&period;c1ctech&period;jetpackcomposebottomnavigationexp&period;ui&period;theme&period;JetpackComposeBottomNavigationExpTheme<br &sol;><br &sol;>class MainActivity &colon; ComponentActivity&lpar;&rpar; &lbrace;<br &sol;> override fun onCreate&lpar;savedInstanceState&colon; Bundle&quest;&rpar; &lbrace;<br &sol;> super&period;onCreate&lpar;savedInstanceState&rpar;<br &sol;> setContent &lbrace;<br &sol;> JetpackComposeBottomNavigationExpTheme &lbrace;<br &sol;><strong><span style&equals;"color&colon; &num;008000&semi;"> &sol;&sol; A surface container using the 'background' color from the theme<&sol;span><&sol;strong><br &sol;> Surface&lpar;<br &sol;> modifier &equals; Modifier&period;fillMaxSize&lpar;&rpar;&comma;<br &sol;> color &equals; MaterialTheme&period;colors&period;background<br &sol;> &rpar; &lbrace;<br &sol;> MainScreen&lpar;&rpar;<br &sol;> &rcub;<br &sol;> &rcub;<br &sol;> &rcub;<br &sol;> &rcub;<br &sol;>&rcub;<br &sol;><br &sol;>&commat;Composable<br &sol;>fun MainScreen&lpar;&rpar; &lbrace;<br &sol;> val navController &equals; rememberNavController&lpar;&rpar;<br &sol;><br &sol;> Scaffold&lpar;<br &sol;> topBar &equals; &lbrace; TopAppBar&lpar;title &equals; &lbrace; Text&lpar;"Bottom Navigation Demo"&rpar; &rcub;&rpar; &rcub;&comma;<br &sol;> content &equals; &lbrace; NavigationHost&lpar;navController &equals; navController&rpar; &rcub;&comma;<br &sol;> bottomBar &equals; &lbrace; BottomNavigationBar&lpar;navController &equals; navController&rpar; &rcub;<br &sol;> &rpar;<br &sol;><br &sol;>&rcub;<br &sol;><br &sol;>&commat;Composable<br &sol;>fun NavigationHost&lpar;navController&colon; NavHostController&rpar; &lbrace;<br &sol;> NavHost&lpar;<br &sol;> navController &equals; navController&comma;<br &sol;> startDestination &equals; NavigationItem&period;Home&period;route<br &sol;> &rpar; &lbrace;<br &sol;> composable&lpar;NavigationItem&period;Home&period;route&rpar; &lbrace;<br &sol;> Home&lpar;&rpar;<br &sol;> &rcub;<br &sol;> composable&lpar;NavigationItem&period;Place&period;route&rpar; &lbrace;<br &sol;> Place&lpar;&rpar;<br &sol;> &rcub;<br &sol;> composable&lpar;NavigationItem&period;Favorites&period;route&rpar; &lbrace;<br &sol;> Favorites&lpar;&rpar;<br &sol;> &rcub;<br &sol;> &rcub;<br &sol;>&rcub;<br &sol;><br &sol;>&commat;Composable<br &sol;>fun BottomNavigationBar&lpar;navController&colon; NavHostController&rpar; &lbrace;<br &sol;><br &sol;> BottomNavigation &lbrace;<br &sol;> val backStackEntry by navController&period;currentBackStackEntryAsState&lpar;&rpar;<br &sol;> val currentRoute &equals; backStackEntry&quest;&period;destination&quest;&period;route<br &sol;><br &sol;> NavBarItems&period;BarItems&period;forEach &lbrace; navItem -&gt&semi;<br &sol;><br &sol;> BottomNavigationItem&lpar;<br &sol;> selected &equals; currentRoute &equals;&equals; navItem&period;route&comma;<br &sol;> onClick &equals; &lbrace;<br &sol;> navController&period;navigate&lpar;navItem&period;route&rpar; &lbrace;<br &sol;> popUpTo&lpar;navController&period;graph&period;findStartDestination&lpar;&rpar;&period;id&rpar; &lbrace;<br &sol;> saveState &equals; true<br &sol;> &rcub;<br &sol;> launchSingleTop &equals; true<br &sol;> restoreState &equals; true<br &sol;> &rcub;<br &sol;> &rcub;&comma;<br &sol;><br &sol;> icon &equals; &lbrace;<br &sol;> Icon&lpar;<br &sol;> imageVector &equals; navItem&period;icon&comma;<br &sol;> contentDescription &equals; navItem&period;title<br &sol;> &rpar;<br &sol;> &rcub;&comma;<br &sol;> label &equals; &lbrace;<br &sol;> Text&lpar;text &equals; navItem&period;title&rpar;<br &sol;> &rcub;&comma;<br &sol;> &rpar;<br &sol;> &rcub;<br &sol;> &rcub;<br &sol;>&rcub;<br &sol;><br &sol;>&commat;Composable<br &sol;>fun Home&lpar;&rpar; &lbrace;<br &sol;><br &sol;> Box&lpar;<br &sol;> modifier &equals; Modifier&period;fillMaxSize&lpar;&rpar;<br &sol;> &rpar; &lbrace;<br &sol;> Icon&lpar;<br &sol;> imageVector &equals; Icons&period;Filled&period;Home&comma;<br &sol;> contentDescription &equals; "home"&comma;<br &sol;> tint &equals; Color&period;Blue&comma;<br &sol;> modifier &equals; Modifier<br &sol;> &period;size&lpar;150&period;dp&rpar;<br &sol;> &period;align&lpar;Alignment&period;Center&rpar;<br &sol;> &rpar;<br &sol;> &rcub;<br &sol;>&rcub;<br &sol;><br &sol;>&commat;Composable<br &sol;>fun Place&lpar;&rpar; &lbrace;<br &sol;><br &sol;> Box&lpar;<br &sol;> modifier &equals; Modifier&period;fillMaxSize&lpar;&rpar;<br &sol;> &rpar; &lbrace;<br &sol;> Icon&lpar;<br &sol;> imageVector &equals; Icons&period;Filled&period;Place&comma;<br &sol;> contentDescription &equals; "contacts"&comma;<br &sol;> tint &equals; Color&period;Blue&comma;<br &sol;> modifier &equals; Modifier<br &sol;> &period;size&lpar;150&period;dp&rpar;<br &sol;> &period;align&lpar;Alignment&period;Center&rpar;<br &sol;> &rpar;<br &sol;> &rcub;<br &sol;>&rcub;<br &sol;><br &sol;>&commat;Composable<br &sol;>fun Favorites&lpar;&rpar; &lbrace;<br &sol;><br &sol;> Box&lpar;<br &sol;> modifier &equals; Modifier&period;fillMaxSize&lpar;&rpar;<br &sol;> &rpar; &lbrace;<br &sol;> Icon&lpar;<br &sol;> imageVector &equals; Icons&period;Filled&period;Favorite&comma;<br &sol;> contentDescription &equals; "favorites"&comma;<br &sol;> tint &equals; Color&period;Blue&comma;<br &sol;> modifier &equals; Modifier<br &sol;> &period;size&lpar;150&period;dp&rpar;<br &sol;> &period;align&lpar;Alignment&period;Center&rpar;<br &sol;> &rpar;<br &sol;> &rcub;<br &sol;>&rcub;<&sol;pre> &NewLine;<p>When you run the app it will look like this&colon;<&sol;p> &NewLine;<p><img class&equals;"alignnone wp-image-3278" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2022&sol;05&sol;Screenshot&lowbar;2022-05-30-21-08-51-620&lowbar;com&period;c1ctech&period;jetpackcomposebottomnavigationexp1-473x1024&period;png" alt&equals;"" width&equals;"246" height&equals;"532" &sol;>    <img class&equals;"alignnone wp-image-3279" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2022&sol;05&sol;Screenshot&lowbar;2022-05-30-21-08-56-541&lowbar;com&period;c1ctech&period;jetpackcomposebottomnavigationexp1-473x1024&period;png" alt&equals;"" width&equals;"247" height&equals;"535" &sol;>    <img class&equals;"alignnone wp-image-3280" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2022&sol;05&sol;Screenshot&lowbar;2022-05-30-21-09-05-193&lowbar;com&period;c1ctech&period;jetpackcomposebottomnavigationexp1-473x1024&period;png" alt&equals;"" width&equals;"248" height&equals;"537" &sol;>&NewLine;

Exit mobile version