You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin的SettingsFragment中通过SwitchPreference切换深色模式

实现SwitchPreference切换深色模式完整步骤

1. 引入偏好组件依赖

首先在模块级build.gradle文件中添加AndroidX偏好库依赖,确保可以使用Preference相关组件:

dependencies {
    // Kotlin项目用这个
    implementation "androidx.preference:preference-ktx:1.2.1"
    // Java项目替换为下面这个
    // implementation "androidx.preference:preference:1.2.1"
}

同步Gradle配置后再进行后续操作。

2. 编写偏好配置XML

在res/xml目录下新建root_preferences.xml文件,定义SwitchPreference控件:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <SwitchPreference
        android:key="dark_mode_switch"
        android:title="深色模式"
        android:summary="开启后应用切换为深色主题"
        android:defaultValue="false" />
</PreferenceScreen>

这里的android:key值后续会用来获取开关实例,不要随意修改。

3. 实现SettingsFragment逻辑

新建SettingsFragment类,继承自PreferenceFragmentCompat,加载上面的偏好配置,同时监听开关的切换事件:

import android.os.Bundle
import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference

class SettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        // 加载偏好配置XML
        setPreferencesFromResource(R.xml.root_preferences, rootKey)
        
        // 获取深色模式开关实例
        val darkModeSwitch = findPreference<SwitchPreference>("dark_mode_switch")
        
        // 监听开关切换事件
        darkModeSwitch?.setOnPreferenceChangeListener { _, newValue ->
            val isDarkMode = newValue as Boolean
            // 切换主题
            if (isDarkMode) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
            } else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
            }
            // 重启当前Activity让主题立即生效
            activity?.recreate()
            true
        }
    }
}

如果需要跟随系统主题,也可以把关闭状态的取值替换为AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM。

4. 应用启动时恢复主题配置

只在开关切换时设置主题无法在应用重启后保留效果,需要在应用启动时读取保存的开关状态提前设置主题。你可以在自定义Application类的onCreate方法中添加如下逻辑:

import android.app.Application
import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.PreferenceManager

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        // 获取默认的SharedPreferences实例
        val prefs = PreferenceManager.getDefaultSharedPreferences(this)
        // 读取深色模式开关状态,默认值为false
        val isDarkMode = prefs.getBoolean("dark_mode_switch", false)
        // 设置主题
        if (isDarkMode) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
        } else {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
        }
    }
}

记得要在AndroidManifest.xml的application标签中添加android:name=".MyApp"属性,让自定义Application类生效。

5. 适配主题配置

要让深色模式正常生效,还需要做两个基础配置:

  • 应用的基础主题需要继承自DayNight系列主题,示例:
    <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <!-- 其他主题配置 -->
    </style>
    
  • 所有需要适配深色模式的Activity都要继承自AppCompatActivity。
  • 如果有自定义颜色,可分别在res/values/colors.xml和res/values-night/colors.xml中定义同名不同值的颜色资源,系统会根据当前主题自动匹配。

内容的提问来源于stack exchange,提问作者MaksChojniak1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:00:03