会话页面自定义
消息点击事件
您可以通过调用 addMessageClickListener 方法监听消息的点击事件。消息点击监听 MessageClickListener 的所有方法均为可选方法,可以按需实现。
提示
- 从 
1.4.3版本开始,onMessageClick支持语音消息。 - 从 
1.4.3版本开始,所有方 法均增加Context、ClickEvent/GestureEvent参数。 
警告
为了避免内存泄漏,请将监听保存,在必要的时候移除。
接口定义
TypeScript
export interface MessageClickListener {
  /**
   * 消息头像点击事件
   */
  onMessagePortraitClick?: (message: Message, userId: string, context?: Context, event?: ClickEvent) => boolean;
  
  /**
   * 消息头像长按事件
   */
  onMessagePortraitLongClick?: (message: Message, user: UserInfoModel, context?: Context, event?: GestureEvent) => boolean;
  
  /**
   * 消息点击事件
   */
  onMessageClick?: (message: Message, context?: Context, event?: ClickEvent) => boolean;
  
  /**
   * 消息长按事件
   */
  onMessageLongClick?: (message: Message, context?: Context, event?: GestureEvent) => boolean;
  
  /**
   * 消息撤回编辑事件
   */
  onMessageRecallEditClick?: (message: Message, context?: Context, event?: ClickEvent) => boolean;
  
  /**
   * 文本消息超链接点击事件
   */
  onMessageLinkClick?: (message: Message, url: string, context?: Context, event?: ClickEvent) => boolean;
  
  /**
   * 文本消息 Email 点击事件
   */
  onMessageEmailClick?: (message: Message, email: string, context?: Context, event?: ClickEvent) => boolean;
  
  /**
   * 文本消息手机号点击事件
   */
  onMessagePhoneClick?: (message: Message, phone: string, context?: Context, event?: ClickEvent) => boolean;
}
方法说明
MessageClickListener
| 方法名 | 参数 | 返回值 | 说明 | 支持版本 | 
|---|---|---|---|---|
onMessagePortraitClick | message: MessageuserId: stringcontext?: Contextevent?: ClickEvent | boolean | 消息头像点击事件。返回 true 表示 App 处理该事件,SDK 不再处理;返回 false 表示由 SDK 处理 | 1.4.3+ | 
onMessagePortraitLongClick | message: Messageuser: UserInfoModelcontext?: Contextevent?: GestureEvent | boolean | 消息头像长按事件。返回 true 表示 App 处理该事件,SDK 不再处理;返回 false 表示由 SDK 处理 | 1.4.3+ | 
onMessageClick | message: Messagecontext?: Contextevent?: ClickEvent | boolean | 消息点击事件。从 1.4.3 版本开始支持语音消息。返回 true 表示 App 处理该事件,SDK 不再处理;返回 false 表示由 SDK 处理 | 1.4.3+ | 
onMessageLongClick | message: Messagecontext?: Contextevent?: GestureEvent | boolean | 消息长按事件。返回 true 表示 App 处理该事件,SDK 不再处理;返回 false 表示由 SDK 处理 | 1.4.3+ | 
onMessageRecallEditClick | message: Messagecontext?: Contextevent?: ClickEvent | boolean | 消息撤回编辑事件。返回 true 表示 App 处理该事件,SDK 不再处理;返回 false 表示由 SDK 处理 | 1.4.3+ | 
onMessageLinkClick | message: Messageurl: stringcontext?: Contextevent?: ClickEvent | boolean | 文本消息超链接点击事件。返回 true 表示 App 处理该事件,SDK 不再处理;返回 false 表示由 SDK 处理 | 1.4.3+ | 
onMessageEmailClick | message: Messageemail: stringcontext?: Contextevent?: ClickEvent | boolean | 文本消息 Email 点击事件。返回 true 表示 App 处理该事件,SDK 不再处理;返回 false 表示由 SDK 处理 | 1.4.3+ | 
onMessagePhoneClick | message: Messagephone: stringcontext?: Contextevent?: ClickEvent | boolean | 文本消息手机号点击事件。返回 true 表示 App 处理该事件,SDK 不再处理;返回 false 表示由 SDK 处理 | 1.4.3+ | 
示例代码
TypeScript
let msgClickListener: MessageClickListener = {
  onMessagePortraitClick: (message: Message, userId: string, context?: Context, event?: ClickEvent) => {
    // 消息头像点击事件
    // true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
    return false;
  },
  onMessagePortraitLongClick: (message: Message, user: UserInfoModel, context?: Context, event?: GestureEvent) => {
    // 消息头像长按事件
    // true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
    return false;
  },
  onMessageClick: (message: Message, context?: Context, event?: ClickEvent) => {
    // 消息点击事件
    // true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
    return false;
  },
  onMessageLongClick: (message: Message, context?: Context, event?: GestureEvent) => {
    // 消息长按事件
    // true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
    return false;
  },
  onMessageRecallEditClick: (message: Message, context?: Context, event?: ClickEvent) => {
    // 消息撤回编辑事件
    // true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
    return false;
  },
  onMessageLinkClick: (message: Message, url: string, context?: Context, event?: ClickEvent) => {
    // 文本消息超链接点击事件
    // true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
    return false;
  },
  onMessageEmailClick: (message: Message, email: string, context?: Context, event?: ClickEvent) => {
    // 文本消息 Email 点击事件
    // true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
    return false;
  },
  onMessagePhoneClick: (message: Message, phone: string, context?: Context, event?: ClickEvent) => {
    // 文本消息手机号点击事件
    // true 由 App 处理该事件,SDK 不再处理。false 由 SDK 处理
    return false;
  },
}
RongIM.getInstance().conversationService().addMessageClickListener(msgClickListener);
增加消息气泡的长按事件
您可以通过 addMessageItemLongClickAction 方法设置会话页面的长按消息事件监听,在相关监听方法中自定义事件。
接口定义
TypeScript
/**
 * 长按事件配置接口
 */
export interface ItemLongClickAction<Message> {
  /**
   * 获取长按菜单显示的标题
   */
  obtainTitle: (context: Context, data: Message) => string | Resource;
  
  /**
   * 长按菜单项的点击事件
   */
  onClick: (context: Context, data: Message) => void;
  
  /**
   * 过滤条件,用于控制该长按菜单项是否显示
   */
  onFilter: (data: Message) => boolean;
  
  /**
   * 动作 ID,用于唯一标识该长按事件
   */
  actionId: string;
}
参数说明
ItemLongClickAction
| 参数名 | 类型 | 必填 | 说明 | 
|---|---|---|---|
obtainTitle | (context: Context, data: Message) => string | Resource | 是 | 长按菜单显示的标题,返回字符串或资源 ID | 
onClick | (context: Context, data: Message) => void | 是 | 用户点击长按菜单项时触发的回调函数 | 
onFilter | (data: Message) => boolean | 是 | 过滤条件函数,返回 true 表示显示该菜单项,返回 false 表示不显示。开发者可以根据 Message 对象的会话类型或者消息类型决定是否显示 | 
actionId | string | 是 | 动作的唯一标识符,相同的 ID 的长按事件只会增加一次 | 
示例代码
TypeScript
let msgLongClickAction: ItemLongClickAction<Message> = {
  obtainTitle: (context: Context, data: Message): string | Resource => {
    return "自定义的消息长按事件"
  },
  onClick: (context: Context, data: Message): void => {
    promptAction.showToast({message: "点击了自定义的消息长按事件"})
  },
  onFilter: (data: Message): boolean => {
    // 是否显示该长按事件?true 显示;false 不显示
    // 开发者可以根据 Message 对象的会话类型或者消息类型决定是否显示
    return true;
  },
  // 自定义的消息长按事件 Id,相同的 Id 的长按事件只会增加一次
  actionId: 'CustomMessageActionId'
}
RongIM.getInstance().conversationService().addMessageItemLongClickAction(msgLongClickAction);
配置消息气泡的长按更多选项
在长按消息弹窗的菜单选项选择更多后,SDK 进入消息多选模式,多选模式下默认提供了删除按钮。您可以增删已有按钮、添加自定义按钮。
提示
IMKit SDK 没有内置消息转发功能,实现可以参照:转发消息。
接口定义
TypeScript
/**
 * 消息更多操作配置接口
 */
export interface MessageMoreAction {
  /**
   * 动作 ID
   */
  actionId: string;
  
  /**
   * 按钮位置
   */
  location: number;
  
  /**
   * 图标资源
   */
  icon: Resource;
  
  /**
   * 点击事件
   */
  onClick: (context: Context, data: Message[]) => boolean;
  
  /**
   * 过滤条件
   */
  onFilter: (data: Message[]) => boolean;
}
参数说明
MessageMoreAction
| 参数名 | 类型 | 必填 | 说明 | 
|---|---|---|---|
actionId | string | 是 | 动作的唯一标识符 | 
location | number | 是 | 按钮在底部的位置。根据 location 值,按照从小到大的顺序依次向右排列 | 
icon | Resource | 是 | 按 钮显示的图标资源 | 
onClick | (context: Context, data: Message[]) => boolean | 是 | 点击事件回调函数。返回 true 表示聊天页面依旧处于多选状态;返回 false 表示聊天页面退出多选状态 | 
onFilter | (data: Message[]) => boolean | 是 | 过滤条件函数,返回 true 表示显示该按钮,返回 false 表示不显示 | 
示例代码
TypeScript
let msgMoreAction: MessageMoreAction = {
  actionId: 'message_more_forward', // 动作 Id
  location: 100, // 按钮将放置在底部,根据 location 值,按照从小到大的顺序依次向右排列
  icon: $r("app.media.rc_message_more_forward"), // 图标
  onClick: (context: Context, data: Message[]): boolean => {
    // 处理自定义的点击事件
    // return true:聊天页面依旧处于多选状态
    // return false:聊天页面退出多选状态
    promptAction.showToast({message: "点击了聊天页面底部的更多按钮"});
    return true
  },
  onFilter: (data: Message[]): boolean => {
    // 是否显示该按钮,true 显示,false 不显示
    return true;
  }
}
RongIM.getInstance().conversationService().addMessageMoreAction(msgMoreAction)
修改消息气泡的 UI 配置
IMKit 从 1.4.3 版本开始支持通过 setConversationConfig 方法传入对应的 ConversationConfig 对象修改消息气泡的 UI 配置。支持设置的属性:边框圆角大小、边框色、背景色。
提示
仅支持初始化前的配置,若初始化后开发者设置,则不会生效。
修改边框圆角大小
边框圆角大小支持按消息方向来设置:
- 设置/获取接收的消息气泡边框圆角大小:
setReceivedMessageBorderRadius、getReceivedMessageBorderRadius - 设置/获取发送的消息  气泡边框圆角大小:
setSentMessageBorderRadius、getSentMessageBorderRadius 
接口定义
TypeScript
/**
 * 边框圆角配置
 */
export interface BorderRadiuses {
  /**
   * 左上角圆角大小
   */
  topLeft: number;
  
  /**
   * 右上角圆角大小
   */
  topRight: number;
  
  /**
   * 左下角圆角大小
   */
  bottomLeft: number;
  
  /**
   * 右下角圆角大小
   */
  bottomRight: number;
}
/**
 * 设置接收的消息气泡边框圆角大小
 */
setReceivedMessageBorderRadius(borderRadius: BorderRadiuses): void
/**
 * 获取接收的消息气泡边框圆角大小
 */
getReceivedMessageBorderRadius(): BorderRadiuses
/**
 * 设置发送的消息气泡边框圆角大小
 */
setSentMessageBorderRadius(borderRadius: BorderRadiuses): void
/**
 * 获取发送的消息气泡边框圆角大小
 */
getSentMessageBorderRadius(): BorderRadiuses
参数说明
BorderRadiuses
| 参数名 | 类型 | 必填 | 说明 | 
|---|---|---|---|
topLeft | number | 是 | 左上角圆角大小,单位为 vp | 
topRight | number | 是 | 右上角圆角大小,单位为 vp | 
bottomLeft | number | 是 | 左下角圆角大小,单位为 vp | 
bottomRight | number | 是 | 右下角圆角大小,单位为 vp | 
示例代码
TypeScript
let config = RongIM.getInstance().conversationService().getConversationConfig();
let receivedMessageBorderRadius: BorderRadiuses = {
  topLeft: 4,
  topRight: 8,
  bottomLeft: 8,
  bottomRight: 8
}
config.setReceivedMessageBorderRadius(receivedMessageBorderRadius);
RongIM.getInstance().conversationService().setConversationConfig(config);