如何在使用Kotlin开发的Android 11应用中隐藏状态栏?
Android 11(API 30+)合规隐藏状态栏的Kotlin实现方案
Android 11之后旧版的窗口标记式隐藏状态栏方法确实已被官方全部标记为废弃,当前可正常运行、无废弃告警的合规方案,是基于AndroidX提供的WindowInsetsControllerCompat实现的官方标准能力,不需要依赖非公开API。
核心实现要点
- 所有窗口栏目的控制逻辑统一通过Insets控制器完成,不再使用已废弃的
WindowManager.LayoutParams标记位 - 使用AndroidX提供的Compat类做版本兼容,不需要手动判断系统版本写分支逻辑,在Android 11及以上系统上会自动调用对应版本的官方实现,不会触发废弃警告
- 可根据业务需要灵活控制状态栏的唤出行为,符合系统交互规范
可直接运行的Kotlin代码示例
确保项目已引入androidx.core:core-ktx基础依赖后,在Activity的setContentView完成后加入以下逻辑:
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_home) // 获取当前窗口的Insets控制器 val insetsController = WindowInsetsControllerCompat(window, window.decorView) // 隐藏状态栏,无API废弃告警 insetsController.hide(WindowInsetsCompat.Type.statusBars()) // 可选配置:设置状态栏交互行为——滑动唤出后短暂显示自动隐藏,适配沉浸式场景 insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } /** * 业务需要时恢复状态栏显示的方法 */ private fun restoreStatusBar() { val insetsController = WindowInsetsControllerCompat(window, window.decorView) insetsController.show(WindowInsetsCompat.Type.statusBars()) } }
注意事项
- 不要在项目中继续使用
FLAG_FULLSCREEN、FLAG_TRANSLUCENT_STATUS这类旧窗口标记,这类标记在API 30及以上版本均已被废弃 - 这套方案除了隐藏状态栏,还可以通过修改传入的insets类型,同时实现隐藏导航栏、控制状态栏图标颜色等衍生能力,和官方推荐的沉浸式交互逻辑完全一致
内容的提问来源于stack exchange,提问作者Rudra Raina
相关产品推荐
相关产品推荐

