Android沉浸式状态栏(包含 小米、魅族)
16lz
2022-03-04
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
更多相关文章
- Android快速开发02之仿京东底部Tab
- android实现应用程序无图标(快捷方式)问题.
- Android(安卓)状态栏透明和图标反色
- android实现应用程序无图标(快捷方式)问题
- Android任务栏的图标显示
- android绘制图标
- Android(安卓)深色模式适配
- 【Android(安卓)性能优化】应用启动优化 ( 安卓应用启动分析 | L
- 修改Android(安卓)actionbar 溢出菜单按钮(OverflowButton)默认图