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.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge 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 com.radiola.ui.theme.RadiolaTheme
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
RadiolaTheme { 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)
}
}