如何在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
相关产品推荐
相关产品推荐

