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

