在 Kotlin Android 开发中,更改应用程序安装到桌面后的图标可以通过几种不同的方法实现。以下是详细的修改指南:
步骤 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 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>
为了支持现代设备上的自适应图标,你需要创建特定的资源文件。
步骤 1:创建自适应图标资源
在以下目录中生成必要的文件:
res/mipmap-anydpi-v26/
创建两个 XML 文件:
ic_launcher.xmlic_launcher_round.xml
res/mipmap-anydpi-v26/ic_launcher.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 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>
步骤 2:创建前景与背景资源
定义前景和背景图像资源,例如:
res/drawable/ic_launcher_foreground.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 应用程序启动图标背景 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>
文件路径:res/drawable/ic_launcher_background.xml
这是创建启动图标最简便的方式:
完成后,Android Studio 将自动为你生成所有必需的图标尺寸。
res
在某些情况下,你可能需要在运行时动态地更换应用图标。这可以通过在 AndroidManifest.xml 中定义备用 Activity 来实现:
<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 代码中实现图标切换逻辑:
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)
// 进一步的启用操作...
}
}
}
为了实现应用图标的动态切换功能,可以通过以下代码示例来管理应用的不同图标状态。首先,我们需要定义一个 IconManager 类,用于处理图标切换和恢复操作。
// 动态切换应用图标的方法
fun changeAppIcon(iconName: 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
)
}
}
接下来,在主活动 MainActivity 中实例化 IconManager 并设置按钮点击事件来调用图标切换或恢复方法。
// 使用示例
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() // 恢复默认图标
}
}
}
此外,为了支持不同构建变体下的不同图标,可以在项目的 build.gradle 文件中进行相应的配置。例如:
// 不同构建变体的不同图标配置
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"
applicationIdSuffix = ".prod"
// 生产环境使用默认图标
resValue("mipmap", "ic_launcher", "@mipmap/ic_launcher")
}
}
}
通过以上配置,可以根据不同的构建类型和产品风味设置不同的应用图标,从而更好地适应开发、测试和生产环境的需求。
build.gradle.kts自适应图标: 前景层尺寸为108dp × 108dp,背景层会被裁剪。
传统图标:
简洁明了: 避免图标中包含过多的细节。
品牌一致: 确保图标的颜色与品牌形象保持一致。
适当留白: 图标的内容不应紧贴边缘,应留有一定的空间。
测试不同形状: 在不同的设备和厂商的桌面上测试图标的显示效果,以确保兼容性和视觉效果。
在修改图标后,为了确保新的图标能够正确显示在用户的桌面上,建议执行以下步骤:
遵循上述步骤,可以帮助开发者确保应用程序的新图标能够在用户设备上正确无误地展示。
扫码加好友,拉您进群



收藏
