主题定制
从 5.30.0 版本开始,IMKit 支持主题定制功能,提供传统主题和欢快主题两种内置主题,同时支持自定义主题。
功能概述
IMKit 的主题定制功能提供了灵活的主题配置能力,包括:
- 内置主题:传统主题(Traditional)和欢快主题(Lively)
- 自定义主题:支持基于内置主题进行颜色和图片的自定义
- 深色模式:Android 10+ 自动适配系统深色模式
- 动态切换:运行时无缝切换主题,无需重启应用
效果预览
| 传统主题-浅色 | 欢快主题-浅色 | 欢快主题-深色 |
|---|---|---|
![]() | ![]() | ![]() |
主题资源
IMKit SDK 组件包含所支持的内置主题资源。传统主题资源位于 res 文件夹下,欢快主题资源位于 res-lively 相关文件夹下。
欢快主题包含浅色和深色两套资源,分别位于 res-lively-light 和 res-lively-dark 文件夹下。
每个主题文件夹包含 values 配置文件和 drawable 资源文件夹。
values 文件夹存储了当前主题所使用的颜色、样式等配置;
drawable 资源文件夹存储了当前主题所使用的图片资源。
新增主题需要基于内置主题实现,用户需提供包含样式配置文件和资源文件夹的资源包,其中样式配置按需添加,缺失的配置,SDK 会从内置主题浅色资源中获取对应资源替换。
快速开始
使用内置主题
IMKit SDK 默认使用传统主题,您可以通过以下方式切换主题:
import io.rong.imkit.config.IMKitThemeManager;
// 切换到传统主题
IMKitThemeManager.changeInnerTheme(context, IMKitThemeManager.TRADITION_THEME);
// 切换到欢快主题
IMKitThemeManager.changeInnerTheme(context, IMKitThemeManager.LIVELY_THEME);
主题系统架构
核心类说明
IMKitThemeManager
主题管理器,负责主题的切换和资源获取。
主要方法:
| 方法 | 说明 |
|---|---|
changeInnerTheme(Context, String) | 切换内置主题 |
changeCustomTheme(Context, String, String) | 应用自定义主题 |
getCurrentThemeName() | 获取当前主题名称 |
getAttrResId(Context, int) | 获取主题属性资源ID |
addTheme(String, int, int) | 添加自定义主题 |
addThemeListener(OnThemeListener) | 添加主题变更监听 |
removeThemeListener(OnThemeListener) | 移除主题变更监听 |
主题常量
内置主题类型常量。
public class IMKitThemeManager {
public static final String TRADITION_THEME = "TRADITION_THEME"; // 传统主题
public static final String LIVELY_THEME = "LIVELY_THEME"; // 欢快主题
}
主题切换
应用内置主题
IMKit 提供两种内置主题:传统主题(Traditional)和欢快主题(Lively)。
切换到传统主题
import io.rong.imkit.config.IMKitThemeManager;
// 切换到传统主题
IMKitThemeManager.changeInnerTheme(context, IMKitThemeManager.TRADITION_THEME);
切换到欢快主题
// 切换到欢快主题
IMKitThemeManager.changeInnerTheme(context, IMKitThemeManager.LIVELY_THEME);
获取当前主题
// 获取当 前主题名称
String currentTheme = IMKitThemeManager.getCurrentThemeName();
if (IMKitThemeManager.TRADITION_THEME.equals(currentTheme)) {
Log.d("Theme", "当前使用传统主题");
} else if (IMKitThemeManager.LIVELY_THEME.equals(currentTheme)) {
Log.d("Theme", "当前使用欢快主题");
}
深色模式支持
IMKit 会自动适配 Android 10+ 的系统深色模式,无需额外配置。
- Android 10+:完整支持深色模式
- Android 10 以下:仅支持浅色模式
自定义主题
创建自定义主题
步骤 1:准备主题资源
创建主题资源文件夹,包含配置文件和资源文件:
app/src/main/
├── res-custom-ocean/ # 通用资源(可选)
│ ├── drawable/
│ └── drawable-xxhdpi/
├── res-custom-ocean-light/ # 浅色主题资源
│ ├── values/
│ │ ├── ocean_colors.xml
│ │ └── ocean_style.xml
│ └── drawable/
└── res-custom-ocean-dark/ # 深色主题资源
├── values/
│ ├── ocean_dark_colors.xml
│ └── ocean_dark_style.xml
└── drawable/
步骤 2:配置 Gradle
在 build.gradle 中添加资源文件夹:
android {
sourceSets {
main {
res.srcDirs = [
'src/main/res',
'src/main/res-custom-ocean',
'src/main/res-custom-ocean-light',
'src/main/res-custom-ocean-dark'
]
}
}
}
步骤 3:定义颜色资源
res-custom-ocean-light/values/ocean_colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 主色 -->
<color name="rc_primary_color_ocean_light">#0077BE</color>
<!-- 文字色 -->
<color name="rc_text_primary_color_ocean_light">#1A1A1A</color>
<color name="rc_text_secondary_color_ocean_light">#6B7280</color>
<!-- 功能色 -->
<color name="rc_success_color_ocean_light">#10B981</color>
<color name="rc_hint_color_ocean_light">#EF4444</color>
<color name="rc_disabled_color_ocean_light">#D1D5DB</color>
<!-- 背景色 -->
<color name="rc_common_background_color_ocean_light">#F0F9FF</color>
<color name="rc_auxiliary_background_1_color_ocean_light">#E0F2FE</color>
<color name="rc_line_background_color_ocean_light">#E5E7EB</color>
</resources>
步骤 4:定义样式主题
res-custom-ocean-light/values/ocean_style.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 自定义海洋主题 -->
<style name="RCOceanLightTheme">
<!-- 主色 -->
<item name="rc_primary_color">@color/rc_primary_color_ocean_light</item>
<!-- 文字色 -->
<item name="rc_text_primary_color">@color/rc_text_primary_color_ocean_light</item>
<item name="rc_text_secondary_color">@color/rc_text_secondary_color_ocean_light</item>
<!-- 功能色 -->
<item name="rc_success_color">@color/rc_success_color_ocean_light</item>
<item name="rc_hint_color">@color/rc_hint_color_ocean_light</item>
<item name="rc_disabled_color">@color/rc_disabled_color_ocean_light</item>
<!-- 背景及线条色 -->
<item name="rc_common_background_color">@color/rc_common_background_color_ocean_light</item>
<item name="rc_auxiliary_background_1_color">@color/rc_auxiliary_background_1_color_ocean_light</item>
<item name="rc_line_background_color">@color/rc_line_background_color_ocean_light</item>
<!-- 图标资源 -->
<item name="rc_navigation_bar_btn_back_img">@drawable/rc_navigation_bar_btn_back_ocean</item>
<item name="rc_navigation_bar_btn_more_img">@drawable/rc_navigation_bar_btn_more_ocean</item>
</style>
</resources>
在定义主题样式时,必须使用颜色资源引用(如 @color/rc_primary_color_ocean_light),不要直接使用颜色值(如 #0077BE)。
❌ 错误示例:
<style name="RCOceanLightTheme">
<!-- 不要这样做! -->
<item name="rc_primary_color">#0077BE</item>
</style>
✅ 正确示例:
<style name="RCOceanLightTheme">
<!-- 必须引用颜色资源 -->
<item name="rc_primary_color">@color/rc_primary_color_ocean_light</item>
</style>
使用颜色资源引用的优势:
- ✅ 易于维护:颜色定义集中管理,修改时只需改一处
- ✅ 资源复用: 同一颜色可以在多处引用,保持一致性
- ✅ 深浅色适配:配合
values-night可以自动适配深浅色模式 - ✅ 符合规范:遵循 Android 资源管理最佳实践
- ✅ 避免错误:直接使用颜色值可能导致主题系统无法正确解析资源
步骤 5:注册并使用自定义主题
在 Application 初始化时注册主题:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 注册自定义主题
IMKitThemeManager.addTheme(
"THEME_OCEAN",
R.style.RCOceanLightTheme, // 浅色样式
R.style.RCOceanDarkTheme // 深色样式
);
}
}
切换到自定义主题:
// 基于欢快主题的自定义主题(推荐)
IMKitThemeManager.changeCustomTheme(
context,
"THEME_OCEAN",
IMKitThemeManager.LIVELY_THEME
);
// 基于传统主题的自定义主题
IMKitThemeManager.changeCustomTheme(
context,
"THEME_OCEAN",
IMKitThemeManager.TRADITION_THEME
);


