Step 1:
把状态栏设置为透明
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP&&!Build.BRAND.equalsIgnoreCase("huawei")){/**5.0及以上且不是华为,
因为华为5.0以上系统已经全屏但是状态栏黑色改不掉*/
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){
window.setStatusBarColor(Color.TRANSPARENT);
if(Build.MANUFACTURER.toLowerCase().contains("xiaomi")) {
setMiuiStatusBarDarkMode(true);
}
}else{
window.setStatusBarColor(Color.argb(0x80,0x00,0x00,0x00));
}
}else{/**5.0以下,4.0及以上*/
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
winParams.flags |= bits;
win.setAttributes(winParams);
}
/**由于MIUI 6修改过所以系统方法无法设置状态栏字体颜色无效,需要使用该方法设置
*ps:mui上设置状态栏字体颜色为深色
*
*/
public void setMiuiStatusBarDarkMode(boolean isdarkmode) {
Class<? extends Window> clazz = this.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(this.getWindow(), isdarkmode ? darkModeFlag : 0, darkModeFlag);
} catch (Exception e) {
e.printStackTrace();
}
}
Step 2:
设置绘制区域
rootView.setFitsSystemWindows(true);
rootView.setClipToPadding(true);
这样rootView就顶上头部去了,但是有个副作用就是界面显示区域也扩展下面的虚拟按键后面了,所以要对于alignparentbottom的功能栏,就不能直接放到rootView里面,必须放到与rootView外面。这样功能栏就不会被底部的虚拟按键盖住(这里不要考虑计算虚拟按键的高度,已经是否有虚拟按键,华为手机可以通过手势动态展开或者收起虚拟按键)
注意机型:
- nexus固定死的虚拟按键
- 华为和小米Mix可以使用手势控制的虚拟按键