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

如何在Jetpack Compose中彻底移除状态栏并让Composable界面全屏延伸?

如何在Jetpack Compose中彻底移除状态栏并让Composable界面全屏延伸?

嘿,我明白你遇到的问题了——用Accompanist的SystemUiController隐藏状态栏后出现黑条,没法让界面真正全屏延伸对吧?我之前也踩过这个坑,给你分享个靠谱的解决方案:

核心问题所在

你之前的代码只是隐藏了状态栏的内容,但系统依然为状态栏保留了占位空间,所以才会出现黑条。要实现真正的全屏(让Composable直接延伸到状态栏区域),需要同时从Activity层面配置Window属性,再结合Compose的控制逻辑。

具体实现步骤

1. 在Activity中配置Window全屏标志

打开你的MainActivity,在onCreate方法里先设置Window的全屏相关标志,让Activity布局可以延伸到系统UI的区域:

import android.view.View
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // 允许布局延伸到状态栏和导航栏区域
        window.setFlags(
            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        )
        
        // 隐藏状态栏和导航栏,并设置沉浸式模式(可选,根据需求调整)
        window.decorView.systemUiVisibility = (
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                or View.SYSTEM_UI_FLAG_FULLSCREEN
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        )

        setContent {
            // 你的Compose应用内容
            YourAppTheme {
                // ... 你的界面Composable
            }
        }
    }
}

2. 结合Accompanist的SystemUiController确保系统UI隐藏

在你的Composable界面里,继续用SystemUiController来控制状态栏和导航栏的可见性,确保状态一致:

import com.google.accompanist.systemuicontroller.rememberSystemUiController

@Composable
fun YourScreen() {
    val systemUiController = rememberSystemUiController()
    
    // 用LaunchedEffect确保只执行一次
    LaunchedEffect(Unit) {
        systemUiController.isStatusBarVisible = false
        systemUiController.isNavigationBarVisible = false
    }
    
    // 这里写你的界面内容,比如带背景色的Box
    Box(
        modifier = Modifier.fillMaxSize().background(Color.Yellow)
    ) {
        // ... 界面元素
    }
}

为什么这样能解决你的需求?

  • 设置FLAG_LAYOUT_NO_LIMITS后,Activity的布局会直接覆盖整个屏幕,包括原来状态栏和导航栏的区域,再也不会有黑条占位。
  • 你的Composable背景色会自动延伸到状态栏区域,完美适配不同屏幕的背景色需求,不用单独设置状态栏颜色,实现完全的视觉统一。
  • SYSTEM_UI_FLAG_IMMERSIVE_STICKY是可选的,它能让用户从屏幕边缘滑动时临时呼出系统UI,之后自动隐藏,适合沉浸式应用的体验;如果不需要这个特性,可以去掉这个标志。

额外提示

如果你只需要隐藏状态栏而保留导航栏,或者反过来,只需要调整window.decorView.systemUiVisibility和SystemUiController里的对应参数就行,灵活度很高。

备注:内容来源于stack exchange,提问作者Nontas Papadopoulos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:59:32