feat(ui): add bottom navigation with 4 tabs
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
32
app/src/main/java/com/radiola/ui/navigation/BottomNavBar.kt
Normal file
32
app/src/main/java/com/radiola/ui/navigation/BottomNavBar.kt
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user