Jetpack Compose如何设置Tab组件的初始启动选中页面
问题现象
应用启动后默认展示索引为0的相机页面(Camera Screen),预期效果是启动后默认激活索引为1的聊天页面(Chat Screen),对齐WhatsApp的Tab默认选中逻辑。
现有代码运行后始终默认选中相机页,无法达到预期效果。
现有实现代码
Tabs配置:
private val tabs = listOf( TabItem.Camera, TabItem.Chat, TabItem.Status, TabItem.Call )
TabLayout组件代码:
@Composable fun TabLayout( modifier: Modifier = Modifier, tabs: List<TabItem>, selectedIndex: Int = 1, onPageSelected: ((tabItem: TabItem) -> Unit) ) { TabRow( selectedTabIndex = selectedIndex, divider = { } ) { tabs.forEachIndexed{index, tabItem -> Tab( selected = index == selectedIndex, modifier = modifier.background(MaterialTheme.colors.primary), onClick = { onPageSelected(tabItem) }, text = { if (tabItem == TabItem.Camera) { Icon(painter = painterResource(id = R.drawable.ic_camera), stringResource(id = R.string.icon)).toString() } else { Text( text = stringResource(id = tabItem.title).uppercase(Locale.ROOT), style = MaterialTheme.typography.caption, ) } }, ) } } }
组件调用代码:
val pagerState = rememberPagerState() //tab layout TabLayout(tabs = tabs, selectedIndex = pagerState.currentPage , onPageSelected = { tabItem-> coroutineScope.launch { pagerState.animateScrollToPage(tabItem.index) } })
问题根因
你虽然给TabLayout的selectedIndex参数设置了默认值1,但调用组件时显式传入了pagerState.currentPage作为选中索引,这个默认值会被覆盖。而rememberPagerState()不传参数时默认初始化的页码是0,所以最终Tab选中的始终是0索引的相机页。
修复方法
初始化pagerState时显式指定初始页码为1即可,修改调用处代码:
// 指定initialPage = 1,对应聊天页的索引 val pagerState = rememberPagerState(initialPage = 1) // 其余TabLayout调用代码不需要改动 TabLayout(tabs = tabs, selectedIndex = pagerState.currentPage , onPageSelected = { tabItem-> coroutineScope.launch { pagerState.animateScrollToPage(tabItem.index) } })
额外修复提示:当前相机Tab的代码存在错误,
Icon(...).toString()会将Icon对象转为字符串渲染,无法正常显示相机图标,需要删掉末尾的.toString(),才能正确展示相机图标。
内容的提问来源于stack exchange,提问作者Ibramazin
相关产品推荐
相关产品推荐

