Kotlin 修改安装到桌面后的应用图标

在 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.xmlic_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

这是最简单的方法:

  1. 右键点击 res 目录NewImage Asset
  2. Icon Type 中选择 Launcher Icons (Adaptive and Legacy)
  3. 配置图标:
    • Foreground Layer: 选择图片或文字
    • Background Layer: 选择颜色或图片
    • Resize: 调整大小
  4. 点击 NextFinish

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

设计建议

  1. 简洁明了: 避免过多细节
  2. 品牌一致: 保持与品牌色彩一致
  3. 适当留白: 图标内容不要贴边
  4. 测试不同形状: 在不同厂商的桌面上测试显示效果

7. 清理和重建

修改图标后,建议:

  1. 清理项目: Build → Clean Project
  2. 重建项目: Build → Rebuild Project
  3. 卸载旧版本: 从设备卸载旧版本应用
  4. 重新安装: 安装新版本应用

这样就能确保新的图标正确显示在桌面上了。

相关推荐
来来走走1 小时前
Android开发(Kotlin) ViewModel基本用法
android·开发语言·kotlin
Caarlossss1 小时前
jdbc学习
java·开发语言·学习·http·tomcat·maven
lsx2024061 小时前
Bootstrap 标签详解
开发语言
FL16238631292 小时前
Qt自定义控件之仪表盘和水波纹圆形进度条的完整实现
开发语言·qt
用户69371750013842 小时前
6.Kotlin 流程控制:循环控制:while 与 do/while
android·后端·kotlin
缺点内向2 小时前
Java: 在 Excel 中插入、提取或删除文本框
java·开发语言·excel
星释2 小时前
Rust 练习册 60:鲍勃与字符串处理的状态机思维
开发语言·网络·rust
淡淡蓝蓝3 小时前
uni.uploadFile使用PUT方法上传图片
开发语言·前端·javascript
PyHaVolask3 小时前
PHP基础入门
开发语言·php