沉浸式状态栏这个东西很多人都说过,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;public class StatusBarCompat { private static final int INVALID_VAL = -1 ; private static final int COLOR_DEFAULT = Color.parseColor("#20000000" ); public static void compat (Activity activity, int statusColor) { 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) { 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); 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,预留一个状态栏的位置,否则布局顶端就会出现在状态栏下面,这本来是一个麻烦的东西,但是!为了实现我的需求,可以利用这一点。
只要4.4之上就调用上面的setTranslucentStatus()
方法,这样布局就会从状态栏下面开始绘制,那么我们的drawerLayout的侧边栏顶端也自然会显示在状态栏下面啦
在布局顶端放一个view,宽度就match_parent就好,高度通过getStatusBarHeight(this)
获取然后设置给这个view
代码大致就是下面这样,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));
就好了