Skip to content

Instantly share code, notes, and snippets.

@stevdza-san
Created December 24, 2023 22:33
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save stevdza-san/96ece7172cd328d15b7510374deaab4c to your computer and use it in GitHub Desktop.
Save stevdza-san/96ece7172cd328d15b7510374deaab4c 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