title: 讓側(cè)邊欄被拉出的時候出現(xiàn)在狀態(tài)欄下面
date: 2016-11-09 10:33:27
tags: problems
- 沉浸式狀態(tài)欄這個東西很多人都說過,4.4開始可以設(shè)置透明狀態(tài)欄了,5.0開始可以直接設(shè)置狀態(tài)欄顏色了,所以基本思路就是:5.0直接改就好了,4.4就是設(shè)置成透明的,然后在填充一個view放在狀態(tài)欄下面,基本代碼就是下面這樣了(摘自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");
/**
* 狀態(tài)欄變色,那么5.0直接設(shè)置,4.4設(shè)置狀態(tài)欄透明后,給decorView設(shè)置一個有顏色的view填充進(jìn)去
* @param activity ...控制的activity
* @param statusColor 狀態(tài)欄的顏色
*/
public static void compat(Activity activity, int statusColor) {
//5.0以上可以直接設(shè)置狀態(tài)欄顏色
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以上要設(shè)置狀態(tài)欄透明
setTranslucentStatus(activity);
int color = COLOR_DEFAULT;
if (statusColor != INVALID_VAL) {
color = statusColor;
}
//在給整個頁面頂端設(shè)置一個有顏色的色塊
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);
// 設(shè)置Activity layout的fitsSystemWindows
View contentChild = contentView.getChildAt(0);
contentChild.setFitsSystemWindows(true);
}
}
/**
* 設(shè)置一個透明的黑色狀態(tài)欄
* */
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;
}
}
但是我現(xiàn)在的需求是這樣,

平時狀態(tài)欄是一種顏色,側(cè)邊欄拉出來的時候,狀態(tài)欄也要變色。
這里先說一個tips,如果設(shè)置了狀態(tài)欄透明的話,要給布局加上fitSystemWindows=true,預(yù)留一個狀態(tài)欄的位置,否則布局頂端就會出現(xiàn)在狀態(tài)欄下面,這本來是一個麻煩的東西,但是!為了實現(xiàn)我的需求,可以利用這一點。
只要4.4之上就調(diào)用上面的
setTranslucentStatus()方法,這樣布局就會從狀態(tài)欄下面開始繪制,那么我們的drawerLayout的側(cè)邊欄頂端也自然會顯示在狀態(tài)欄下面啦在布局頂端放一個view,寬度就match_parent就好,高度通過
getStatusBarHeight(this)獲取然后設(shè)置給這個view-
代碼大致就是下面這樣,placeHolder就是布局頂端的那個view了
StatusBarCompat.setTranslucentStatus(this); ViewGroup.LayoutParams params = placeHolder.getLayoutParams(); params.height = StatusBarCompat.getStatusBarHeight(this); placeHolder.setLayoutParams(params);?
而只有主頁有側(cè)邊欄,需要這么做,其他的activity都可以繼承自baseActivity,在baseActivity里設(shè)置一句
StatusBarCompat.compat(this,getResources().getColor(R.color.status_bar_color));就好了