在 Kotlin Android 项目中修改安装到桌面后的应用图标有多种方式。以下是完整的修改方法:
1. 基本图标修改方法
步骤 1:准备图标资源
将不同尺寸的图标放在 res/mipmap 目录中:
res/
├── mipmap-hdpi/ (72x72)
├── mipmap-mdpi/ (48x48)
├── mipmap-xhdpi/ (96x96)
├── mipmap-xxhdpi/ (144x144)
├── mipmap-xxxhdpi/ (192x192)
└── mipmap-anydpi-v26/ (自适应图标)
步骤 2:修改 AndroidManifest.xml
xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher" <!-- 修改这里 -->
android:roundIcon="@mipmap/ic_launcher_round" <!-- 圆形图标 -->
android:label="@string/app_name"
android:theme="@style/Theme.MyApplication">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
2. 现代自适应图标 (Android 8.0+)
创建自适应图标资源
在 res/mipmap-anydpi-v26/ 目录下创建 ic_launcher.xml 和 ic_launcher_round.xml:
res/mipmap-anydpi-v26/ic_launcher.xml:
xml
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
res/mipmap-anydpi-v26/ic_launcher_round.xml:
xml
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>
创建前景和背景资源
res/drawable/ic_launcher_foreground.xml:
xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- 你的图标内容 -->
<path
android:fillColor="#FFFFFF"
android:pathData="M54,54m-50,0a50,50 0 1,1 100,0a50,50 0 1,1 -100,0"/>
<path
android:fillColor="#2196F3"
android:pathData="M44,44L64,44L64,64L44,64Z"/>
</vector>
res/drawable/ic_launcher_background.xml:
xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#2196F3"/> <!-- 背景颜色 -->
<corners android:radius="0dp"/>
</shape>
3. 使用 Android Studio 的 Image Asset Studio
这是最简单的方法:
- 右键点击
res目录 → New → Image Asset - 在 Icon Type 中选择 Launcher Icons (Adaptive and Legacy)
- 配置图标:
- Foreground Layer: 选择图片或文字
- Background Layer: 选择颜色或图片
- Resize: 调整大小
- 点击 Next → Finish
Android Studio 会自动生成所有需要的图标尺寸。
4. 动态修改应用图标 (Android 8.0+)
某些情况下可能需要动态切换图标:
在 AndroidManifest.xml 中定义备用 Activity
xml
<application>
<!-- 默认启动图标 -->
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 备用启动图标 -->
<activity
android:name=".MainActivityAlt"
android:exported="false"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
</application>
在 Kotlin 代码中切换图标
kotlin
class IconManager(private val context: Context) {
fun changeAppIcon(iconType: String) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val packageManager = context.packageManager
// 禁用当前组件
val currentComponent = ComponentName(context, MainActivity::class.java)
packageManager.setComponentEnabledSetting(
currentComponent,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
)
// 启用备用组件
val altComponent = ComponentName(context, MainActivityAlt::class.java)
packageManager.setComponentEnabledSetting(
altComponent,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
// 发送广播更新桌面
val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_HOME)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
} else {
Toast.makeText(context, "动态图标切换需要 Android 8.0+", Toast.LENGTH_SHORT).show()
}
}
fun resetAppIcon() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val packageManager = context.packageManager
// 启用默认组件
val currentComponent = ComponentName(context, MainActivity::class.java)
packageManager.setComponentEnabledSetting(
currentComponent,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
// 禁用备用组件
val altComponent = ComponentName(context, MainActivityAlt::class.java)
packageManager.setComponentEnabledSetting(
altComponent,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
)
}
}
}
// 使用示例
class MainActivity : AppCompatActivity() {
private lateinit var iconManager: IconManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
iconManager = IconManager(this)
val changeIconButton: Button = findViewById(R.id.changeIconButton)
changeIconButton.setOnClickListener {
iconManager.changeAppIcon("christmas") // 切换到节日图标
}
val resetIconButton: Button = findViewById(R.id.resetIconButton)
resetIconButton.setOnClickListener {
iconManager.resetAppIcon() // 恢复默认图标
}
}
}
5. 不同构建变体的不同图标
在 build.gradle.kts (Module: app) 中配置:
kotlin
android {
buildTypes {
getByName("debug") {
applicationIdSuffix = ".debug"
// 调试版本使用不同图标
resValue("mipmap", "ic_launcher", "@mipmap/ic_launcher_debug")
}
getByName("release") {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
flavorDimensions += "environment"
productFlavors {
create("dev") {
dimension = "environment"
applicationIdSuffix = ".dev"
// 开发环境使用不同图标
resValue("mipmap", "ic_launcher", "@mipmap/ic_launcher_dev")
}
create("prod") {
dimension = "environment"
// 生产环境使用正式图标
}
}
}
6. 图标最佳实践
尺寸规范
- 自适应图标: 108dp × 108dp (前景层), 背景层会裁剪
- 传统图标 :
- MDPI: 48×48
- HDPI: 72×72
- XHDPI: 96×96
- XXHDPI: 144×144
- XXXHDPI: 192×192
设计建议
- 简洁明了: 避免过多细节
- 品牌一致: 保持与品牌色彩一致
- 适当留白: 图标内容不要贴边
- 测试不同形状: 在不同厂商的桌面上测试显示效果
7. 清理和重建
修改图标后,建议:
- 清理项目: Build → Clean Project
- 重建项目: Build → Rebuild Project
- 卸载旧版本: 从设备卸载旧版本应用
- 重新安装: 安装新版本应用
这样就能确保新的图标正确显示在桌面上了。