自定义消息类型
Global IM UIKit 支持自定义的消息类型(区别于内置消息类型),并支持修改内置消息类型与自定义消息类型在 Global IM UIKit SDK 会话页面的展示形式。
创建自定义消息类型
除了使用 SDK 内置消息类型外,还可以根据自己的业务需求自定义消息。
关于如何创建自定义消息类型,详见 IMLib SDK 的自定义消息类型。
仅当自定义消息的 persistentFlag
为以下值时,可在 Global IM UIKit 的会话页面中展示:
MessageTag.ISCOUNTED
MessageTag.ISPERSISTED
如果自定义消息类型带有以上属性,则必须为该自定义消息创建展示模板,Global IM UIKit 会调用此模板进行消息的展示。否则自定义消息将被展示为 “当前版本不支持查看此消息”。
为自定义消息创建和注册展示模版
如果您创建了自定义消息类型,且需要将消息展示在会话界面中,必须创建对应的消息展示模板,否则 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 提供了一个消息展示配置类
ChatConfig
,包含以下属性配置:消息展示模板属性 默认值 描述 isDisplayOwnAvatarInPrivateChat false 是否在私聊中显示自己的头像. isDisplayOthersAvatarInPrivateChat false 是否在私聊中显示他人的头像. isDisplayOwnAvatarInGroupChat false 是否在群聊中显示自己的头像. isDisplayOthersAvatarInGroupChat true 是否在群聊中显示他人的头像. isDisplayOwnNickNameInPrivateChat false 是否在私聊中显示自己的昵称. isDisplayOthersNickNameInPrivateChat false 是否在私聊中显示他人的昵称. isDisplayOwnNickNameInGroupChat false 是否在群聊中显示自己的昵称. isDisplayOthersNickNameInGroupChat true 是否在群聊中显示他人的昵称. isAlignOwnMessagesLeft false 自己的消息是否对齐左边. isShowFirstMessagesOnPageLoad true 进入页面是否显示一条未读消息. 您可以在打开会话页面之前,在
Application
类的onCreate
方法中调用这个消息展示配置类,如下所示:// 设置在群聊中显示自己的昵称.
ConfigCenter.getChatConfig().setDisplayOwnNickNameInGroupChat(true); -
必须实现
isMessageViewType
,传入需要展示的消息类型的MessageContent
,该模板才能与需要展示的消息类型进行绑定。 -
如需处理消息点击、长按事件,请实现
onItemClick
与onItemLongClick
。App 可以通过会话页面上的onMessageClick
与onMessageLongClick
监听消息点击与长按事件。详见页面事件监听。
步骤 2:注册展示模板
将新建的自定义消息的展示模板提供给 SDK。
ConfigCenter.getChatConfig().addMessageProvider(new CustomMessageProvider());