如何在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
相关产品推荐
相关产品推荐

