如何根据SharedPreference数据手动设置Android 12动态颜色?
手动切换动态颜色的实现方案
1. 存储用户动态颜色偏好
用SharedPreferences轻量存储用户的选择,方便全局读取:
// 保存用户的动态颜色开关状态 fun saveDynamicColorSetting(context: Context, isEnabled: Boolean) { context.getSharedPreferences("app_settings", Context.MODE_PRIVATE) .edit() .putBoolean("dynamic_color_enabled", isEnabled) .apply() } // 获取当前动态颜色开关状态,默认开启 fun getDynamicColorSetting(context: Context): Boolean { return context.getSharedPreferences("app_settings", Context.MODE_PRIVATE) .getBoolean("dynamic_color_enabled", true) }
2. 根据偏好动态应用动态颜色
不要直接在Application中全局调用DynamicColors.applyToActivitiesIfAvailable(this),而是在**BaseActivity的onCreate方法(setContentView之前)**根据用户设置处理:
open class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { val isDynamicColorEnabled = getDynamicColorSetting(this) if (isDynamicColorEnabled) { // 开启时应用动态颜色 DynamicColors.applyToActivityIfAvailable(this) } else { // 关闭时使用不带动态颜色的主题 setTheme(R.style.AppTheme_NoDynamic) } super.onCreate(savedInstanceState) setContentView(R.layout.activity_base) } }
主题配置说明
需要准备两套主题:
- 支持动态颜色的主题(默认):
<style name="AppTheme" parent="Theme.Material3.DayNight.DynamicColors"> <!-- 自定义主题属性 --> </style> - 不支持动态颜色的主题:
<style name="AppTheme_NoDynamic" parent="Theme.Material3.DayNight"> <!-- 自定义主题属性,与AppTheme保持一致 --> </style>
3. 设置页处理用户切换
在设置页的开关控件中处理用户选择,保存设置后重启页面或应用生效:
// 绑定设置页的开关 val dynamicColorSwitch = findViewById<SwitchCompat>(R.id.switch_dynamic_color) dynamicColorSwitch.isChecked = getDynamicColorSetting(this) dynamicColorSwitch.setOnCheckedChangeListener { _, isChecked -> saveDynamicColorSetting(this, isChecked) // 重启当前Activity生效(或重启整个应用) recreate() // 如果要重启整个应用,用下面的代码: // val intent = packageManager.getLaunchIntentForPackage(packageName) // intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) // startActivity(intent) // finish() }
注意事项
- 如果在
Application中全局应用动态颜色,修改设置后必须重启整个应用才能生效;在BaseActivity中处理则只需recreate()当前页面。 - 首次安装默认开启动态颜色,符合系统默认体验,也可根据需求调整默认值。
内容的提问来源于stack exchange,提问作者Toqgcm
相关产品推荐
相关产品推荐

