沉浸式的实现方案

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外面。这样功能栏就不会被底部的虚拟按键盖住(这里不要考虑计算虚拟按键的高度,已经是否有虚拟按键,华为手机可以通过手势动态展开或者收起虚拟按键)

注意机型:

  1. nexus固定死的虚拟按键
  2. 华为和小米Mix可以使用手势控制的虚拟按键