1.导入库
implementation("androidx.navigation:navigation-common:2.8.9")
implementation("androidx.navigation:navigation-compose:2.8.9")
implementation("androidx.compose.material3:material3:1.3.2")
implementation("androidx.compose.material3.adaptive:adaptive:1.1.0")
implementation("androidx.compose.material3.adaptive:adaptive-layout-android:1.1.0")
implementation("androidx.compose.material3.adaptive:adaptive-navigation-android:1.1.0")
implementation("androidx.compose.material3.adaptive:adaptive-navigation:1.1.0")
implementation("androidx.compose.material3:material3-adaptive-navigation-suite:1.3.2")
implementation("androidx.compose.material:material:1.8.0")
implementation("androidx.compose.material:material-icons-extended:1.7.8")
implementation("androidx.compose.material:material-icons-core:1.7.8")
implementation("androidx.compose.material3:material3-window-size-class:1.3.2")
2.示例代码
@Composable
fun SongsScreen(modifier: Modifier = Modifier) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("Songs Screen")
}
}
@Composable
fun AlbumScreen(modifier: Modifier = Modifier) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("Album Screen")
}
}
@Composable
fun PlaylistScreen(modifier: Modifier = Modifier) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("Playlist Screen")
}
}
enum class Destination_Nav(
val route: String,
val label: String,
val icon: ImageVector,
val contentDescription: String
) {
SONGS("songs", "Songs", Icons.Default.MusicNote, "Songs"),
ALBUM("album", "Album", Icons.Default.Album, "Album"),
PLAYLISTS("playlist", "Playlist", Icons.Default.PlaylistAddCircle, "Playlist")
}
@Composable
fun AppNavHost(
navController: NavHostController,
startDestination: Destination_Nav,
modifier: Modifier = Modifier
) {
NavHost(
navController,
startDestination = startDestination.route
) {
Destination_Nav.entries.forEach { destination ->
composable(destination.route) {
when (destination) {
Destination_Nav.SONGS -> SongsScreen()
Destination_Nav.ALBUM -> AlbumScreen()
Destination_Nav.PLAYLISTS -> PlaylistScreen()
}
}
}
}
}
@Composable
fun NavigationRailExample(modifier: Modifier = Modifier) {
val navController = rememberNavController()
val startDestination = Destination_Nav.SONGS
var selectedDestination by rememberSaveable { mutableIntStateOf(startDestination.ordinal) }
Scaffold(modifier = modifier) { contentPadding ->
NavigationRail(modifier = Modifier.padding(contentPadding)) {
Destination_Nav.entries.forEachIndexed { index, destination ->
NavigationRailItem(
selected = selectedDestination == index,
onClick = {
navController.navigate(route = destination.route)
selectedDestination = index
},
icon = {
Icon(
destination.icon,
contentDescription = destination.contentDescription
)
},
label = { Text(destination.label) }
)
}
}
AppNavHost(navController, startDestination)
}
}
3.效果