안드로이드 Compose
[Android] Compose Bottom NavigationBar
딤제
2024. 8. 28. 16:17
안드로이드 compose에서 Bottom NavigationBar를 사용해보겠습니다.
먼저 navigation을 통해 전환할 화면들을 정의했습니다.
sealed class Screen(val route: String, val title: String, val icon: ImageVector) {
object Home : Screen("home", "Home", Icons.Filled.Home)
object Add : Screen("add", "Add", Icons.Filled.Add)
object Settings : Screen("settings", "Settings", Icons.Filled.Settings)
}
@Composable
fun currentRoute(navController: NavController): String? {
val navBackStackEntry by navController.currentBackStackEntryAsState()
return navBackStackEntry?.destination?.route
}
@Composable
fun BottomNavigationBar(navController: NavController){
val items = listOf(
Screen.Home,
Screen.Add,
Screen.Settings
)
NavigationBar(
modifier = Modifier
.height(60.dp),
containerColor = Color.White,
) {
val currentRoute = currentRoute(navController)
items.forEach { screen ->
NavigationBarItem(
icon = { Icon(imageVector = screen.icon, contentDescription = screen.title) },
selected = currentRoute == screen.route,
onClick = {
navController.navigate(screen.route) {
popUpTo(navController.graph.findStartDestination().id) {
//현재 화면에서 popUpTo 대상 화면까지의 모든 컴포저블의 상태가 저장
saveState = true
}
//Intent.FLAG_ACTIVITY_SINGLE_TOP과 비슷한 기능
launchSingleTop = true
//navigate 대상 화면의 ID와 일치하는 저장된 상태가 있는 경우 해당 상태를 복원
restoreState = true
}
}
)
}
}
}
BottomNavigationBar를 생성하는 composable 함수입니다.
NavigationBar 컴포저블을 사용하며 icon, onClick, label등을 설정할 수 있습니다.
@Composable
fun Navigation(navController: NavHostController, innerPadding: PaddingValues) {
NavHost(navController, startDestination = Screen.Home.route, modifier = Modifier.padding(innerPadding)) {
composable(Screen.Home.route) {
HomeScreen()
}
composable(Screen.Add.route) {
AddScreen()
}
composable(Screen.Settings.route) {
SettingsScreen()
}
}
}
실제 화면전환 로직을 수행하는 부분입니다.
초기화면과 각 목적지별 실행할 컴포저블을 정의합니다.
setContent {
val navController = rememberNavController()
FoodTruckTheme {
Scaffold(modifier = Modifier.fillMaxSize(),
bottomBar = {
BottomNavigationBar(navController = navController)
}
) {
Navigation(navController,it)
}
}
}
Scaffold의 bottomBar 속성으로 NavigationBar를 설정할 수 있습니다.