如何实现Google Play应用图标随深浅主题切换背景颜色
效果示例
- 浅色模式图标:

- 深色模式图标:

可行实现方案
该效果分两种场景,对应不同的实现逻辑:
方案1:Google Play商店展示图标适配
针对Play商店列表、详情页的展示图标效果,无需修改应用代码,直接在开发者后台配置即可:
- 登录Google Play开发者控制台,进入对应应用的「商店呈现」设置页
- 在图标上传区域,分别上传浅色模式、深色模式两套展示图标
- 提交审核生效后,Google Play客户端会自动根据用户系统当前的主题状态,展示对应版本的图标
方案2:桌面启动器图标适配(Android 8.0+ 官方推荐)
针对用户安装后桌面显示的启动器图标,使用安卓官方自适应图标特性实现,无需额外编写业务代码,系统自动处理切换逻辑:
- 在
res/values目录下的colors.xml中定义浅色模式下的图标背景色:
<color name="launcher_icon_bg">#FFFFFF</color>
- 新建
res/values-night目录,在目录下新建同名colors.xml,定义深色模式下的同名字段:
<color name="launcher_icon_bg">#121212</color>
- 在
res/mipmap-anydpi-v26目录下的自适应图标配置文件(通常命名为ic_launcher.xml)中,将背景层资源指向刚才定义的颜色:
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@color/launcher_icon_bg" /> <foreground android:drawable="@mipmap/ic_launcher_foreground" /> </adaptive-icon>
系统会自动根据当前主题加载对应的颜色值,实现图标背景随主题切换。
方案3:全版本通用自定义图标切换
如果需要适配Android 8.0以下版本,或者需要同时切换图标的前景样式,可以通过动态切换Activity别名实现:
- 提前准备好浅色、深色两套完整的图标资源,放到对应mipmap目录下
- 在
AndroidManifest.xml中注册两个指向主启动Activity的activity-alias,分别配置不同的图标属性,默认启用浅色模式的别名:
<activity-alias android:name=".MainActivityLight" android:enabled="true" android:icon="@mipmap/ic_launcher_light" android:targetActivity=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> <activity-alias android:name=".MainActivityDark" android:enabled="false" android:icon="@mipmap/ic_launcher_dark" android:targetActivity=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias>
- 重写Application或者主Activity的
onConfigurationChanged方法,监听系统主题变化:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); int nightMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK; boolean isDarkMode = nightMode == Configuration.UI_MODE_NIGHT_YES; updateLauncherIcon(isDarkMode); }
- 实现
updateLauncherIcon方法,通过PackageManager动态切换启用的别名:
private void updateLauncherIcon(boolean isDarkMode) { PackageManager pm = getPackageManager(); // 启用对应模式的别名,禁用另一个 pm.setComponentEnabledSetting( new ComponentName(this, "com.your.package.MainActivityLight"), isDarkMode ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED : PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ); pm.setComponentEnabledSetting( new ComponentName(this, "com.your.package.MainActivityDark"), isDarkMode ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP ); }
注意:部分第三方桌面启动器存在图标缓存,切换后可能需要几秒到几十秒才会刷新显示。
内容的提问来源于stack exchange,提问作者Omar Abo Esmail
相关产品推荐
相关产品推荐

