2025年Android 超级简单的沉浸式状态栏

Android 超级简单的沉浸式状态栏1 两个工具类和一个 xml 就完成了 直接复制即可 package com example tongliaodemo activity import android app Activity import android content Context import android graphics Color import android os Build

大家好,我是讯享网,很高兴认识大家。

1.两个工具类和一个xml就完成了

直接复制即可

package com.example.tongliaodemo.activity; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Build; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.FrameLayout; import com.example.tongliaodemo.R; import java.lang.reflect.Field; import java.lang.reflect.Method; / * 沉浸式状态栏工具 * 杨亚东 * @since 2021-1-19 */ public class StatusBarUtils { private static final int FAKE_STATUS_BAR_VIEW_ID = R.id.fake_status_bar_view; / * 获得状态栏的高度 * * @param context 上下文 * @return 状态栏高度 */ public static int getHeight(Context context) { int statusBarHeight = 0; try { int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = context.getResources().getDimensionPixelSize(resourceId); } } catch (Exception e) { e.printStackTrace(); } return statusBarHeight; } / * 设置状态栏颜色 * * @param context 上下文,尽量使用Activity * @param color 状态栏颜色 */ public static void setColor(Context context, int color) { if (context instanceof Activity) { setColor(((Activity) context).getWindow(), color); } } / * 设置状态栏颜色 * * @param window 窗口,可用于Activity和Dialog等 * @param color 状态栏颜色 */ public static void setColor(Window window, int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.setStatusBarColor(color); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { setColor(window, color, false); } } / * Android 5.0 以下版本设置状态栏颜色 * * @param window 窗口 * @param color 状态栏颜色值 * @param isTransparent 是否透明 */ public static void setColor(Window window, int color, boolean isTransparent) { Context context = window.getContext(); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); ViewGroup decorView = (ViewGroup) window.getDecorView(); View contentView = decorView.findViewById(android.R.id.content); if (contentView != null) { contentView.setPadding(0, isTransparent ? 0 : getHeight(context), 0, 0); } View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID); if (fakeStatusBarView != null) { fakeStatusBarView.setBackgroundColor(color); if (fakeStatusBarView.getVisibility() == View.GONE) { fakeStatusBarView.setVisibility(View.VISIBLE); } } else { // 绘制一个和状态栏一样高的矩形 View statusBarView = new View(context); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getHeight(context)); statusBarView.setLayoutParams(layoutParams); statusBarView.setBackgroundColor(color); statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID); decorView.addView(statusBarView); } } / * 设置状态栏透明 * * @param context 上下文,尽量使用Activity */ public static void setTransparent(Context context) { if (context instanceof Activity) { setTransparent(((Activity) context).getWindow()); } } / * 设置状态栏透明 * * @param window 窗口,可用于Activity和Dialog等 */ public static void setTransparent(Window window) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); window.setStatusBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { setColor(window, 0x, true); } } / * 设置状态栏是否为黑色文字 * * @param context 上下文,尽量使用Activity * @param isDark 是否为黑色文字 */ public static void setTextDark(Context context, boolean isDark) { if (context instanceof Activity) { setTextDark(((Activity) context).getWindow(), isDark); } } / * 设置状态栏是否为黑色文字 * * @param window 窗口,可用于Activity和全屏Dialog * @param isDark 是否为黑色文字 */ private static void setTextDark(Window window, boolean isDark) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { View decorView = window.getDecorView(); int systemUiVisibility = decorView.getSystemUiVisibility(); if (isDark) { decorView.setSystemUiVisibility(systemUiVisibility | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } else { decorView.setSystemUiVisibility(systemUiVisibility & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { switch (OSUtils.getRomType()) { case MIUI: setMIUIDark(window, isDark); break; case Flyme: setFlymeDark(window, isDark); break; default: } } } / * 设置MIUI系统状态栏是否为黑色文字 * * @param window 窗口,仅可用于Activity * @param isDark 是否为黑色文字 */ private static void setMIUIDark(Window window, boolean isDark) { try { Class<? extends Window> clazz = window.getClass(); int darkModeFlag; 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(window, isDark ? darkModeFlag : 0, darkModeFlag); } catch (Exception e) { e.printStackTrace(); } } / * 设置Flyme系统状态栏是否为黑色文字 * * @param window 窗口 * @param isDark 是否为黑色文字 */ private static void setFlymeDark(Window window, boolean isDark) { if (window != null) { try { WindowManager.LayoutParams lp = window.getAttributes(); Field darkFlag = WindowManager.LayoutParams.class .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); Field meizuFlags = WindowManager.LayoutParams.class .getDeclaredField("meizuFlags"); darkFlag.setAccessible(true); meizuFlags.setAccessible(true); int bit = darkFlag.getInt(null); int value = meizuFlags.getInt(lp); if (isDark) { value |= bit; } else { value &= ~bit; } meizuFlags.setInt(lp, value); window.setAttributes(lp); } catch (Exception e) { e.printStackTrace(); } } } } 

讯享网
讯享网package com.example.tongliaodemo.activity; import android.os.Environment; import android.text.TextUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; / * 杨亚东 * 2021.1.19 */ public class OSUtils { private static final String KEY_DISPLAY_ID = "ro.build.display.id"; private static final String KEY_BASE_OS_VERSION = "ro.build.version.base_os"; private static final String KEY_CLIENT_ID_BASE = "ro.com.google.clientidbase"; // 小米 : MIUI private static final String KEY_MIUI_VERSION = "ro.build.version.incremental"; // "7.6.15" private static final String KEY_MIUI_VERSION_NANE = "ro.miui.ui.version.name"; // "V8" private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code"; // "6" private static final String VALUE_MIUI_CLIENT_ID_BASE = "android-xiaomi"; // 华为 : EMUI private static final String KEY_EMUI_VERSION = "ro.build.version.emui"; // "EmotionUI_3.0" private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level"; // private static final String KEY_EMUI_SYSTEM_VERSION = "ro.confg.hw_systemversion"; // // "T1-A21wV100R001C233B008_SYSIMG" // 魅族 : Flyme private static final String KEY_FLYME_PUBLISHED = "ro.flyme.published"; // "true" private static final String KEY_FLYME_SETUP = "ro.meizu.setupwizard.flyme"; // "true" private static final String VALUE_FLYME_DISPLAY_ID_CONTAIN = "Flyme"; // "Flyme OS 4.5.4.2U" // OPPO : ColorOS private static final String KEY_COLOROS_VERSION = "ro.oppo.theme.version"; // "703" private static final String KEY_COLOROS_THEME_VERSION = "ro.oppo.version"; // "" private static final String KEY_COLOROS_ROM_VERSION = "ro.rom.different.version"; // private static final String VALUE_COLOROS_BASE_OS_VERSION_CONTAIN = "OPPO"; // "OPPO/R7sm // "ColorOS2.1" // /R7sm:5.1.1/LMY47V/:user/release-keys" private static final String VALUE_COLOROS_CLIENT_ID_BASE = "android-oppo"; // vivo : FuntouchOS private static final String KEY_FUNTOUCHOS_BOARD_VERSION = "ro.vivo.board.version"; // "MD" private static final String KEY_FUNTOUCHOS_OS_NAME = "ro.vivo.os.name"; // "Funtouch" private static final String KEY_FUNTOUCHOS_OS_VERSION = "ro.vivo.os.version"; // "3.0" private static final String KEY_FUNTOUCHOS_DISPLAY_ID = "ro.vivo.os.build.display.id"; // // "FuntouchOS_3.0" private static final String KEY_FUNTOUCHOS_ROM_VERSION = "ro.vivo.rom.version"; // "rom_3.1" private static final String VALUE_FUNTOUCHOS_CLIENT_ID_BASE = "android-vivo"; // Samsung private static final String VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN = "samsung"; // "samsung // /zeroltezc/zeroltechn:6.0.1/MMB29K/G9250ZCU2DQD1:user/release-keys" private static final String VALUE_SAMSUNG_CLIENT_ID_BASE = "android-samsung"; // Sony private static final String KEY_SONY_PROTOCOL_TYPE = "ro.sony.irremote.protocol_type"; // "2" private static final String KEY_SONY_ENCRYPTED_DATA = "ro.sony.fota.encrypteddata"; // private static final String VALUE_SONY_CLIENT_ID_BASE = "android-sonyericsson"; // "supported" // 乐视 : eui private static final String KEY_EUI_VERSION = "ro.letv.release.version"; // "5.9.023S" private static final String KEY_EUI_VERSION_DATE = "ro.letv.release.version_date"; // "5.9 // .023S_03111" private static final String KEY_EUI_NAME = "ro.product.letv_name"; // "乐1s" private static final String KEY_EUI_MODEL = "ro.product.letv_model"; // "Letv X500" // 金立 : amigo private static final String KEY_AMIGO_ROM_VERSION = "ro.gn.gnromvernumber"; // "GIONEE ROM5.0 // .16" private static final String KEY_AMIGO_SYSTEM_UI_SUPPORT = "ro.gn.amigo.systemui.support"; // private static final String VALUE_AMIGO_DISPLAY_ID_CONTAIN = "amigo"; // "amigo3.5.1" // "yes" private static final String VALUE_AMIGO_CLIENT_ID_BASE = "android-gionee"; // 酷派 : yulong private static final String KEY_YULONG_VERSION_RELEASE = "ro.yulong.version.release"; // "5.1 // .046.P1..8676_M01" private static final String KEY_YULONG_VERSION_TAG = "ro.yulong.version.tag"; // "LC" private static final String VALUE_YULONG_CLIENT_ID_BASE = "android-coolpad"; // HTC : Sense private static final String KEY_SENSE_BUILD_STAGE = "htc.build.stage"; // "2" private static final String KEY_SENSE_BLUETOOTH_SAP = "ro.htc.bluetooth.sap"; // "true" private static final String VALUE_SENSE_CLIENT_ID_BASE = "android-htc-rev"; // LG : LG private static final String KEY_LG_SW_VERSION = "ro.lge.swversion"; // "D85720b" private static final String KEY_LG_SW_VERSION_SHORT = "ro.lge.swversion_short"; // "V20b" private static final String KEY_LG_FACTORY_VERSION = "ro.lge.factoryversion"; // "LGD857AT-00 // -V20b-CUO-CN-FEB-17-2015+0" // 联想 private static final String KEY_LENOVO_DEVICE = "ro.lenovo.device"; // "phone" private static final String KEY_LENOVO_PLATFORM = "ro.lenovo.platform"; // "qualcomm" private static final String KEY_LENOVO_ADB = "ro.lenovo.adb"; // "apkctl,speedup" private static final String VALUE_LENOVO_CLIENT_ID_BASE = "android-lenovo"; / * ROM 类型 */ private static final ROM ROM_TYPE = initRomType(); / * 获取 ROM 类型 * * @return ROM */ public static ROM getRomType() { return ROM_TYPE; } / * 初始化 ROM 类型 */ private static ROM initRomType() { ROM rom = ROM.Other; FileInputStream is = null; try { Properties buildProperties = new Properties(); is = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop")); buildProperties.load(is); if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE) || buildProperties.containsKey(KEY_MIUI_VERSION_CODE)) { // MIUI rom = ROM.MIUI; if (buildProperties.containsKey(KEY_MIUI_VERSION_NANE)) { String versionName = buildProperties.getProperty(KEY_MIUI_VERSION_NANE); if (!TextUtils.isEmpty(versionName) && versionName.matches("[Vv]\\d+")) { // V8 try { rom.setBaseVersion(Integer.parseInt(versionName.split("[Vv]")[1])); } catch (Exception e) { e.printStackTrace(); } } } if (buildProperties.containsKey(KEY_MIUI_VERSION)) { String versionStr = buildProperties.getProperty(KEY_MIUI_VERSION); if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) { rom.setVersion(versionStr); } } } else if (buildProperties.containsKey(KEY_EMUI_VERSION) || buildProperties.containsKey(KEY_EMUI_API_LEVEL) || buildProperties.containsKey(KEY_EMUI_SYSTEM_VERSION)) { // EMUI rom = ROM.EMUI; if (buildProperties.containsKey(KEY_EMUI_VERSION)) { String versionStr = buildProperties.getProperty(KEY_EMUI_VERSION); Matcher matcher = Pattern.compile("EmotionUI_([\\d.]+)").matcher(versionStr); // EmotionUI_3.0 if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_FLYME_SETUP) || buildProperties.containsKey(KEY_FLYME_PUBLISHED)) { // Flyme rom = ROM.Flyme; if (buildProperties.containsKey(KEY_DISPLAY_ID)) { String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID); Matcher matcher = Pattern.compile("Flyme[^\\d]*([\\d.]+)[^\\d]*").matcher(versionStr); // Flyme OS 4.5.4.2U if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_COLOROS_VERSION) || buildProperties.containsKey(KEY_COLOROS_THEME_VERSION) || buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) { // ColorOS rom = ROM.ColorOS; if (buildProperties.containsKey(KEY_COLOROS_ROM_VERSION)) { String versionStr = buildProperties.getProperty(KEY_COLOROS_ROM_VERSION); Matcher matcher = Pattern.compile("ColorOS([\\d.]+)").matcher(versionStr); // // ColorOS2.1 if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_NAME) || buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION) || buildProperties.containsKey(KEY_FUNTOUCHOS_DISPLAY_ID)) { // FuntouchOS rom = ROM.FuntouchOS; if (buildProperties.containsKey(KEY_FUNTOUCHOS_OS_VERSION)) { String versionStr = buildProperties.getProperty(KEY_FUNTOUCHOS_OS_VERSION); if (!TextUtils.isEmpty(versionStr) && versionStr.matches("[\\d.]+")) { // 3.0 try { rom.setVersion(versionStr); rom.setBaseVersion(Integer.parseInt(versionStr.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_EUI_VERSION) || buildProperties.containsKey(KEY_EUI_NAME) || buildProperties.containsKey(KEY_EUI_MODEL)) { // EUI rom = ROM.EUI; if (buildProperties.containsKey(KEY_EUI_VERSION)) { String versionStr = buildProperties.getProperty(KEY_EUI_VERSION); Matcher matcher = Pattern.compile("([\\d.]+)[^\\d]*").matcher(versionStr); // // 5.9.023S if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_AMIGO_ROM_VERSION) || buildProperties.containsKey(KEY_AMIGO_SYSTEM_UI_SUPPORT)) { // amigo rom = ROM.AmigoOS; if (buildProperties.containsKey(KEY_DISPLAY_ID)) { String versionStr = buildProperties.getProperty(KEY_DISPLAY_ID); Matcher matcher = Pattern.compile("amigo([\\d.]+)[a-zA-Z]*").matcher(versionStr); // // "amigo3.5.1" if (!TextUtils.isEmpty(versionStr) && matcher.find()) { try { String version = matcher.group(1); rom.setVersion(version); rom.setBaseVersion(Integer.parseInt(version.split("\\.")[0])); } catch (Exception e) { e.printStackTrace(); } } } } else if (buildProperties.containsKey(KEY_SONY_PROTOCOL_TYPE) || buildProperties.containsKey(KEY_SONY_ENCRYPTED_DATA)) { // Sony rom = ROM.Sony; } else if (buildProperties.containsKey(KEY_YULONG_VERSION_RELEASE) || buildProperties.containsKey(KEY_YULONG_VERSION_TAG)) { // YuLong rom = ROM.YuLong; } else if (buildProperties.containsKey(KEY_SENSE_BUILD_STAGE) || buildProperties.containsKey(KEY_SENSE_BLUETOOTH_SAP)) { // Sense rom = ROM.Sense; } else if (buildProperties.containsKey(KEY_LG_SW_VERSION) || buildProperties.containsKey(KEY_LG_SW_VERSION_SHORT) || buildProperties.containsKey(KEY_LG_FACTORY_VERSION)) { // LG rom = ROM.LG; } else if (buildProperties.containsKey(KEY_LENOVO_DEVICE) || buildProperties.containsKey(KEY_LENOVO_PLATFORM) || buildProperties.containsKey(KEY_LENOVO_ADB)) { // Lenovo rom = ROM.Lenovo; } else if (buildProperties.containsKey(KEY_DISPLAY_ID)) { String displayId = buildProperties.getProperty(KEY_DISPLAY_ID); if (!TextUtils.isEmpty(displayId)) { if (displayId.contains(VALUE_FLYME_DISPLAY_ID_CONTAIN)) { return ROM.Flyme; } else if (displayId.contains(VALUE_AMIGO_DISPLAY_ID_CONTAIN)) { return ROM.AmigoOS; } } } else if (buildProperties.containsKey(KEY_BASE_OS_VERSION)) { String baseOsVersion = buildProperties.getProperty(KEY_BASE_OS_VERSION); if (!TextUtils.isEmpty(baseOsVersion)) { if (baseOsVersion.contains(VALUE_COLOROS_BASE_OS_VERSION_CONTAIN)) { return ROM.ColorOS; } else if (baseOsVersion.contains(VALUE_SAMSUNG_BASE_OS_VERSION_CONTAIN)) { return ROM.SamSung; } } } else if (buildProperties.containsKey(KEY_CLIENT_ID_BASE)) { String clientIdBase = buildProperties.getProperty(KEY_CLIENT_ID_BASE); switch (clientIdBase) { case VALUE_MIUI_CLIENT_ID_BASE: return ROM.MIUI; case VALUE_COLOROS_CLIENT_ID_BASE: return ROM.ColorOS; case VALUE_FUNTOUCHOS_CLIENT_ID_BASE: return ROM.FuntouchOS; case VALUE_SAMSUNG_CLIENT_ID_BASE: return ROM.SamSung; case VALUE_SONY_CLIENT_ID_BASE: return ROM.Sony; case VALUE_YULONG_CLIENT_ID_BASE: return ROM.YuLong; case VALUE_SENSE_CLIENT_ID_BASE: return ROM.Sense; case VALUE_LENOVO_CLIENT_ID_BASE: return ROM.Lenovo; case VALUE_AMIGO_CLIENT_ID_BASE: return ROM.AmigoOS; default: break; } } } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } return rom; } public enum ROM { MIUI, // 小米 Flyme, // 魅族 EMUI, // 华为 ColorOS, // OPPO FuntouchOS, // vivo SmartisanOS, // 锤子 EUI, // 乐视 Sense, // HTC AmigoOS, // 金立 _360OS, // 奇酷360 NubiaUI, // 努比亚 H2OS, // 一加 YunOS, // 阿里巴巴 YuLong, // 酷派 SamSung, // 三星 Sony, // 索尼 Lenovo, // 联想 LG, // LG Google, // 原生 Other; // CyanogenMod, Lewa OS, 百度云OS, Tencent OS, 深度OS, IUNI OS, Tapas OS, Mokee private int baseVersion = -1; private String version; public int getBaseVersion() { return baseVersion; } void setBaseVersion(int baseVersion) { this.baseVersion = baseVersion; } public String getVersion() { return version; } void setVersion(String version) { this.version = version; } } } 

在values文件下创建ids.xml

<resources> <item name="fake_status_bar_view" type="id"/> </resources>

在需要沉浸式状态栏的地方调用如下代码即可


讯享网

讯享网 //设置沉浸状态栏 StatusBarUtils.setColor(this,0x0666F8); StatusBarUtils.setTextDark(this,true);

 

小讯
上一篇 2025-03-11 14:30
下一篇 2025-03-13 18:25

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/37186.html