Android Compose Preview中Text与状态栏重叠,设备显示正常求助
问题
使用Android Studio(Panda 4 | 2025.3.4 Patch 1)创建首个Compose项目,选择Empty Activity后未编写任何代码。在设备上运行时,"Hello Android!"正常显示在屏幕左上角;但在Mac端开启showSystemUi = true的Preview中,文本与状态栏发生重叠。自动生成的代码如下:
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { ComposeDemoTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> Greeting( name = "Android", modifier = Modifier.padding(innerPadding) ) } } } } } @Composable fun Greeting(name: String, modifier: Modifier = Modifier) { Text( text = "Hello $name!", modifier = modifier ) } @Preview(showSystemUi = true) @Composable fun GreetingPreview() { ComposeDemoTheme { Greeting("Android") } }
解决方案
问题出在Preview代码与Activity的适配逻辑不一致:
- Activity中调用了
enableEdgeToEdge()开启全屏适配,同时通过Scaffold的innerPadding自动处理了状态栏、导航栏的间距,确保内容不会被系统UI遮挡。 - 但你的Preview直接渲染
Greeting组件,既没有开启Edge-to-Edge适配,也没有添加对应的间距,导致文本和状态栏重叠。
有两种修复方式:
方式一:与Activity保持完全一致的结构
修改Preview代码,加入enableEdgeToEdge和Scaffold,复用Activity的适配逻辑:
@Preview(showSystemUi = true) @Composable fun GreetingPreview() { ComposeDemoTheme { // 启用Edge-to-Edge适配,和Activity逻辑对齐 SideEffect { val window = (LocalContext.current as Activity).window enableEdgeToEdge(window = window) } Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> Greeting( name = "Android", modifier = Modifier.padding(innerPadding) ) } } }
方式二:仅添加状态栏间距(简化版)
如果不需要完整的Edge-to-Edge效果,直接给Greeting添加状态栏高度的顶部内边距即可:
@Preview(showSystemUi = true) @Composable fun GreetingPreview() { ComposeDemoTheme { Greeting( name = "Android", modifier = Modifier.padding(top = WindowInsets.statusBars.asPaddingValues().calculateTopPadding()) ) } }
内容的提问来源于stack exchange,提问作者Simon W
相关产品推荐
相关产品推荐

