参考文章:http://blog.youkuaiyun.com/jdsjlzx/article/details/46778631
1、设置如下代码就可以改变状态栏的颜色,并且布局文件会自动填充到状态栏下面,这是后把状态栏颜色设置成透明就可以看见布局内容
protected void setStateBarColor(int resId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
winParams.flags |= bits;
win.setAttributes(winParams);
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintResource(resId);
// tintManager.setStatusBarDarkMode(true, this);
}
}
2、如果想顶部布局文件自定添加上topPadding 需要给顶部View添加如下属性
android:fitsSystemWindows="true"
android:clipToPadding="true"(不加好像也可以,需要继续研究其作用)
fitSystemWindows解释:
这个一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为true,就会调整view的paingding属性来给system windows留出空间
3、有时候步骤2无法满足要求,需要手动改变顶部布局的高度
/**
* 获取状态栏高度
*
* @param context
* @return
*/
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
if(AndroidSDKVersionUtils.hasKitKat())
{
int statusHeight = getStatusBarHeight(mContext);
FrameLayout flHeader = (FrameLayout) headerView.findViewById(R.id.fl_header);
flHeader.getLayoutParams().height += statusHeight;
FrameLayout flHead = (FrameLayout) headerView.findViewById(R.id.fl_head);
((ViewGroup.MarginLayoutParams)flHead.getLayoutParams()).topMargin += statusHeight;
}
4、DrawerLayout CoordinatorLayout不能设置android:fitsSystemWindows="true", 这样设置的话就不能给状态栏设置透明的,不然显示灰白色,需要给状态栏设置和顶部布局一样的颜色才能保持颜色一致。可以通过给里面的嵌套的布局设置android:fitsSystemWindows="true",比如AppBarLayout,再给状态栏设置透明色。