跳到主要内容

自定义消息类型

IMKit 支持自定义的消息类型(区别于内置消息类型),并支持修改内置消息类型与自定义消息类型在 IMKit SDK 会话页面的展示形式。

创建自定义消息类型

除了使用 SDK 内置消息类型外,还可以根据自己的业务需求自定义消息。

提示

关于如何创建自定义消息类型,详见 IMLib SDK 的自定义消息类型

仅当自定义消息的 persistentFlag 为以下值时,可在 IMKit 的会话页面中展示:

  • MessageTag.ISCOUNTED
  • MessageTag.ISPERSISTED

如果自定义消息类型带有以上属性,则必须为该自定义消息创建展示模板,IMKit SDK 会调用此模板进行消息的展示。否则自定义消息将被展示为 “当前版本不支持查看此消息”。

为自定义消息创建和注册展示模版

如果您创建了自定义消息类型,且需要将消息展示在会话界面中,必须创建对应的消息展示模板,否则 SDK 无法正常展示该类型消息。以下步骤与修改融云预置消息的展示样式的步骤大致相同,如有需要,您也可以同时参考替换内置消息默认展示模板,了解内置的默认消息类型的消息展示模板的实现,以及如何创建自定义消息展示模板。

步骤一:创建自定义的消息模版

所有的消息展示模板都继承自 BaseMessageItemProvider。App 需要继承 BaseMessageItemProvider,创建一个消息展示模板类。

  1. 创建一个继承自 BaseMessageItemProvider<CustomMessage> 的子类,例如 CustomMessageProvider

    以下是创建消息展示模板 CustomMessageProvider 的完整示例:

    public class CustomMessageProvider extends BaseMessageItemProvider<CustomMessage> {

    public CustomMessageProvider(){
    mConfig.showReadState = true; // 修改模板属性,此处为该模板启用了在单聊会话中启用消息已读回执状态显示功能。
    mConfig.xxx = ...; //此处省略对模板其它属性的配置
    }
    /**
    * 创建 ViewHolder
    * @param parent 父 ViewGroup
    * @param viewType 视图类型
    * @return ViewHolder
    */

    @Override
    protected ViewHolder onCreateMessageContentViewHolder(ViewGroup parent, int viewType) {
    View view =
    LayoutInflater.from(parent.getContext())
    .inflate(R.layout.xxx, parent, false);
    return new ViewHolder(parent.getContext(), view);
    }

    /**
    * 设置消息视图里各 view 的值
    * @param holder ViewHolder
    * @param parentHolder 父布局的 ViewHolder
    * @param t 此展示模板对应的消息
    * @param uiMessage {@link UiMessage}
    * @param position 消息位置
    * @param list 列表
    * @param listener ViewModel 的点击事件监听器。如果某个子 view 的点击事件需要 ViewModel 处理,可通过此监听器回调。
    */
    @Override
    protected void bindMessageContentViewHolder(ViewHolder holder, ViewHolder parentHolder, CustomMessage customMessage, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {

    }

    /**
    * 处理会话页面上的消息点击事件
    * @param holder ViewHolder
    * @param t 自定义消息
    * @param uiMessage {@link UiMessage}
    * @param position 位置
    * @param list 列表数据
    * @param listener ViewModel 的点击事件监听器。如果某个子 view 的点击事件需要 ViewModel 处理,可通过此监听器回调。
    * @return 点击事件是否被消费
    */
    @Override
    protected boolean onItemClick(ViewHolder holder, CustomMessage customMessage, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
    return false;
    }
    /** 处理会话页面上的消息长按事件 */
    @Override
    protected boolean onItemLongClick(ViewHolder holder, CustomMessage customMessage, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
    return false;
    }
    /**
    * 根据消息内容,判断是否为本模板需要展示的消息类型
    *
    * @param messageContent 消息内容
    * @return 本模板是否处理。
    */
    @Override
    protected boolean isMessageViewType(MessageContent messageContent) {
    return messageContent instanceof CustomMessage;
    }

    /**
    * 在会话列表页某条会话最后一条消息为该类型消息时,会话里需要展示的内容。
    * 比如: 图片消息在会话里需要展示为"图片",那返回对应的字符串资源即可。
    * @param context 上下文
    * @param t 消息内容
    * @return 会话里需要展示的字符串资源
    */
    @Override
    public Spannable getSummarySpannable(Context context, CustomMessage customMessage) {
    return new SpannableString("会话列表content位置展示内容");
    }
    }
  2. SDK 提供了一个消息展示配置类 MessageItemProviderConfig,包含以下属性配置:

    消息展示模板属性默认值描述
    showPortraittrue是否显示头像。
    centerInHorizontalfalse消息内容是否横向居中。
    showWarningtrue是否显示未发送成功警告。
    showProgresstrue是否显示发送进度。
    showSummaryWithNametrue是否在会话的内容体里显示发送者名字。
    showReadStatefalse单聊会话中是否在消息旁边显示已读回执状态。
    showContentBubbletrue是否需要展示气泡。

    在自定义模板的构造方法中,可以获取到基类 MessageItemProviderConfig 变量 mConfig,从而修改模板属性。如下所示:

    public CustomMessageProvider(){
    mConfig.showReadState = true; //修改模板属性,此处为该模板启用了在单聊会话中启用消息已读回执状态显示功能。
    mConfig.xxx = ...; //此处省略对模板其它属性的配置
    }
  3. 必须实现 isMessageViewType ,传入需要展示的消息类型的 MessageContent,该模板才能与需要展示的消息类型进行绑定。

  4. 如需处理消息点击、长按事件,请实现 onItemClickonItemLongClick。App 可以通过会话页面上的 onMessageClickonMessageLongClick 监听消息点击与长按事件。详见页面事件监听

步骤 2:注册展示模板

在初始化 SDK 之后,将新建的自定义消息的展示模板提供给 SDK。

RongConfigCenter.conversationConfig().addMessageProvider(new CustomMessageProvider());