Android使用新API设置状态栏颜色和字体图标深浅模式

475 阅读1分钟

Android使用新API设置状态栏颜色和字体图标深浅模式

1、以下两种旧的使用方式已经过期 在api30 以后不生效。
//方式一、过期API设置状态栏字体颜色-源码重以及标识为Deprecated,使用同样提示过期
@Deprecated
public void setSystemUiVisibility(int visibility) {
     throw new RuntimeException("Stub!");
}

//方式二、过期API设置状态栏字体颜色,getWindowInsetsController()
val controller1 = ViewCompat.getWindowInsetsController(rootView)
controller1?.isAppearanceLightStatusBars = true

查看过期的ViewCompat.getWindowInsetsController()方法源码

image-20241014090838498

建议使用WindowCompat. getInsetsController()方法代替ViewCompat.getWindowInsetsController()

2、以下最新的使用模式,兼容低版本。
//设置状态栏字体颜色,在getInsetsController()方法中传入window,和根布局view
val controller = WindowCompat. getInsetsController(window,rootView)
controller.isAppearanceLightStatusBars = false

//设置状态栏颜色
window.statusBarColor =ContextCompat.getColor(this, R.color.my_light_primary)
3、完整代码如下:
package com.jbk.ladybirddemo

import android.os.Bundle
import android.view.View
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        val rootView:View = findViewById(R.id.main)
        //监听应用视窗变化,根据系统栏(包括状态栏和导航栏)的实际大小调整布局的内边距
        ViewCompat.setOnApplyWindowInsetsListener(rootView) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        //设置状态栏字体颜色,在getInsetsController()方法中传入window,和根布局view
        val controller = WindowCompat. getInsetsController(window,rootView)
        controller.isAppearanceLightStatusBars = false

        //设置状态栏颜色
        window.statusBarColor =ContextCompat.getColor(this, R.color.my_light_primary)
		}
}