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()方法源码
建议使用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)
}
}