title: 让侧边栏被拉出的时候出现在状态栏下面
date: 2016-11-09 10:33:27
tags: problems
- 沉浸式状态栏这个东西很多人都说过,4.4开始可以设置透明状态栏了,5.0开始可以直接设置状态栏颜色了,所以基本思路就是:5.0直接改就好了,4.4就是设置成透明的,然后在填充一个view放在状态栏下面,基本代码就是下面这样了(摘自hongyang的博客)
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,预留一个状态栏的位置,否则布局顶端就会出现在状态栏下面,这本来是一个麻烦的东西,但是!为了实现我的需求,可以利用这一点。
只要4.4之上就调用上面的
setTranslucentStatus()
方法,这样布局就会从状态栏下面开始绘制,那么我们的drawerLayout的侧边栏顶端也自然会显示在状态栏下面啦在布局顶端放一个view,宽度就match_parent就好,高度通过
getStatusBarHeight(this)
获取然后设置给这个view-
代码大致就是下面这样,placeHolder就是布局顶端的那个view了
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));
就好了