***(非常有用)沉浸式策略——取消状态栏/导航栏显示
***(非常有用)Android 沉浸式状态栏完美解决方案
针对系统5.0以上
目标1:让标题栏和状态栏颜色融合为一体,高度不变
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int color= Resources.getSystem().getColor(android.R.color.holo_green_light);
StatusBarUtil.setStatusBarColor(this,color);
}
目标2:让图片填满整个屏幕
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StatusBarUtil.cancelStatusBarHeight(this);
}
目标3:让图片充满屏幕后,重新显示状态栏,并设置状态栏颜色
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StatusBarUtil.cancelStatusBarHeight(this);
StatusBarUtil.setRootViewFitsSystemWindows(this,true);
int color= ContextCompat.getColor(this,android.R.color.holo_green_light);
StatusBarUtil.setStatusBarColor(this, color);
}
statusBarUtil文件
/**
* 设置状态栏透明,取消状态栏高度,让布局占据状态栏空间
*/
@TargetApi(19)
public static void cancelStatusBarHeight(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色
Window window = activity.getWindow();
View decorView = window.getDecorView();
//两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
//导航栏颜色也可以正常设置
//window.setNavigationBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = activity.getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
attributes.flags |= flagTranslucentStatus;
//int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
//attributes.flags |= flagTranslucentNavigation;
window.setAttributes(attributes);
}
}
/**
* 代码实现android:fitsSystemWindows
*
* @param activity
*/
public static void setRootViewFitsSystemWindows(Activity activity, boolean fitSystemWindows) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
ViewGroup winContent = (ViewGroup) activity.findViewById(android.R.id.content);
if (winContent.getChildCount() > 0) {
ViewGroup rootView = (ViewGroup) winContent.getChildAt(0);
if (rootView != null) {
rootView.setFitsSystemWindows(fitSystemWindows);
}
}
}
}
/**
* 修改状态栏颜色
*
* @param colorId 颜色
*/
public static void setStatusBarColor(Activity activity, int colorId) {
int color= ContextCompat.getColor(activity,colorId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
if (window!=null){
window.setStatusBarColor(color);
}
}
}