在很多应用中都可以看到 BottomNavigtionBar,那如何在 Compose 中实现底部导航呢。
添加 navigation-compose 依赖
implementation "androidx.navigation:navigation-compose:2.4.0-alpha07"
创建用于切换的 Screens
@Composable
fun HomeScreen() {
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.White),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Icon(
imageVector = Icons.Default.Home,
contentDescription = "home",
tint = Purple700
)
Text(text = "Home", color = Color.Black)
}
}
@Composable
fun ProfileScreen() {
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.White),
// parameters set to place the items in center
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Icon(
imageVector = Icons.Default.Person,
contentDescription = "Profile",
tint = Purple700
)
Text(text = "Profile", color = Color.Black)
}
}
创建 BottomNavItem
首先创建 data class 用于保存导航项的 icon
label
route
data class BottomNavItem(
val label: String,
val icon: ImageVector,
val route:String,
)
创建导航项列表
object Constants {
val BottomNavItems = listOf(
BottomNavItem(
label = "Home",
icon = Icons.Filled.Home,
route = "home"
),
BottomNavItem(
label = "Profile",
icon = Icons.Filled.Person,
route = "profile"
)
)
}
创建 NavHostContainer
@Composable
fun NavHostContainer(
navController: NavHostController,
padding: PaddingValues
) {
NavHost(
navController = navController,
// set the start destination as home
startDestination = "home",
// Set the padding provided by scaffold
modifier = Modifier.padding(paddingValues = padding),
builder = {
// route : Home
composable("home") {
HomeScreen()
}
// route : profile
composable("profile") {
ProfileScreen()
}
}
)
}
创建底部导航 BottomNavigationBar
@Composable
fun BottomNavigationBar(navController: NavController) {
BottomNavigation(
backgroundColor = Color.White,
) {
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route
Constants.BottomNavItems.forEach { navItem ->
BottomNavigationItem(
selected = currentRoute == navItem.route,
onClick = {
navController.navigate(navItem.route)
},
icon = {
Icon(imageVector = navItem.icon, contentDescription = navItem.label)
},
label = {
Text(text = navItem.label)
}
)
}
}
}
设置到 Scaffold 里
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Surface(color = Color.White) {
val navController = rememberNavController()
Scaffold(
bottomBar = {
BottomNavigationBar(navController = navController)
}, content = { padding ->
NavHostContainer(navController = navController, padding = padding)
}
)
}
}
}
}