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

如何根据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:52:49