Android 设置app深色、浅色、跟随系统

博客介绍了Android深色模式适配相关内容。需在用户设置时记录其设置,app再次启动时获取并重新设置。包括设置单个Activity、获取当前Activity是否开启深色、webView设置,h5页面需特别判断获取webView深浅模式,深色浅色切换时需重启app。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android深色模式适配

我们需要再用户设置时候,记录下来,用户的设置,等app再次启动时候,获取之前设置,重新设置

    public static void setThemeMode() {
        int themeModeType = SpUtils.getThemeModeType();
        if (themeModeType == 1) {
            //1:浅色
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        } else if (themeModeType == 2) {
            // 2:深色
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else {
            //跟随系统
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
        }
    }

1、设置单个Activity

   /**
     * 设置单个Activity 深色、浅色、跟随系统
     *
     * @param appCompatDelegate Activity AppCompatDelegate
     * @param themeModeType  0:跟随系统 1:浅色 2:深色
     */
    public static void setThemeModeByActivity(AppCompatDelegate appCompatDelegate, int themeModeType) {
        if (appCompatDelegate != null) {
            switch (themeModeType) {
                case 0:
                    appCompatDelegate.setLocalNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
                    break;
                case 1:
                    appCompatDelegate.setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                    break;
                case 2:
                    appCompatDelegate.setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                    break;
            }
        }
    }

2、获取当前Activity是否开启深色

   /**
     * 通过Activity Resources 获取当前是否开启深色模式
     *
     * @param object
     * @return
     */
    public static boolean nightModeByUiResources(Object object) {
        if (object != null) {
            if (object instanceof Activity) {
                int currentNightMode = ((Activity) object).getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
                return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
            } else if (object instanceof androidx.fragment.app.Fragment) {
                int currentNightMode = ((Fragment) object).getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
                return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
            } else if (object instanceof android.app.Fragment) {
                int currentNightMode = ((android.app.Fragment) object).getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
                return currentNightMode == Configuration.UI_MODE_NIGHT_YES;
            }
        }

        return false;
    }

3、webView设置

   /**
     * 设置webView 深色或者浅色模式
     *
     * @param activity
     * @param webSetting
     */
    public static void setWebViewNight(Activity activity, WebSettings webSetting) {
        if (activity == null || webSetting == null) {
            return;
        }
        setWebViewNight(webSetting, nightModeByUiResources(activity));

    }

    /**
     * 设置webView 暗黑模式
     *
     * @param webSetting
     * @param nightMode true:深色  false:浅色
     */
    public static void setWebViewNight(WebSettings webSetting, boolean nightMode) {
        boolean featureSupported = false;
        try {
            featureSupported = WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK);
        } catch (AbstractMethodError e) {
            e.printStackTrace();
        }
        if (featureSupported) {
            if (nightMode) {
                //启用 webview 的强制黑暗模式,这意味着 webview 的内容将始终以黑暗主题呈现
                WebSettingsCompat.setForceDark(webSetting, WebSettingsCompat.FORCE_DARK_ON);
            } else {
                //禁用 webview 的强制暗模式,这意味着 webview 的内容将按原样呈现
                WebSettingsCompat.setForceDark(webSetting, WebSettingsCompat.FORCE_DARK_OFF);

            }
        }
    }

但是h5页面需要做特别判断才能拿到webView深浅模式

@media (prefers-color-scheme: dark) {这里是样式代码}

4、深色浅色切换时候,重启app

  /**
     * 浅色和深色模式切换,杀死进程,重新打开app
     *
     * @param activity
     */
    public static void restartApp(Activity activity) {
        Intent intent = activity.getPackageManager().getLaunchIntentForPackage(activity.getPackageName());
        if (intent != null) {
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            activity.startActivity(intent);
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    }

### Android 应用中实现与适配深色模式 #### 创建不同主题样式 为了使应用程序能够响应系统浅色深色模式,可以创建两套不同的 `styles.xml` 文件来定义两种主题。一套位于默认的 `values/styles.xml` 中用于浅色模式;另一套则放在特定于夜间配置的目录下,即 `values-night/styles.xml`。 对于浅色模式的主题设定如下所示: ```xml <!-- res/values/styles.xml --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your light theme here --> </style> ``` 而针对深色模式,则可以在相应的夜间资源文件夹内指定不同的颜色和其他视觉属性: ```xml <!-- res/values-night/styles.xml --> <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <!-- Customize your dark theme here --> </style> ``` 通过这种方式,当用户的设备启用了黑暗模式时,系统将会自动加载并应用这些专门设计过的外观设置[^4]。 #### 设置自适应的颜色方案 除了调整整体界面风格外,还需要确保各个组件使用的色彩也能够在不同光照条件下保持良好的可读性和美观度。这通常涉及到修改颜色值以及图片素材的选择。为此目的,在项目结构里新增加名为 `-night` 的子文件夹,并在里面放入适合夜晚观看的内容版本。例如,如果有一个图标需要改变其色调以匹配当前环境亮度的话,就可以这样做: - 将原始图像存入常规路径下的 `drawable/your_icon.png` - 准备一张经过处理后的变体图样保存至 `drawable-night/your_icon.png` 同样的逻辑适用于其他类型的静态资源,比如字符串、尺寸单位等都可以按照此方法进行区分管理[^1]。 #### 动态控制夜览状态 为了让开发者拥有更大的灵活性去决定何时启用何种显示形式,API 提供了一个叫做 `AppCompatDelegate` 的工具类允许程序内部手动触发切换操作。具体来说就是利用该对象所提供的几个静态成员函数之一——`setDefaultNightMode()` 来达到这一效果。它接受三个可能参数中的任意一个作为输入:`MODE_NIGHT_FOLLOW_SYSTEM`(跟随系统偏好), `MODE_NIGHT_AUTO_BATTERY`(基于电池优化策略自动选择) 或者直接强制开启(`MODE_NIGHT_YES`) / 关闭 (`MODE_NIGHT_NO`) 夜间布局。 下面是一段简单的 Java 代码片段用来展示如何在 Activity 启动之前更改整个应用程序级别的夜间模式选项: ```java import androidx.appcompat.app.AppCompatDelegate; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // 在super.onCreate()前调用,默认会在Activity启动的时候生效 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值