feat(ui): add bottom navigation with 4 tabs

This commit is contained in:
nk
2026-06-01 12:23:27 +03:00
parent cf79af5273
commit c46a865742
3 changed files with 88 additions and 1 deletions

View File

@@ -4,15 +4,47 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.ui.Modifier
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.radiola.ui.navigation.BottomNavBar
import com.radiola.ui.navigation.NavDestinations
import com.radiola.ui.theme.RadiolaTheme
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
RadiolaTheme {
// TODO: Navigation will go here
val navController = rememberNavController()
Scaffold(
bottomBar = { BottomNavBar(navController) }
) { paddingValues ->
NavHost(
navController = navController,
startDestination = NavDestinations.Stations.route,
modifier = Modifier.padding(paddingValues)
) {
composable(NavDestinations.Stations.route) {
// TODO: StationsScreen
}
composable(NavDestinations.Favorites.route) {
// TODO: FavoritesScreen
}
composable(NavDestinations.History.route) {
// TODO: HistoryScreen
}
composable(NavDestinations.Settings.route) {
// TODO: SettingsScreen
}
}
}
}
}
}

View File

@@ -0,0 +1,32 @@
package com.radiola.ui.navigation
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import androidx.navigation.compose.currentBackStackEntryAsState
@Composable
fun BottomNavBar(navController: NavController) {
val currentRoute = navController.currentBackStackEntryAsState().value?.destination?.route
NavigationBar {
NavDestinations.items.forEach { destination ->
NavigationBarItem(
icon = { Icon(destination.icon, contentDescription = destination.labelRes) },
label = { Text(destination.labelRes) },
selected = currentRoute == destination.route,
onClick = {
if (currentRoute != destination.route) {
navController.navigate(destination.route) {
popUpTo(navController.graph.startDestinationId) { saveState = true }
launchSingleTop = true
restoreState = true
}
}
}
)
}
}
}

View File

@@ -0,0 +1,23 @@
package com.radiola.ui.navigation
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.filled.History
import androidx.compose.ui.graphics.vector.ImageVector
sealed class NavDestinations(
val route: String,
val labelRes: String,
val icon: ImageVector
) {
data object Stations : NavDestinations("stations", "Радио", Icons.Default.Home)
data object Favorites : NavDestinations("favorites", "Избранное", Icons.Default.Favorite)
data object History : NavDestinations("history", "История", Icons.Default.History)
data object Settings : NavDestinations("settings", "Настройки", Icons.Default.Settings)
companion object {
val items = listOf(Stations, Favorites, History, Settings)
}
}