在SDK21以后,系统为我们提供了修改状态栏的方法,有时候我们需要类似全屏状态,但是还要显示状态栏,这时候我们需要把状态栏背景颜色设置为全屏;有时候我们需要状态栏颜色与activity上边title颜色保持一致,如果状态栏是白色的,我们还需要修改状态栏中图标的颜色。
首先做一个判断
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
然后在你的activity的XML文件中设置
android:fitsSystemWindows="true"
//因为下面的方法都会通过setSystemUiVisibility方法设置为全屏同时状态栏不会被覆盖掉,如果不设置这个,会遮盖掉部分布局。
下面就是设置你的状态栏的代码:
其中setStatusBarColor是设置状态栏的颜色
method.invoke是设置状态栏的图标的颜色
Window window=mainActivity.getWindow();
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(getColor(R.color.colorBackground));
Class clazz = window.getClass();
try {
Method method= clazz.getMethod("setStatusBarIconColor", int.class);
method.invoke(window, Color.BLACK);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
同时讲解一下setSystemUiVisibility中的设置的状态的意思:
1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态的正常情况)。
2. View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。
3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。
4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。
5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。
8. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。
// SYSTEM_UI_FLAG_LAYOUT_STABLE:防止系统栏隐藏时内容区域大小发生变化
PS:补充一下,小米手机的状态栏需要单独适配,这里直接贴出适配方案。
因为状态栏一般默认主题是白色的,这里的效果是灰色背景和黑色字体,如果需要别的颜色的背景的话,可以在后面通过上面的方法单独设置。
public void setStatusBarDarkMode(boolean darkmode, Activity activity) {
Class<? extends Window> clazz = activity.getWindow().getClass();
try {
int darkModeFlag = 0;
Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
darkModeFlag = field.getInt(layoutParams);
Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
if(darkmode){
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}else{
int flag = activity.getWindow().getDecorView().getSystemUiVisibility()
& ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
window.getDecorView().setSystemUiVisibility(flag);
}
} catch (Exception e) {
e.printStackTrace();
}
}