public class StatusBarUtil {
public static void setStatusBarColor(Activity activity, int color) {
//5.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().setStatusBarColor(color);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//4.4-5.0之间
//思路,先把整个布局变成全屏,然后给statusBar的位置放一个布局
//设置全屏
// 这样写阻挡住了statusBar的内容
// activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//初始化要添加的view
View view = new View(activity);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusHeight(activity));
view.setLayoutParams(layoutParams);
view.setBackgroundColor(color);
//添加到DecorView中
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(view);
//避免在xml中设置 android:fitsSystemWindows="true"
//DecorView会加载一个android.R.layout.screen_simple的LinearLayout布局
//LinearLayout里面加载了一个android.R.id.content的FrameLayout布局
//这个content就是放置activity布局的容器,这里我们跨过一层,直接找到content
ViewGroup contentView = activity.findViewById(android.R.id.content);
contentView.setFitsSystemWindows(true);
//或者 设置statusBar高的上padding
//contentView.setPadding(0,getStatusHeight(activity),0,0);
}
//4.4以下处理不了
}
//这部分是核心,需要去看源码,获得id
private static int getStatusHeight(Activity activity) {
int id = activity.getResources().getIdentifier("status_bar_height","dimen","android");
return activity.getResources().getDimensionPixelOffset(id);
}
}
这里再总结一下,我们看到屏幕的层次,以我们上面代码的思路来说,从上到下的顺序为
Window >>>> DecorView >>>>LinearLayout(R.layout.screen_simple)>>>> FrameLayout(android.R.id.content) >>>> Activity
我们利用系统id获得到高度,所设置的View是放置在了DecoView中,这时view其实是遮挡住content容器上面部分自己本身高度的,调整之后就可以了。