Skip to content

Instantly share code, notes, and snippets.

@Y-E-P
Forked from stevdza-san/MainScreen.kt
Created June 7, 2024 11:13
Show Gist options
  • Save Y-E-P/00840efccd872e0fba5bc3667139d2d1 to your computer and use it in GitHub Desktop.
Save Y-E-P/00840efccd872e0fba5bc3667139d2d1 to your computer and use it in GitHub Desktop.
TabRow with HorizontalPager - Jetpack Compose
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material.icons.filled.Person
import androidx.compose.material.icons.filled.ShoppingCart
import androidx.compose.material.icons.outlined.FavoriteBorder
import androidx.compose.material.icons.outlined.Person
import androidx.compose.material.icons.outlined.ShoppingCart
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Tab
import androidx.compose.material3.TabRow
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import kotlinx.coroutines.launch
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
@Composable
fun MainScreen() {
val scope = rememberCoroutineScope()
val pagerState = rememberPagerState(pageCount = { HomeTabs.entries.size })
val selectedTabIndex = remember { derivedStateOf { pagerState.currentPage } }
Scaffold(
topBar = { TopAppBar(title = { Text(text = "Home") }) }
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(top = it.calculateTopPadding())
) {
TabRow(
selectedTabIndex = selectedTabIndex.value,
modifier = Modifier.fillMaxWidth()
) {
HomeTabs.entries.forEachIndexed { index, currentTab ->
Tab(
selected = selectedTabIndex.value == index,
selectedContentColor = MaterialTheme.colorScheme.primary,
unselectedContentColor = MaterialTheme.colorScheme.outline,
onClick = {
scope.launch {
pagerState.animateScrollToPage(currentTab.ordinal)
}
},
text = { Text(text = currentTab.text) },
icon = {
Icon(
imageVector = if (selectedTabIndex.value == index)
currentTab.selectedIcon else currentTab.unselectedIcon,
contentDescription = "Tab Icon"
)
}
)
}
}
HorizontalPager(
state = pagerState,
modifier = Modifier
.fillMaxWidth()
.weight(1f)
) {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text(text = HomeTabs.entries[selectedTabIndex.value].text)
}
}
}
}
}
enum class HomeTabs(
val selectedIcon: ImageVector,
val unselectedIcon: ImageVector,
val text: String
) {
Shop(
unselectedIcon = Icons.Outlined.ShoppingCart,
selectedIcon = Icons.Filled.ShoppingCart,
text = "Shop"
),
Favourite(
unselectedIcon = Icons.Outlined.FavoriteBorder,
selectedIcon = Icons.Filled.Favorite,
text = "Favourite"
),
Profile(
unselectedIcon = Icons.Outlined.Person,
selectedIcon = Icons.Filled.Person,
text = "Profile"
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment