Jetpack Compose LargeTopAppBar标题重复显示两次问题修复
问题原因
顶部出现两个标题栏的核心原因是应用主题默认开启了系统原生ActionBar:
- 你在Scaffold中配置的
LargeTopAppBar是Jetpack Compose实现的独立顶部栏组件 - 你继承的
MonetCompatActivity属于AppCompatActivity子类,会自动读取主题配置渲染原生ActionBar
两个组件同时加载显示,就会出现顶部重复标题的问题,你贴出的Compose代码本身没有逻辑错误。

修复方案
二选一即可,优先推荐第一种方案,符合Compose项目的标准配置规范。
方案1:修改主题关闭原生ActionBar(推荐)
找到项目res/values目录下对应的主题配置文件(通常为themes.xml),将应用主题的父类替换为不带ActionBar的Material3主题,同时配置关闭ActionBar的属性:
<style name="Theme.TVTime" parent="Theme.Material3.DayNight.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <!-- 其余原有主题属性保持不变即可 --> </style>
修改后系统将不再自动渲染原生ActionBar,所有顶部栏逻辑完全由Compose组件接管,从根源上避免组件冲突。
方案2:代码中手动隐藏ActionBar
如果暂时不想修改主题配置,可以在Activity的onCreate生命周期中,setContent调用之前添加代码手动隐藏原生ActionBar:
@OptIn(ExperimentalMaterial3Api::class) class MainActivity : MonetCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 新增以下行隐藏系统原生ActionBar supportActionBar?.hide() lifecycleScope.launchWhenCreated { monet.awaitMonetReady() setContent { TVTimeTheme(monetCompat = monet) { val decayAnimationSpec = rememberSplineBasedDecay<Float>() val topAppBarScrollState = rememberTopAppBarScrollState() val scrollBehavior = remember(decayAnimationSpec) { TopAppBarDefaults.exitUntilCollapsedScrollBehavior( decayAnimationSpec, topAppBarScrollState ) } Scaffold ( topBar = { LargeTopAppBar( title = { Text(text = "movies") }, scrollBehavior = scrollBehavior ) } ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) } } } } } }
修复完成后重新运行应用,顶部将仅显示你自定义的LargeTopAppBar,重复标题问题消失。
内容的提问来源于stack exchange,提问作者owenlejeune
相关产品推荐
相关产品推荐

