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

如何在Kotlin Multiplatform中禁用状态栏?

Kotlin Multiplatform 禁用状态栏实现方案

由于状态栏控制属于平台级系统特性,KMM 需要通过 expect/actual 机制在各平台单独实现,共享层统一调用。以下是针对 Android、iOS、Desktop 三个平台的具体实现步骤:

1. 共享层定义期望接口

在共享模块(commonMain)中创建通用的状态栏管理接口,用于跨平台调用:

// commonMain/kotlin/com/yourapp/StatusBarManager.kt
expect object StatusBarManager {
    fun hideStatusBar()
    fun showStatusBar()
}

2. Android 平台实现

在 Android 模块(androidMain)中,通过 Activity 操作窗口标志实现全屏隐藏状态栏:

// androidMain/kotlin/com/yourapp/StatusBarManager.kt
import android.view.WindowManager
import androidx.activity.ComponentActivity

actual object StatusBarManager {
    private var activity: ComponentActivity? = null

    // 在 Activity 初始化时传入实例
    fun init(activity: ComponentActivity) {
        this.activity = activity
    }

    actual fun hideStatusBar() {
        activity?.window?.apply {
            // 开启全屏标志,隐藏状态栏
            setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN
            )
            // 可选:允许布局延伸到状态栏区域(如果需要)
            // addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
        }
    }

    actual fun showStatusBar() {
        activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
    }
}

在你的主 Activity 中初始化并调用:

// MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    StatusBarManager.init(this)
    StatusBarManager.hideStatusBar()
    
    setContent {
        YourAppUI()
    }
}

3. iOS 平台实现

在 iOS 模块(iosMain)中,通过 UIKit 控制状态栏显示状态:

// iosMain/kotlin/com/yourapp/StatusBarManager.kt
import platform.UIKit.UIApplication
import platform.UIKit.UIStatusBarHidden

actual object StatusBarManager {
    actual fun hideStatusBar() {
        UIApplication.sharedApplication.setStatusBarHidden(true, animated = false)
    }

    actual fun showStatusBar() {
        UIApplication.sharedApplication.setStatusBarHidden(false, animated = false)
    }
}

注意:iOS 13+ 还需在对应的 UIViewController 中重写状态判断(可通过 Swift 或 KMM 桥接实现):

override var prefersStatusBarHidden: Bool {
    return true
}

4. Desktop 平台实现

针对 Desktop 平台(以 Compose Multiplatform 为例),通过窗口状态控制标题栏/全屏:

// desktopMain/kotlin/com/yourapp/StatusBarManager.kt
import androidx.compose.ui.window.WindowState

actual object StatusBarManager {
    private var windowState: WindowState? = null

    fun init(windowState: WindowState) {
        this.windowState = windowState
    }

    actual fun hideStatusBar() {
        // 开启全屏模式,隐藏系统标题栏
        windowState?.isFullScreen = true
        // 或者直接隐藏窗口装饰(标题栏):在 Window 中设置 decorated = false
    }

    actual fun showStatusBar() {
        windowState?.isFullScreen = false
    }
}

在 Desktop 主函数中配置:

fun main() = application {
    val windowState = rememberWindowState()
    StatusBarManager.init(windowState)
    
    Window(
        onCloseRequest = ::exitApplication,
        state = windowState,
        decorated = false // 直接隐藏窗口标题栏
    ) {
        StatusBarManager.hideStatusBar()
        YourAppUI()
    }
}

5. 共享层统一调用

在共享 UI 组件中,可直接调用隐藏方法,比如在主界面初始化时:

// commonMain/kotlin/com/yourapp/YourAppUI.kt
@Composable
fun YourAppUI() {
    LaunchedEffect(Unit) {
        StatusBarManager.hideStatusBar()
    }
    
    Image(
        painter = painterResource("main_image.png"),
        contentDescription = "主界面图片",
        modifier = Modifier.fillMaxSize()
    )
}

内容的提问来源于stack exchange,提问作者thegera4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:47:48