需求:ListView 點擊不同 Item,整個 App 的 `LinearLayout` 背景色與圖片色調同步變化(如白→黃)。
| 方案 | 原理 | 優點 | 缺點 |
|---|---|---|---|
| **換膚框架** (Android-Skin-Loader, MagicaSakura, SkinCompat) | Runtime 替換 Resource/Theme,支援插件式皮膚包 | 功能全、支援動態下載皮膚、無侵入業務代碼 | 學習成本較高、體積稍大 |
| **自定義屬性 + 全局狀態** | 定義 `attr/theme_bg`、`attr/theme_icon`,`ContextThemeWrapper` 包裝 View 解析屬性,`SharedPreferences` 持久化當前主題 ID | 輕量、可控、無第三方依賴 | 需手動處理 View 刷新(`recreate()` 或觀察者模式通知更新) |
| **Material Components (MDC) + ColorStateList** | 利用 `MaterialTheme`、`ColorSurface`、`ColorPrimary` 系統色槽,切換 `ThemeOverlay` | 原生支援、暗黑模式無縫切換、設計規範一致 | 需遷移至 MDC 組件、自定義色彩較繁瑣 |
listView.setOnItemClickListener((parent, view, position, id) -> {
int themeResId = themes[position]; // R.style.Theme_Yellow 等
SkinManager.getInstance().setTheme(themeResId); // 全局單例管理
// 即時刷新當前頁
recreate(); // 或手動更新根佈局背景、圖片 tint
});
推薦:**輕量專案用自定義屬性+全局單例+recreate()**;**需動態下載皮膚/插件化用成熟換膚框架**。