Kotlin中沉浸式状态栏显示布局

方法一

工具类

Kotlin 复制代码
class SetSystemBars {
    companion object{
        fun setupSystemBars(activity: Activity,view: View) {
            // 沉浸式状态栏配置
            WindowCompat.setDecorFitsSystemWindows(activity.window, false)
            activity.window.statusBarColor = Color.TRANSPARENT
            val insetsListener = OnApplyWindowInsetsListener { view, insets ->
                val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
                view.updatePadding(
//                top = systemBars.top,    // 顶部留出状态栏空间
                    bottom = systemBars.bottom,
                    left = systemBars.left,
                    right = systemBars.right
                )
                insets
            }
            ViewCompat.setOnApplyWindowInsetsListener(view, insetsListener)
        }
        fun setupSystemBars2(activity: Activity) {
            (activity as AppCompatActivity).enableEdgeToEdge(
                SystemBarStyle.auto(Color.TRANSPARENT, Color.TRANSPARENT),
                SystemBarStyle.auto(DefaultLightScrim, DefaultDarkScrim))
        }
    }
}

使用

Kotlin 复制代码
//onCreate方法中setContentView下调用
SetSystemBars.setupSystemBars(this,findViewById(R.id.ll_content))//ll_content是Activity的根布局id

方法二

java 复制代码
//activity的onCreate方法中调用
if (supportActionBar != null) {
            supportActionBar!!.hide() // 隐藏 ActionBar
        }
        window.apply {
            // 清除默认标志
            clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
            // 设置状态栏透明
            statusBarColor = Color.TRANSPARENT
            // 让布局延伸到系统栏区域
            decorView.systemUiVisibility = (
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    )
        }
        val insetsListener = OnApplyWindowInsetsListener { view, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            view.updatePadding(
//                top = systemBars.top,    // 顶部留出状态栏空间
                bottom = systemBars.bottom,
                left = systemBars.left,
                right = systemBars.right
            )
            insets
        }
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.ll_content), insetsListener)

说明:两种方法都可实现沉浸式状态栏显示布局,并且布局不会被软键盘遮挡

相关推荐
杉氧18 分钟前
Flutter 跨平台多端适配与 Android/iOS 一键自动化打包发布
android·前端·flutter
Super 含1 小时前
Android 包体积优化(一):APK 到底大在哪里?从 APK 结构到体积分析
android·ide·vscode
Super 含1 小时前
Android 包体积优化(四):深入 ReDex——StripDebugInfo、InterDex 与 DEX 重排
android
安卓与AI研习社2 小时前
主线程明明是空闲的,为什么仍然 ANR?3 个真实 Trace 的证据链复盘
android
恋猫de小郭3 小时前
Dart 3.13 大更新,感觉比 Flutter 更带劲
android·前端·flutter
大锅盖14 小时前
HarmonyOS 6.1.1 ArkWeb:交付门户下载资料前-为什么必须先登记下载代理与来源字段
android·华为·harmonyos
峥嵘life12 小时前
Android16 311Y3 EAP-TLS 网络连接失败分析与修复总结
android·开发语言·人工智能·php
Kapaseker13 小时前
破坏性更新 - 解读 Jetpack Compose 1.12
android·kotlin
雨白13 小时前
我的 UML 学习笔记:结合 Android 实例看懂 4 种常用图表
android·架构
怣疯knight14 小时前
快速判断apk有没有支持16kb页面标准
android