Android沉浸式状态栏(包含 小米、魅族)

今天魅族手机 flyme 6(android 7.0) 状态栏问题搞的我晕头转向,后来找到flyme开放平台 才将问题解决。因此,有必要记录一下2018.04.24此刻项目中关于Android状态栏的完成解决方案。

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //  透明、深色字体状态栏        StatusBarUtil.initStatusBar(this, true, true);        //        setContentView(R.layout.activity_main);    }}

StatusBarUtil

以下代码中用的StatusbarColorUtils类,来自flyme开放平台

public class StatusBarUtil {    /**     * 沉浸式状态栏     *     * @param activity     * @param isLightStatusBar 是否为浅色状态栏(黑色字体图标)     * @param isTransStatusBar 是否为透明状态栏     */    public static void initStatusBar(Activity activity, boolean isLightStatusBar, boolean isTransStatusBar) {        // 6.0以上        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            // 设置浅色状态栏(神色背景图标)            StatusBarUtil.StatusBarLightMode(activity, isLightStatusBar);            // 透明状态栏            if (isTransStatusBar) {                StatusBarUtil.setTransStatusBar(activity, isLightStatusBar);            }        }    }    /**     * 透明状态栏     *     * @param isLightStatusBar 浅色状态栏(黑色字体、图标)     */    private static void setTransStatusBar(Activity activity, boolean isLightStatusBar) {        // 大于android 5.0        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            Window window = activity.getWindow();            // 清除状态 透明的状态栏| 透明导航栏            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);            // 大于 android 6.0            if (isLightStatusBar && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                // 6.0增加了View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,这个字段就是把状态栏标记为浅色,然后状态栏的字体颜色自动转换为深色。                // 所以,如果需要浅色的状态栏,只能在Android6.0及以后的版本中实现                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE                        | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);            } else {                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);            }            // 透明状态栏            // FLAG_TRANSLUCENT_STATUS 只是把状态栏设置为透明的,但是,状态栏是有背景色的,一些手机的状态栏背景色为透明,而一些手机的状态栏背景色为半透明的黑色            // 于是在5.0上增加了WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS            // getWindow().setStatusBarColor(int color)            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            window.setStatusBarColor(Color.TRANSPARENT);        }    }    /**     * 设置状态栏黑色字体图标,     * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android     *     * @param activity     * @param dark     是否把状态栏字体及图标颜色设置为深色     * @return 1:MIUUI 2:Flyme 3:android6.0     */    private static int StatusBarLightMode(Activity activity, boolean dark) {        int result = 0;        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            if (MIUISetStatusBarLightMode(activity.getWindow(), dark)) {                result = 1;            } else if (isFlymeOS()) {                result = 2;                // 设置魅族状态栏 深浅颜色                StatusbarColorUtils.setStatusBarDarkIcon(activity, dark);            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);                result = 3;            }        }        return result;    }    /**     * 设置状态栏字体图标为深色,需要MIUIV6以上     *     * @param window 需要设置的窗口     * @param dark   是否把状态栏字体及图标颜色设置为深色     * @return boolean 成功执行返回true     */    private static boolean MIUISetStatusBarLightMode(Window window, boolean dark) {        boolean result = false;        if (window != null) {            Class clazz = window.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);                if (dark) {                    extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体                } else {                    extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体                }                result = true;            } catch (Exception e) {            }        }        return result;    }    // ############################魅族系统判断#####################################    // 判断是魅族操作系统    private static boolean isFlymeOS() {        return getMeizuFlymeOSFlag().toLowerCase().contains("flyme");    }    /**     * 获取魅族系统操作版本标识     */    private static String getMeizuFlymeOSFlag() {        String str = getSystemProperty("ro.build.display.id", "");        return str;    }    private static String getSystemProperty(String key, String defaultValue) {        try {            Class<?> clz = Class.forName("android.os.SystemProperties");            Method get = clz.getMethod("get", String.class, String.class);            return (String) get.invoke(clz, key, defaultValue);        } catch (Exception e) {        }        return defaultValue;    }}

推荐一篇关于沉浸式状态栏的文章:

https://juejin.im/post/5a25f6146fb9a0452405ad5b

https://juejin.im/entry/59469d3f61ff4b006cf363ca

更多相关文章

  1. android Edittext内容字体大小动态变化
  2. android的字体相关类Typeface
  3. android实现应用程序无图标(快捷方式)问题.
  4. Android 同个TextView设置字体大小不一样
  5. android radiobutton选中字体颜色改变的方法
  6. Android任务栏的图标显示
  7. android实现应用程序无图标(快捷方式)问题
  8. Android 状态栏透明和图标反色
  9. android 按钮按下时改变字体颜色

随机推荐

  1. MySQL 示例数据库sakila
  2. mysql是否有postgreSQL一样的美元包围符
  3. 使用Powershell对MySQL运行SQL脚本
  4. ANSI Sql查询强制返回0条记录
  5. 不应该准备好的报表要快得多吗?
  6. 亚马逊AWS EC2云实例AMI安装LNMP环境(3)
  7. mysql的安装和卸载
  8. 《MySQL技术内幕——SQL编程》读书笔记(
  9. mysql 大数据量高效分页查询
  10. jQuery执行PHP MySQL查询