首先将styles文件的AppTheme改为无标题栏 即:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
一、Android
1.状态栏背景图片的延伸:首先设置实现方法 fullScreen()
* 通过设置全屏,设置状态栏透明
private void fullScreen(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色
Window window = activity.getWindow();
View decorView = window.getDecorView();
//两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
Window window = activity.getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
attributes.flags |= flagTranslucentStatus;
window.setAttributes(attributes);
再次在Activity中调用该方法
2.状态栏背景颜色的设置: 首先创建实现方法 initSystemBar()
* 状态栏
*themeBg:颜色值(在color设置直接调用即可)
@SuppressLint("InlinedApi")
public void initSystemBar(Context mContext, int themeBg) {
if (Build.VERSION.SDK_INT >= 21) {
Window window = getWindow();
//取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏颜色
window.setStatusBarColor(ContextCompat.getColor(mContext, themeBg));
//状态栏颜色接近于白色,文字图标变成黑色
View decor = window.getDecorView();
int ui = decor.getSystemUiVisibility();
//light --> a|=b的意思就是把a和b按位或然后赋值给a, 按位或的意思就是先把a和b都换成2进制,然后用或操作,相当于a=a|b
ui = ui | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
decor.setSystemUiVisibility(ui);
再次在Activity的onCreate方法中调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initSystemBar(MainActivity2.this ,R.color.colorAccent);
二、Kotlin
2.1.设置状态栏背景图片
* 沉浸式状态栏
@SuppressLint("ObsoleteSdkInt")
fun initState() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.0 全透明实现
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.setStatusBarColor(Color.TRANSPARENT)
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//4.4 全透明状态栏
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
再次该方法需要在setContentView()方法之前调用(同上)
2.2.设置状态栏背景颜色方法
fun initSystemBar(isLight: Boolean, themeBg: Int) {
if (Build.VERSION.SDK_INT >= 21) {
val window = window
//取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
//需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
//设置状态栏颜色
if (isLight) {
window.statusBarColor = ContextCompat.getColor(mContext, themeBg)
} else {
window.statusBarColor = ContextCompat.getColor(mContext, R.color.transparent)
//状态栏颜色接近于白色,文字图标变成黑色
val decor = window.decorView
var ui = decor.systemUiVisibility
ui = if (isLight) {
//light --> a|=b的意思就是把a和b按位或然后赋值给a, 按位或的意思就是先把a和b都换成2进制,然后用或操作,相当于a=a|b
ui or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
} else {
//dark --> &是位运算里面,与运算, a&=b相当于 a = a&b, ~非运算符
ui and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
decor.systemUiVisibility = ui
再次调用方式同上
这样我们就可以完成各种状态栏的设置了,可以很好地匹配我们不同Activity了。对你有所帮助请点赞!!!