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快速开发02之仿京东底部Tab
  2. android实现应用程序无图标(快捷方式)问题.
  3. Android(安卓)状态栏透明和图标反色
  4. android实现应用程序无图标(快捷方式)问题
  5. Android任务栏的图标显示
  6. android绘制图标
  7. Android(安卓)深色模式适配
  8. 【Android(安卓)性能优化】应用启动优化 ( 安卓应用启动分析 | L
  9. 修改Android(安卓)actionbar 溢出菜单按钮(OverflowButton)默认图

随机推荐

  1. Android中数据存储——SQLite数据库存储
  2. Android常用复杂控件使用(三)--Fragment
  3. 开放的Android更易中招 安全防护刻不容缓
  4. Qt for Android获取手机序列号/手机型号/
  5. android实现向右滑动返回功能
  6. 东拼西凑的第一个Android应用程序
  7. Android大牛的博客
  8. Android布局文件中命名空间的解析
  9. android样式,主题设置心得
  10. 自定义View系列教程02--onMeasure源码详