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

Android 15状态栏颜色修改:替代废弃的window.statusBarColor方法

Android 15 状态栏颜色设置替代方案

兼容所有版本的实现(推荐)

该方案同时支持Android 14及更早版本、Android 15+,通过WindowInsetsCompat和动态添加背景View的方式实现:

import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val window = window
        val decorView = window.decorView

        // 配置状态栏透明,允许布局延伸至状态栏区域
        ViewCompat.getWindowInsetsController(decorView)?.apply {
            window.setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
            )
            // 如需浅色状态栏文字,取消下方注释
            // setSystemBarsAppearance(
            //     WindowInsetsControllerCompat.APPEARANCE_LIGHT_STATUS_BARS,
            //     WindowInsetsControllerCompat.APPEARANCE_LIGHT_STATUS_BARS
            // )
        }

        // 创建状态栏背景View并设置颜色(可替换为Color.GREEN)
        val statusBarBgView = View(this).apply {
            setBackgroundColor(Color.RED)
        }

        // 将背景View添加到DecorView
        val layoutParams = androidx.constraintlayout.widget.ConstraintLayout.LayoutParams(
            androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.MATCH_PARENT,
            0
        ).apply {
            gravity = Gravity.TOP
        }
        decorView.addView(statusBarBgView, layoutParams)

        // 监听Insets变化,动态调整背景View高度匹配状态栏实际高度
        ViewCompat.setOnApplyWindowInsetsListener(decorView) { _, insets ->
            val statusBarHeight = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top
            layoutParams.height = statusBarHeight
            statusBarBgView.layoutParams = layoutParams
            insets
        }
    }
}

Android 15+ 原生API实现

如果仅需适配Android 15及以上版本,可直接使用原生WindowInsets API:

import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.view.Gravity
import android.view.View
import android.view.WindowInsets
import android.view.WindowInsetsController
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val window = window
        val decorView = window.decorView

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
            // Android 15+ 配置状态栏透明
            window.insetsController?.apply {
                setSystemBarsAppearance(0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)
                window.statusBarColor = Color.TRANSPARENT
            }

            // 创建状态栏背景View并设置颜色(这里设为绿色)
            val statusBarBgView = View(this).apply {
                setBackgroundColor(Color.GREEN)
            }

            // 初始化背景View布局参数
            val layoutParams = androidx.constraintlayout.widget.ConstraintLayout.LayoutParams(
                androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.MATCH_PARENT,
                window.insets.getInsets(WindowInsets.Type.statusBars()).top
            ).apply {
                gravity = Gravity.TOP
            }
            decorView.addView(statusBarBgView, layoutParams)

            // 监听Insets变化,更新背景View高度
            decorView.setOnApplyWindowInsetsListener { _, insets ->
                val statusBarHeight = insets.getInsets(WindowInsets.Type.statusBars()).top
                layoutParams.height = statusBarHeight
                statusBarBgView.layoutParams = layoutParams
                insets
            }
        } else {
            // 旧版本兼容逻辑
            window.statusBarColor = Color.RED
        }
    }
}

注意事项

  • 确保Activity主题中配置了<item name="android:statusBarColor">@android:color/transparent</item>,避免默认状态栏背景遮挡自定义View。
  • 如果需要状态栏文字为浅色(如白色文字配深色背景),需调用setSystemBarsAppearance方法传入APPEARANCE_LIGHT_STATUS_BARS参数。
  • 若使用Fragment,可将上述逻辑放在onViewCreated方法中,以requireActivity().window获取Window对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:55:14