반응형
0. 위 디렉토리 구조를 따라 아래 1~5번을 순서대로 실행하면 됩니다.
https://github.com/Parksunggyun/BottomNavigationSample
1. Home, Profile, Settings
@Composable
fun HomeScreen() {
Box(
modifier = Modifier.fillMaxSize().background(Color.Red),
contentAlignment = Alignment.Center) {
Text(
text = "HOME",
fontSize = MaterialTheme.typography.h3.fontSize,
fontWeight = FontWeight.Bold,
color = Color.White
)
}
}
@Preview
@Composable
fun HomeScreenPreview() {
BottomNavigationSampleTheme {
HomeScreen()
}
}
@Composable
fun ProfileScreen() {
Box(
modifier = Modifier.fillMaxSize().background(Color.Blue),
contentAlignment = Alignment.Center) {
Text(
text = "PROFILE",
fontSize = MaterialTheme.typography.h3.fontSize,
fontWeight = FontWeight.Bold,
color = Color.White
)
}
}
@Preview
@Composable
fun ProfileScreenPreview() {
BottomNavigationSampleTheme {
ProfileScreen()
}
}
@Composable
fun SettingsScreen() {
Box(
modifier = Modifier.fillMaxSize().background(Color.Green),
contentAlignment = Alignment.Center
) {
Text(
text = "SETTINGS",
fontSize = MaterialTheme.typography.h3.fontSize,
fontWeight = FontWeight.Bold,
color = Color.White
)
}
}
@Preview
@Composable
fun SettingsScreenPreview() {
BottomNavigationSampleTheme {
SettingsScreen()
}
}
2. BottomBarScreen
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.Settings
import androidx.compose.ui.graphics.vector.ImageVector
sealed class BottomBarScreen(
val route: String,
val title: String,
val icon: ImageVector
) {
object Home: BottomBarScreen(
route = "Home",
title = "Home",
icon = Icons.Default.Home
)
object Profile: BottomBarScreen(
route = "Profile",
title = "Profile",
icon = Icons.Default.Person
)
object Settings: BottomBarScreen(
route = "Settings",
title = "Settings",
icon = Icons.Default.Settings
)
}
3. BottomNavGraph
import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import sung.gyun.bottomnavigationsample.screens.HomeScreen
import sung.gyun.bottomnavigationsample.screens.ProfileScreen
import sung.gyun.bottomnavigationsample.screens.SettingsScreen
@Composable
fun BottomNavGraph(navController: NavHostController) {
NavHost(
navController = navController,
startDestination = BottomBarScreen.Home.route
) {
composable(route = BottomBarScreen.Home.route) {
HomeScreen()
}
composable(route = BottomBarScreen.Profile.route) {
ProfileScreen()
}
composable(route = BottomBarScreen.Settings.route) {
SettingsScreen()
}
}
}
4. MainScreen
import android.annotation.SuppressLint
import androidx.compose.foundation.layout.RowScope
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Settings
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.unit.dp
import androidx.navigation.NavDestination
import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
@SuppressLint("UnusedMaterialScaffoldPaddingParameter")
@Composable
fun MainScreen() {
val navController = rememberNavController()
Scaffold(
bottomBar = { BottomBar(navController = navController) }
) {
BottomNavGraph(navController = navController)
}
}
@Composable
fun BottomBar(navController: NavHostController) {
val screens = listOf(
BottomBarScreen.Home,
BottomBarScreen.Profile,
BottomBarScreen.Settings
)
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = navBackStackEntry?.destination
BottomNavigation {
screens.forEach { screen ->
AddItem(
screen = screen,
currentDestination = currentDestination,
navController = navController
)
}
}
}
@Composable
fun RowScope.AddItem(
screen: BottomBarScreen,
currentDestination: NavDestination?,
navController: NavHostController
) {
BottomNavigationItem(
label = {
Text(text = screen.title)
},
icon = {
Icon(
imageVector = screen.icon,
contentDescription = "Navigation Icon"
)
},
selected = currentDestination?.hierarchy?.any {
it.route == screen.route
} == true,
unselectedContentColor = LocalContentColor.current.copy(alpha = ContentAlpha.disabled),
onClick = {
navController.navigate(screen.route) {
popUpTo(navController.graph.findStartDestination().id)
launchSingleTop = true
}
}
)
}
5. MainActivity
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
BottomNavigationSampleTheme {
// A surface container using the 'background' color from the theme
MainScreen()
}
}
}
}
@Preview
@Composable
fun MainScreenPreview() {
BottomNavigationSampleTheme {
MainScreen()
}
}
6. 실행결과
반응형
'안드로이드' 카테고리의 다른 글
[안드로이드/Android] onBackPressed Deprecated (0) | 2023.03.28 |
---|---|
[안드로이드/Android] Compose 에서 onBackPressed = BackHandler (0) | 2023.03.16 |
[안드로이드/Android] Compose TextField maxLength 설정하기 (0) | 2023.03.14 |
[안드로이드/Android] Migration SharedPreferences to EncryptedSharedPreferences (0) | 2023.03.14 |
[Android Compose] 안드로이드 컴포즈에서 Glide 호출하기 (0) | 2023.02.20 |