[アンドロイド]Jetpack Component試食-第6話:基準ナビゲーションに切り替える
皆さん、こんにちは、今回の位置付けは上図のように、ベンチマークナビゲーションレイアウトを使って簡単な画面切り替えを行います.
依存オブジェクトの追加
アプリケーション・レベル
build.gradle
に進み、次の依存項目を追加します.implementation "androidx.navigation:navigation-compose:2.4.1"
切り替える各画面の設定各画面を構成するには、MainActivityの下部に結合可能な関数を指定します.
@Composable
fun HomeScreen() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(text = "Home screen")
}
}
@Composable
fun ChatScreen() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(text = "Chat screen")
}
}
@Composable
fun SettingsScreen() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(text = "Settings screen")
}
}
ナビゲーションコントローラの定義初期画面と各画面のルートディレクトリを指定します.
@Composable
fun Navigation(navController: NavHostController) {
NavHost(navController = navController, startDestination = "home") {
composable("home") {
HomeScreen()
}
composable("chat") {
ChatScreen()
}
composable("settings") {
SettingsScreen()
}
}
}
下部コンテンツのデータ・カテゴリの指定下部の内容には、アイコン名、ルート名、アイコン画像、バッジカウントが含まれるため、dataclassパラメータとして定義されます.
import androidx.compose.ui.graphics.vector.ImageVector
data class BottomNavItem (
val name: String,
val route: String,
val icon: ImageVector,
val badgeCount: Int = 0
)
下部ナビゲーションバーの構成下部のナビゲーションレイアウトを構成し、プロジェクトのステータスの変化をスタイル処理します.
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun BottomNavigationBar(
items: List<BottomNavItem>,
navController: NavHostController,
modifier: Modifier = Modifier,
onItemClick: (BottomNavItem) -> Unit
) {
val backStackEntry = navController.currentBackStackEntryAsState()
BottomNavigation (
modifier = modifier,
backgroundColor = Color.DarkGray,
elevation = 5.dp
) {
// items 배열에 담긴 모든 항목을 추가합니다.
items.forEach { item ->
// 뷰의 활동 상태를 백스택에 담아 저장합니다.
val selected = item.route == backStackEntry.value?.destination?.route
BottomNavigationItem(
selected = selected,
onClick = { onItemClick(item) },
selectedContentColor = Color.Green,
unselectedContentColor = Color.Gray,
icon = {
Column(horizontalAlignment = CenterHorizontally) {
// 뱃지카운트가 1이상이면, 아이콘에 뱃지카운트가 표시됩니다.
if (item.badgeCount > 0) {
BadgeBox(
badgeContent = {
Text(text = item.badgeCount.toString())
}
) {
Icon(
imageVector = item.icon,
contentDescription = item.name
)
} // 뱃지 카운트가 0이면, 아이콘만 표시합니다.
} else {
Icon(
imageVector = item.icon,
contentDescription = item.name
)
}
// 아이콘이 선택 되었을 때, 아이콘 밑에 텍스트를 표시합니다.
if (selected) {
Text(
text = item.name,
textAlign = TextAlign.Center,
fontSize = 10.sp
)
}
}
}
)
}
}
}
データムビューをsetContentにオフセット基本設定が終了し、これまで定義したビューをメイン画面に表示します.アイテムリストを定義してNationコントローラに接続すればいいです
scaffold
は、AndroidにUIを追加するためのライブラリであり、ファーストフード店やベンチマークナビゲーションバーが含まれています.class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
Scaffold(
bottomBar = {
BottomNavigationBar(
items = listOf(
BottomNavItem(
name = "Home",
route = "home",
icon = Icons.Default.Home
),
BottomNavItem(
name = "Chat",
route = "chat",
icon = Icons.Default.Notifications,
badgeCount = 24
),
BottomNavItem(
name = "Settings",
route = "settings",
icon = Icons.Default.Settings
)
),
navController = navController,
onItemClick = {
navController.navigate(it.route)
})
}
) {
Navigation(navController = navController)
}
}
}
}
完全なソースコードclass MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
Scaffold(
bottomBar = {
BottomNavigationBar(
items = listOf(
BottomNavItem(
name = "Home",
route = "home",
icon = Icons.Default.Home
),
BottomNavItem(
name = "Chat",
route = "chat",
icon = Icons.Default.Notifications,
badgeCount = 24
),
BottomNavItem(
name = "Settings",
route = "settings",
icon = Icons.Default.Settings
)
),
navController = navController,
onItemClick = {
navController.navigate(it.route)
})
}
) {
Navigation(navController = navController)
}
}
}
}
@Composable
fun Navigation(navController: NavHostController) {
NavHost(navController = navController, startDestination = "home") {
composable("home") {
HomeScreen()
}
composable("chat") {
ChatScreen()
}
composable("settings") {
SettingsScreen()
}
}
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun BottomNavigationBar(
items: List<BottomNavItem>,
navController: NavHostController,
modifier: Modifier = Modifier,
onItemClick: (BottomNavItem) -> Unit
) {
val backStackEntry = navController.currentBackStackEntryAsState()
BottomNavigation(
modifier = modifier,
backgroundColor = Color.DarkGray,
elevation = 5.dp
) {
// items 배열에 담긴 모든 항목을 추가합니다.
items.forEach { item ->
// 뷰의 활동 상태를 백스택에 담아 저장합니다.
val selected = item.route == backStackEntry.value?.destination?.route
BottomNavigationItem(
selected = selected,
onClick = { onItemClick(item) },
selectedContentColor = Color.Green,
unselectedContentColor = Color.Gray,
icon = {
Column(horizontalAlignment = CenterHorizontally) {
// 뱃지카운트가 1이상이면, 아이콘에 뱃지카운트가 표시됩니다.
if (item.badgeCount > 0) {
BadgeBox(
badgeContent = {
Text(text = item.badgeCount.toString())
}
) {
Icon(
imageVector = item.icon,
contentDescription = item.name
)
} // 뱃지 카운트가 0이면, 아이콘만 표시합니다.
} else {
Icon(
imageVector = item.icon,
contentDescription = item.name
)
}
// 아이콘이 선택 되었을 때, 아이콘 밑에 텍스트를 표시합니다.
if (selected) {
Text(
text = item.name,
textAlign = TextAlign.Center,
fontSize = 10.sp
)
}
}
}
)
}
}
}
@Composable
fun HomeScreen() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(text = "Home screen")
}
}
@Composable
fun ChatScreen() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(text = "Chat screen")
}
}
@Composable
fun SettingsScreen() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(text = "Settings screen")
}
}
Reference
この問題について([アンドロイド]Jetpack Component試食-第6話:基準ナビゲーションに切り替える), 我々は、より多くの情報をここで見つけました https://velog.io/@blucky8649/안드로이드-Jetpack-Compose-찍먹-해보기-6편-바텀-네비게이션-으로-간단한-화면전환-해보기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol