推荐使用 https://github.com/laobie/StatusBarUtil.git
/**
* getStatusBarHeight : 获取状态栏高度(px)
* setStatusBarVisibility : 设置状态栏是否可见
* isStatusBarVisible : 判断状态栏是否可见
* setStatusBarLightMode : 设置状态栏是否为浅色模式
* addMarginTopEqualStatusBarHeight : 为 view 增加 MarginTop 为状态栏高度
* subtractMarginTopEqualStatusBarHeight: 为 view 减少 MarginTop 为状态栏高度
* setStatusBarColor : 设置状态栏颜色
* setStatusBarAlpha : 设置状态栏透明度
* setStatusBarColor4Drawer : 为 DrawerLayout 设置状态栏颜色
* setStatusBarAlpha4Drawer : 为 DrawerLayout 设置状态栏透明度
* getActionBarHeight : 获取 ActionBar 高度
* setNotificationBarVisibility : 设置通知栏是否可见
* getNavBarHeight : 获取导航栏高度
* setNavBarVisibility : 设置导航栏是否可见
* setNavBarImmersive : 设置导航栏沉浸式
* setNavBarColor : 设置导航栏颜色
* getNavBarColor : 获取导航栏颜色
* isNavBarVisible : 判断导航栏是否可见
*/
public final class BarUtils {
private static final int DEFAULT_ALPHA = 112;
private static final String TAG_COLOR = "TAG_COLOR";
private static final String TAG_ALPHA = "TAG_ALPHA";
private static final int TAG_OFFSET = -123;
private static Context sContext;
private BarUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
public static void init(Context context) {
sContext = context;
}
/**
* 设置状态栏是否可见
*/
public static void setStatusBarVisibility(@NonNull final Activity activity, final boolean isVisible) {
setStatusBarVisibility(activity.getWindow(), isVisible);
}
/**
* 设置状态栏是否可见
*/
public static void setStatusBarVisibility(@NonNull final Window window, final boolean isVisible) {
if (isVisible) {
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
/**
* 判断状态栏是否可见
*/
public static boolean isStatusBarVisible(@NonNull final Activity activity) {
int flags = activity.getWindow().getAttributes().flags;
return (flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == 0;
}
/**
* 设置状态栏是否为浅色模式
*/
public static void setStatusBarLightMode(@NonNull final Activity activity, final boolean isLightMode) {
setStatusBarLightMode(activity.getWindow(), isLightMode);
}
/**
* 设置状态栏是否为浅色模式
*/
public static void setStatusBarLightMode(@NonNull final Window window, final boolean isLightMode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
View decorView = window.getDecorView();
if (decorView != null) {
int vis = decorView.getSystemUiVisibility();
if (isLightMode) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
} else {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
decorView.setSystemUiVisibility(vis);
}
}
}
/**
* 为 view 增加状态栏高度的MarginTop
*/
public static void addMarginTopEqualStatusBarHeight(@NonNull View view) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
Object haveSetOffset = view.getTag(TAG_OFFSET);
if (haveSetOffset != null && (Boolean) haveSetOffset)
return;
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
layoutParams.setMargins(layoutParams.leftMargin,
layoutParams.topMargin + getStatusBarHeight(),
layoutParams.rightMargin,
layoutParams.bottomMargin);
view.setTag(TAG_OFFSET, true);
}
/**
* 获取状态栏高度(px)
*/
public static int getStatusBarHeight() {
Resources resources = sContext.getResources();
int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
return resources.getDimensionPixelSize(resourceId);
}
/**
* 为 view 减少状态栏高度的MarginTop
*/
public static void subtractMarginTopEqualStatusBarHeight(@NonNull View view) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
Object haveSetOffset = view.getTag(TAG_OFFSET);
if (haveSetOffset == null || !(Boolean) haveSetOffset)
return;
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
layoutParams.setMargins(layoutParams.leftMargin,
layoutParams.topMargin - getStatusBarHeight(),
layoutParams.rightMargin,
layoutParams.bottomMargin);
view.setTag(TAG_OFFSET, false);
}
/**
* 设置状态栏颜色
*/
public static void setStatusBarColor(@NonNull final Activity activity, @ColorInt final int color) {
setStatusBarColor(activity, color, DEFAULT_ALPHA, false);
}
/**
* 设置状态栏颜色
*/
public static void setStatusBarColor(@NonNull final Activity activity,
@ColorInt final int color,
@IntRange(from = 0, to = 255) final int alpha,
final boolean isDecor) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
hideAlphaView(activity);
transparentStatusBar(activity);
addStatusBarColor(activity, color, alpha, isDecor);
}
private static void hideAlphaView(final Activity activity) {
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
View fakeStatusBarView = decorView.findViewWithTag(TAG_ALPHA);
if (fakeStatusBarView == null)
return;
fakeStatusBarView.setVisibility(View.GONE);
}
private static void transparentStatusBar(final Activity activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
Window window = activity.getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
window.getDecorView().setSystemUiVisibility(option);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
private static void addStatusBarColor(final Activity activity, final int color, final int alpha, boolean isDecor) {
ViewGroup parent = isDecor ? (ViewGroup) activity.getWindow().getDecorView()
: (ViewGroup) activity.findViewById(android.R.id.content);
View fakeStatusBarView = parent.findViewWithTag(TAG_COLOR);
if (fakeStatusBarView != null) {
if (fakeStatusBarView.getVisibility() == View.GONE) {
fakeStatusBarView.setVisibility(View.VISIBLE);
}
fakeStatusBarView.setBackgroundColor(getStatusBarColor(color, alpha));
} else {
parent.addView(createColorStatusBarView(parent.getContext(), color, alpha));
}
}
private static int getStatusBarColor(final int color, final int alpha) {
if (alpha == 0)
return color;
float a = 1 - alpha / 255f;
int red = (color >> 16) & 0xff;
int green = (color >> 8) & 0xff;
int blue = color & 0xff;
red = (int) (red * a + 0.5);
green = (int) (green * a + 0.5);
blue = (int) (blue * a + 0.5);
return Color.argb(255, red, green, blue);
}
private static View createColorStatusBarView(final Context context, final int color, final int alpha) {
View statusBarView = new View(context);
statusBarView.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight()));
statusBarView.setBackgroundColor(getStatusBarColor(color, alpha));
statusBarView.setTag(TAG_COLOR);
return statusBarView;
}
/**
* 设置状态栏颜色
*/
public static void setStatusBarColor(@NonNull final Activity activity,
@ColorInt final int color,
@IntRange(from = 0, to = 255) final int alpha) {
setStatusBarColor(activity, color, alpha, false);
}
/**
* 设置状态栏颜色
*/
public static void setStatusBarColor(@NonNull final View fakeStatusBar, @ColorInt final int color) {
setStatusBarColor(fakeStatusBar, color, DEFAULT_ALPHA);
}
/**
* 设置状态栏颜色
*/
public static void setStatusBarColor(@NonNull final View fakeStatusBar,
@ColorInt final int color,
@IntRange(from = 0, to = 255) final int alpha) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
fakeStatusBar.setVisibility(View.VISIBLE);
transparentStatusBar((Activity) fakeStatusBar.getContext());
ViewGroup.LayoutParams layoutParams = fakeStatusBar.getLayoutParams();
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
layoutParams.height = BarUtils.getStatusBarHeight();
fakeStatusBar.setBackgroundColor(getStatusBarColor(color, alpha));
}
/**
* 设置状态栏透明度
*/
public static void setStatusBarAlpha(@NonNull final Activity activity) {
setStatusBarAlpha(activity, DEFAULT_ALPHA, false);
}
/**
* 设置状态栏透明度
*/
public static void setStatusBarAlpha(@NonNull final Activity activity,
@IntRange(from = 0, to = 255) final int alpha,
final boolean isDecor) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
hideColorView(activity);
transparentStatusBar(activity);
addStatusBarAlpha(activity, alpha, isDecor);
}
private static void hideColorView(final Activity activity) {
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
View fakeStatusBarView = decorView.findViewWithTag(TAG_COLOR);
if (fakeStatusBarView == null)
return;
fakeStatusBarView.setVisibility(View.GONE);
}
private static void addStatusBarAlpha(final Activity activity, final int alpha, boolean isDecor) {
ViewGroup parent = isDecor ? (ViewGroup) activity.getWindow().getDecorView() :
(ViewGroup) activity.findViewById(android.R.id.content);
View fakeStatusBarView = parent.findViewWithTag(TAG_ALPHA);
if (fakeStatusBarView != null) {
if (fakeStatusBarView.getVisibility() == View.GONE) {
fakeStatusBarView.setVisibility(View.VISIBLE);
}
fakeStatusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));
} else {
parent.addView(createAlphaStatusBarView(parent.getContext(), alpha));
}
}
private static View createAlphaStatusBarView(final Context context, final int alpha) {
View statusBarView = new View(context);
statusBarView.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight()));
statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));
statusBarView.setTag(TAG_ALPHA);
return statusBarView;
}
/**
* 设置状态栏透明度
*/
public static void setStatusBarAlpha(@NonNull final Activity activity,
@IntRange(from = 0, to = 255) final int alpha) {
setStatusBarAlpha(activity, alpha, false);
}
/**
* 设置状态栏透明度
*/
public static void setStatusBarAlpha(@NonNull final View fakeStatusBar) {
setStatusBarAlpha(fakeStatusBar, DEFAULT_ALPHA);
}
/**
* 设置状态栏透明度
*/
public static void setStatusBarAlpha(@NonNull final View fakeStatusBar,
@IntRange(from = 0, to = 255) final int alpha) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
fakeStatusBar.setVisibility(View.VISIBLE);
transparentStatusBar((Activity) fakeStatusBar.getContext());
ViewGroup.LayoutParams layoutParams = fakeStatusBar.getLayoutParams();
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
layoutParams.height = BarUtils.getStatusBarHeight();
fakeStatusBar.setBackgroundColor(Color.argb(alpha, 0, 0, 0));
}
/**
* 为 DrawerLayout 设置状态栏透明度
*/
public static void setStatusBarColorForDrawer(@NonNull final Activity activity,
@NonNull final DrawerLayout drawer,
@NonNull final View fakeStatusBar,
@ColorInt final int color,
final boolean isTop) {
setStatusBarColorForDrawer(activity, drawer, fakeStatusBar, color, DEFAULT_ALPHA, isTop);
}
/**
* 为 DrawerLayout 设置状态栏透明度
*/
public static void setStatusBarColorForDrawer(@NonNull final Activity activity,
@NonNull final DrawerLayout drawer,
@NonNull final View fakeStatusBar,
@ColorInt final int color,
@IntRange(from = 0, to = 255) final int alpha,
final boolean isTop) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
drawer.setFitsSystemWindows(false);
transparentStatusBar(activity);
setStatusBarColor(fakeStatusBar, color, isTop ? alpha : 0);
for (int i = 0, len = drawer.getChildCount(); i < len; i++) {
drawer.getChildAt(i).setFitsSystemWindows(false);
}
if (isTop) {
hideAlphaView(activity);
} else {
addStatusBarAlpha(activity, alpha, false);
}
}
/**
* 为 DrawerLayout 设置状态栏透明度
*/
public static void setStatusBarAlphaForDrawer(@NonNull final Activity activity,
@NonNull final DrawerLayout drawer,
@NonNull final View fakeStatusBar,
final boolean isTop) {
setStatusBarAlphaForDrawer(activity, drawer, fakeStatusBar, DEFAULT_ALPHA, isTop);
}
/**
* 为 DrawerLayout 设置状态栏透明度
*/
public static void setStatusBarAlphaForDrawer(@NonNull final Activity activity,
@NonNull final DrawerLayout drawer,
@NonNull final View fakeStatusBar,
@IntRange(from = 0, to = 255) final int alpha,
final boolean isTop) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return;
drawer.setFitsSystemWindows(false);
transparentStatusBar(activity);
setStatusBarAlpha(fakeStatusBar, isTop ? alpha : 0);
for (int i = 0, len = drawer.getChildCount(); i < len; i++) {
drawer.getChildAt(i).setFitsSystemWindows(false);
}
if (isTop) {
hideAlphaView(activity);
} else {
addStatusBarAlpha(activity, alpha, false);
}
}
///////////////////////////////////////////////////////////////////////////
// action bar
///////////////////////////////////////////////////////////////////////////
/**
* 获取 ActionBar 高度
*/
public static int getActionBarHeight() {
TypedValue tv = new TypedValue();
if (sContext.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
return TypedValue.complexToDimensionPixelSize(
tv.data, sContext.getResources().getDisplayMetrics()
);
}
return 0;
}
///////////////////////////////////////////////////////////////////////////
// notification bar
///////////////////////////////////////////////////////////////////////////
/**
* 设置通知栏是否可见
*/
public static void setNotificationBarVisibility(final boolean isVisible) {
String methodName;
if (isVisible) {
methodName = (Build.VERSION.SDK_INT <= 16) ? "expand" : "expandNotificationsPanel";
} else {
methodName = (Build.VERSION.SDK_INT <= 16) ? "collapse" : "collapsePanels";
}
invokePanels(methodName);
}
private static void invokePanels(final String methodName) {
try {
@SuppressLint("WrongConstant")
Object service = sContext.getSystemService("statusbar");
@SuppressLint("PrivateApi")
Class<?> statusBarManager = Class.forName("android.app.StatusBarManager");
Method expand = statusBarManager.getMethod(methodName);
expand.invoke(service);
} catch (Exception e) {
e.printStackTrace();
}
}
///////////////////////////////////////////////////////////////////////////
// navigation bar
///////////////////////////////////////////////////////////////////////////
/**
* 获取导航栏高度
*/
public static int getNavBarHeight() {
Resources res = sContext.getResources();
int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId != 0) {
return res.getDimensionPixelSize(resourceId);
} else {
return 0;
}
}
/**
* 设置导航栏是否可见
*/
public static void setNavBarVisibility(@NonNull final Activity activity, boolean isVisible) {
setNavBarVisibility(activity.getWindow(), isVisible);
}
/**
* 设置导航栏是否可见
*/
public static void setNavBarVisibility(@NonNull final Window window, boolean isVisible) {
if (isVisible) {
window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
View decorView = window.getDecorView();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
int visibility = decorView.getSystemUiVisibility();
decorView.setSystemUiVisibility(visibility & ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
}
/**
* 设置导航栏沉浸式
*/
@RequiresApi(Build.VERSION_CODES.KITKAT)
public static void setNavBarImmersive(@NonNull final Activity activity) {
setNavBarImmersive(activity.getWindow());
}
/**
* 设置导航栏沉浸式
*/
@RequiresApi(Build.VERSION_CODES.KITKAT)
public static void setNavBarImmersive(@NonNull final Window window) {
View decorView = window.getDecorView();
window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
}
/**
* 设置导航栏颜色
*/
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public static void setNavBarColor(@NonNull final Activity activity, @ColorInt final int color) {
setNavBarColor(activity.getWindow(), color);
}
/**
* 设置导航栏颜色
*/
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public static void setNavBarColor(@NonNull final Window window, @ColorInt final int color) {
window.setNavigationBarColor(color);
}
/**
* 获取导航栏颜色
*/
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public static int getNavBarColor(@NonNull final Activity activity) {
return getNavBarColor(activity.getWindow());
}
/**
* 获取导航栏颜色
*/
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
public static int getNavBarColor(@NonNull final Window window) {
return window.getNavigationBarColor();
}
/**
* 判断导航栏是否可见
*/
public static boolean isNavBarVisible(@NonNull final Activity activity) {
return isNavBarVisible(activity.getWindow());
}
/**
* 判断导航栏是否可见
*/
public static boolean isNavBarVisible(@NonNull final Window window) {
boolean isNoLimits = (window.getAttributes().flags
& WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS) != 0;
if (isNoLimits)
return false;
View decorView = window.getDecorView();
int visibility = decorView.getSystemUiVisibility();
return (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;
}
}
在Application中调用BarUtils.init(this);
https://github.com/Blankj/AndroidUtilCode
https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/README-CN.md