自定义消息类型
IMKit 支持自定义的消息类型(区别于内置消息类型),并支持修改内置消息类型与自定义消息类型在 IMKit SDK 会话页面的展示形式。
创建自定义消息类型
除了使用 SDK 内置消息类型外,还可以根据自己的业务需求自定义消息。
关于如何创建自定义消息类型,详见 IMLib SDK 的自定义消息类型。
仅当自定义消息的 persistentFlag
为以下值时,可在 IMKit 的会话页面中展示:
MessageTag.ISCOUNTED
MessageTag.ISPERSISTED
如果自定义消息类型带有以上属性,则必须为该自定义消息创建展示模板,IMKit SDK 会调用此模板进行消息的展 示。否则自定义消息将被展示为 “当前版本不支持查看此消息”。
为自定义消息创建和注册展示模版
如果您创建了自定义消息类型,且需要将消息展示在会话界面中,必须创建对应的消息展示模板,否则 SDK 无法正常展示该类型消息。以下步骤与修改融云预置消息的展示样式的步骤大致相同,如有需要,您也可以同时参考替换内置消息默认展示模板,了解内置的默认消息类型的消息展示模板的实现,以及如何创建自定义消息展示模板。
步骤一:创建自定义的消息模版
所有的消息展示模板都继承自 BaseMessageItemProvider
。App 需要继承 BaseMessageItemProvider
,创建一个消息展示模板类。
-
创建一个继承自
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位置展示内容");
}
} -
SDK 提供了一个消息展示配置类
MessageItemProviderConfig
,包含以下属性配置:消息展示模板属性 默认值 描述 showPortrait true 是否显示头像。 centerInHorizontal false 消息内容是否横向居中。 showWarning true 是否显示未发送成功警告。 showProgress true 是否显示发送进度。 showSummaryWithName true 是否在会话的内容体里显示发送者名字。 showReadState false 单聊会话中是否在消息旁边显示已读回执状态。 showContentBubble true 是否需要展示气泡。 在自定义模板的构造方法中,可以获取到基类
MessageItemProviderConfig
变量mConfig
,从而修改模板属性。如下所示:public CustomMessageProvider(){
mConfig.showReadState = true; //修改模板属性,此处为该模板启用了在单聊会话中启用消息已读回执状态显示功能。
mConfig.xxx = ...; //此处省略对模板其它属性的配置
} -
必须实现
isMessageViewType
,传入需要展示的消息类型的MessageContent
,该模板才能与需要展示的消息类型进行绑定。 -
如需处理消息点击、长按事件,请实现
onItemClick
与onItemLongClick
。App 可以通过会话页面上的onMessageClick
与onMessageLongClick
监听消息点击与长按事件。详见页面事件监听。
步骤 2:注册展示模板
将新建的自定义消息的展示模板提供给 SDK。
RongConfigCenter.conversationConfig().addMessageProvider(new CustomMessageProvider());