You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:57:28