消息回应
IMKit 从 5.42.0 开始支持消息回应(Message Reaction)UI。开启后,用户可以在会话页面长按消息,选择表情回应,用 emoji 对消息进行回应。IMKit 会在消息气泡下方展示回应内容,并支持查看回应详情。
- IMKit 消息回应默认关 闭,需要通过配置开启。
- IMKit 仅提供会话页面 UI。底层数据能力由 IMLib 的消息回应接口提供。
- 如果你只使用 IMLib 或需要完全自定义 UI,请直接调用 IMLib 的消息回应接口。



使用限制
- IMKit 内置会话页面仅支持单聊、群聊会话中的消息回应。
- 支持的内置消息类型包括文本、图文、图片、GIF、普通语音、高清语音、小视频、文件、位置、引用消息、合并转发消息。
- 发送中、发送失败、取消发送或本地尚未生成
messageUId的消息不支持添加回应。 - IMKit 不在会话列表中展示消息回应。
开启消息回应
建议在打开会话页面前开启消息回应。配置开启后,IMKit 会在支持的消息长按菜单中显示表情回应入口。
RongConfigCenter.featureConfig().enableMessageReaction(true);
关闭时传入 false。
RongConfigCenter.featureConfig().enableMessageReaction(false);
设置展示模式
消息回应展示在消息气泡下方。IMKit 提供两种展示模式,默认使用 COUNT_ONLY。请在进入会话页面前设置展示模式。
| 展示模式 | 说明 |
|---|---|
MessageReactionDisplayMode.COUNT_ONLY | 仅显示回应表情和人数,例如 👍 和 3人。人数超过 99 时显示 99+。 |
MessageReactionDisplayMode.DETAIL | 显示回应表情和部分用户名称,超出一行时显示 ...N人。 |
RongConfigCenter.conversationConfig()
.setMessageReactionDisplayMode(MessageReactionDisplayMode.COUNT_ONLY);
DETAIL 模式下,用户名称按以下优先级展示:好友备注或 UserInfo.alias、群成员昵称或名称、用户名称、userId。
默认交互
开启消息回应后,IMKit 内置会话页面提供以下默认交互:
- 用户长按支持的消息,长按菜单中显示表情回应。
- 点击表情回应后,底部弹出回应表情选择器。
- 用户选择表情后,IMKit 会调用 IMLib 的
addMessageReaction或removeMessageReaction。 - 消息气泡下方展示回应项。当前用户已回应的项会高亮。
- 点击回应项中的 emoji 区域会添加或移除该回应:当前用户未添加该回应时执行添加;已添加时执行移除。
- 在
COUNT_ONLY模式下,点击人数文本会打开回应详情;在DETAIL模式下,点击...N人会打开回应详情。
回应项背景、空白区域、分隔线,以及 DETAIL 模式中的用户名称文本会消费点击事件,但不会触发添加、移除、查看详情或消息本身的点击事件。
表情选择器
表情选择器包含两个区域:
| 区域 | 说明 |
|---|---|
| 最常使用 | 用户成功添加过回应后显示。最多展示配置数量的常用表情。 |
| 默认表情 | 与聊天输入框 emoji 面板使用同一份表情数据,数量和顺序保持一致。 |
首次使用时没有常用数据,只显示默认表情。常用表情数据保存在本地应用安装中,卸载重装后会重新统计。IMKit 仅在成功添加回应时记录常用次数,移除回应或操作失败不会记录。
设置常用表情显示数量
默认显示 14 个常用表情。有效范围为 1 到 20,传入范围外的值会恢复默认值 14。
RongConfigCenter.conversationConfig()
.setMessageReactionFrequentDisplayCount(14);
回应详情
用户点击回应人数后,IMKit 会打开回应详情弹层:
- 顶部按回应类型展示 tab。
- 默认选中用户点击的回应。
- 下方分页展示添加该回应的用户列表。
- 用户列表中显示用户头像、名称和回应时间。
用户列表会按需分页加载更多数据,分页能力来自 IMLib 的 getMessageReactionUsers 接口。
拦截回应事件
可以通过 setOnMessageReactionClickListener 拦截 IMKit 默认交互,或自定义错误处理。回调返回 true 表示应用已处理该事件,IMKit 不再执行默认逻辑。返回 false 表示继续执行 IMKit 默认逻辑。
RongConfigCenter.featureConfig()
.setOnMessageReactionClickListener(
new OnMessageReactionClickListener() {
@Override
public boolean onMessageReactionClicked(
MessageReaction reaction, UiMessage message) {
// 返回 true 表示已处理,IMKit 不再执行默认添加或移除逻辑。
return false;
}
@Override
public boolean onMessageReactionDetailClicked(
MessageReaction reaction, UiMessage message) {
// 返回 true 表示已处理,IMKit 不再展示默认详情页。
return false;
}
@Override
public boolean onMessageReactionUserClicked(
MessageReactionUser user,
UiMessage message,
MessageReaction reaction) {
// 返回 true 表示已处理。IMKit 默认无额外动 作。
return false;
}
@Override
public boolean onMessageReactionClickError(
IRongCoreEnum.CoreErrorCode errorCode,
UiMessage message,
String reactionId) {
// 返回 true 表示已处理错误,IMKit 不再展示默认错误提示。
return false;
}
});
各回调说明如下:
| 回调 | 触发时机 |
|---|---|
onMessageReactionClicked | 用户点击消息下方已有回应项中的 emoji 区域时触发。 |
onMessageReactionDetailClicked | 用户点击回应人数文本或 DETAIL 模式中的 ...N人 文本时触发。 |
onMessageReactionUserClicked | 用户点击回应详情中的用户时触发。 |
onMessageReactionClickError | 添加或移除回应失败时触发。返回 false 时,IMKit 会展示默认错误提示。 |
与 IMLib 数据的关系
IMKit 会在消息列表加载时,根据 Message.isHasReactions() 批量查询可见消息的回应摘要。即使 isHasReactions() 为 true,如果 IMLib 摘要查询返回空结果,IMKit 也会隐藏该消息的回应区域。