• 沉浸式状态栏这个东西很多人都说过,4.4开始可以设置透明状态栏了,5.0开始可以直接设置状态栏颜色了,所以基本思路就是:5.0直接改就好了,4.4就是设置成透明的,然后在填充一个view放在状态栏下面,基本代码就是下面这样了(摘自hongyang的博客)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;

/**
* @author xzj
* @date 2016/11/4
*/
public class StatusBarCompat {
private static final int INVALID_VAL = -1;
private static final int COLOR_DEFAULT = Color.parseColor("#20000000");

/**
* 状态栏变色,那么5.0直接设置,4.4设置状态栏透明后,给decorView设置一个有颜色的view填充进去
* @param activity ...控制的activity
* @param statusColor 状态栏的颜色
*/
public static void compat(Activity activity, int statusColor) {
//5.0以上可以直接设置状态栏颜色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) {
if (statusColor != INVALID_VAL) {
activity.getWindow().setStatusBarColor(statusColor);
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
//4.4以上要设置状态栏透明
setTranslucentStatus(activity);
int color = COLOR_DEFAULT;
if (statusColor != INVALID_VAL) {
color = statusColor;
}
//在给整个页面顶端设置一个有颜色的色块
View statusBarView = new View(activity);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(activity));
statusBarView.setBackgroundColor(color);
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
contentView.addView(statusBarView, lp);
// 设置Activity layout的fitsSystemWindows
View contentChild = contentView.getChildAt(0);
contentChild.setFitsSystemWindows(true);
}
}

/**
* 设置一个透明的黑色状态栏
* */
public static void compat(Activity activity) {
compat(activity, INVALID_VAL);
}

public static void setTranslucentStatus(Activity activity) {
Window win = activity.getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if ((winParams.flags & bits) == 0) {
winParams.flags |= bits;
win.setAttributes(winParams);
}
win.setAttributes(winParams);
}

public static int getStatusBarHeight(Activity activity) {
int result = 0;
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = activity.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
}

但是我现在的需求是这样,

平时状态栏是一种颜色,侧边栏拉出来的时候,状态栏也要变色。

这里先说一个tips,如果设置了状态栏透明的话,要给布局加上fitSystemWindows=true,预留一个状态栏的位置,否则布局顶端就会出现在状态栏下面,这本来是一个麻烦的东西,但是!为了实现我的需求,可以利用这一点。

  1. 只要4.4之上就调用上面的setTranslucentStatus()方法,这样布局就会从状态栏下面开始绘制,那么我们的drawerLayout的侧边栏顶端也自然会显示在状态栏下面啦

  2. 在布局顶端放一个view,宽度就match_parent就好,高度通过getStatusBarHeight(this)获取然后设置给这个view

  3. 代码大致就是下面这样,placeHolder就是布局顶端的那个view了

    1
    2
    3
    4
    StatusBarCompat.setTranslucentStatus(this);
    ViewGroup.LayoutParams params = placeHolder.getLayoutParams();
    params.height = StatusBarCompat.getStatusBarHeight(this);
    placeHolder.setLayoutParams(params);

而只有主页有侧边栏,需要这么做,其他的activity都可以继承自baseActivity,在baseActivity里设置一句

StatusBarCompat.compat(this,getResources().getColor(R.color.status_bar_color));就好了