Skip to content
能力中心
产品中心
应用市场
WebOffice
开发者后台

自定义消息列表界面

协作中台SDK 支持消息列表界面的自定义。可以通过配置接口、实现自定义协议两种方式来对消息列表进行自定义。

配置方式

可以通过配置方式完成消息列表界面的样式自定义,消息列表界面配置定义在 KIMChatMessageListConfig 类中。

接口定义

KIMChatMessageListConfig

属性类型说明
messageListBackgroundColor@ColorRes Int消息列表背景颜色。
messageBackgroundColorSend@ColorRes Int发出的消息气泡背景颜色。
messageBackgroundColorReceive@ColorRes Int接收的消息气泡背景颜色。
messageSenderWorkStatusTextColor@ColorRes Int消息发送者工作状态文本颜色。
messageSenderWorkStatusTextFontKIMFont消息发送者工作状态字体大小/样式。
messageTextColorSend@ColorRes Int发出的消息文字颜色。
messageTextColorReceive@ColorRes Int收到的消息文字颜色。
messageTextFontSendKIMFont发出的消息文字大小/样式。
messageTextFontReceiveKIMFont收到的消息文字大小/样式。
messageTimeTextFontKIMFont消息时间文字大小/样式。
messageTimeTextColor@ColorRes Int消息时间文字颜色。
messageTimeTextFormatter(time: Long) -> String消息时间格式。
messageSystemTextFontKIMFont系统消息(群管理,参与投票,撤回消息,本地消息)文字大小/样式。
messageSystemTextColor@ColorRes Int系统消息(群管理,参与投票,撤回消息,本地消息)文字颜色。
messageSenderNameFontKIMFont消息发送者名称字号。
messageSenderNameColor@ColorRes Int消息发送者名称颜色。
messageAtTextFontKIMFont@人文本字体大小/样式。
messageAtTextColorSend@ColorRes Int发出的消息 @ 人文字颜色。
messageAtTextColorReceive@ColorRes Int收到的消息 @ 人文字颜色。
messageAtMeTextBackgroundColor@ColorRes Int所 @ 的人为自己时的文本圆角背景颜色。
messageHighlightTextColorReceive@ColorRes Int收到的消息高亮文本(如超链接)颜色。
messageHighlightTextColorSend@ColorRes Int发出的消息高亮文本(如超链接, 撤回重新编辑)颜色。
messageReplyTextFontKIMFont引用消息文本字体大小/样式。
messageReplyTextColorReceive@ColorRes Int收到的引用消息文本颜色。
messageReplyTextColorSend@ColorRes Int发出的引用消息文本颜色。
messageReplyLineColorReceive@ColorRes Int收到的引用消息竖线颜色。
messageReplyLineColorSend@ColorRes Int发出的引用消息竖线颜色。

协议方式

可以通过设置消息列表视图控制器的页面代理并实现相关协议方法来完成消息列表界面的自定义,自定义协议定义在 KIMExpChatMessageListPage 中。

接口定义

KIMExpChatMessageListPage :

方法参数返回值说明
configTitleBar(titleBar: CommonTitleBar, chatId: String)• titleBar: CommonTitleBar
标题视图。
• chatId: String
会话id
Unit配置消息列表导航栏标题视图。可实现该方法,通过 titleBar 参数获取导航栏标题视图控件,对标题视图控件进行配置,如修改标题样式、添加左右侧按钮等。
onClickedMoreButton(button: View, chatMeta: KIMChatMeta, defaultHandler: () -> Unit)• button: View
更多按钮。
• chatMeta: KIMChatMeta
会话元数据。
• defaultHandler: () -> Unit
默认点击处理,调用该闭包执行SDK内部默认点击行为。
Unit标题栏更多按钮点击事件拦截。点击标题栏更多按钮后会调用该方法,可以实现该方法拦截更多按钮点击事件,执行自定义操作。如果需要执行SDK内部默认点击行为,可以调用 defaultHandler闭包实现。
updateToolMoreItems(items: List<KIMToolMoreItem>, chatMeta: KIMChatMeta): List<KIMToolMoreItem>• items: List<KIMToolMoreItem>
加号面板默认数据源。
• chatMeta: KIMChatMeta
会话元数据。
List<KIMToolMoreItem>
修改后的加号面板数据源。
更新消息列表加号工具面板数据源。加号工具面板界面数据刷新时会调用该方法,可实现该方法对加号工具面板数据进行二次加工,items 为加号工具面板列表默认数据,可基于默认 items 进行改造,如修改排序、插入、删除元素,返回新的 KIMToolMoreItem 数组。
onClickedToolMoreItem(context: Context, item: KIMToolMoreItem, chatMeta: KIMChatMeta, defaultHandler: () -> Unit)• context: Context
上下文。
• item: KIMToolMoreItem
被点击的item。
• chatMeta: KIMChatMeta
会话元数据。
• defaultHandler: () -> Unit
默认点击处理,调用该闭包执行SDK内部默认点击行为。
Unit加号工具面板item点击事件拦截。点击加号工具面板item后会调用该方法,可以实现该方法拦截加号面板item点击事件,执行自定义操作。如果需要执行SDK内部默认点击行为,可以调用 defaultHandler闭包实现。
updateMessageMenuItems(items: List<KIMMessageMenuItem>, chatMessage: KIMCoreMessage, chatMeta: KIMChatMeta): List<KIMMessageMenuItem>• items: List<KIMMessageMenuItem>
长按菜单默认数据源。
• chatMessage: KIMChatMessage
当前被长按的消息数据。
• chatMeta: KIMChatMeta
会话元数据。
List<KIMMessageMenuItem>
修改后的菜单数据源。
更新消息列表长按菜单数据源。长按菜单数据刷新时会调用该方法,可实现该方法对菜单数据进行二次加工,items为菜单列表默认数据,可基于默认 items 进行改造,如修改排序、插入、删除元素,返回新的 KIMMessageMenuItem 数组。
onClickedMessageMenuItem(context: Context, item: KIMMessageMenuItem, chatMessage: KIMCoreMessage, defaultHandler: () -> Unit)• context: Context
上下文。
• item: KIMMessageMenuItem
菜单按钮。
• chatMessage: KIMChatMessage
当前被长按的消息数据。
• defaultHandler: () -> Unit
默认点击处理,调用该闭包执行SDK内部默认点击行为。
Unit长按菜单面板 item 点击事件拦截。点击菜单面板item后会调用该方法,可以实现该方法拦截菜单面板item点击事件,执行自定义操作。如果需要执行SDK内部默认点击行为,可以调用 defaultHandler闭包实现。
onClickedUser(context: Context, userId: String, chatMessage: KIMCoreMessage, defaultHandler: () -> Unit)• context: Context
上下文。
• userId: String
被点击用户ID。注意:userId为SDK内部使用的用户ID。
• chatMessage: KIMChatMessage
当前被点击的消息数据。
• defaultHandler: () -> Unit
默认点击处理,调用该闭包执行SDK内部默认点击行为。
Unit点击个人信息事件拦截(个人头像/个人高亮)。点击个人入口(个人头像/个人高亮等)会调用该方法,可以实现该方法拦截个人信息点击事件,执行自定义操作。如果需要执行SDK内部默认点击行为,可以调用 defaultHandler 闭包实现。

KIMToolMoreItem:

属性类型说明
icon@DrawableRes Int加号工具面板菜单图标。
titleString加号工具面板长按菜单标题。
identifierString加号工具面板长按菜单标识符

其中identifier定义如下:

加号面板菜单标题identifier
日程kim_input_calendar
云文档kim_input_cloud_file
位置kim_input_location
会议kim_input_meeting
拍摄kim_input_capture
文件kim_input_file
相册kim_input_album
待办kim_input_todo
投票kim_input_vote
邮件kim_input_email

KIMMessageMenuItem:

属性类型说明
icon@DrawableRes Int消息长按菜单图标。
titleString消息长按菜单标题。
identifierString消息长按菜单标识符

其中identifier定义如下:

消息长按菜单标题identifier
复制链接kim_message_copy_link
日程kim_message_calendar
收藏kim_message_collect
置顶kim_message_stick
取消置顶kim_message_unstick
复制kim_message_copy_text
删除kim_message_delete
下载kim_message_download
转发kim_message_forward
多选kim_message_multi_select
撤回kim_message_recall
回复kim_message_reply
全选kim_message_select_all_text
会议码kim_message_meeting_access_code
听筒播放kim_message_voice_receiver_play
扬声器播放kim_message_voice_speaker_play
收起语音转文字kim_message_hide_voice_text
语音转文字kim_message_voice_to_text
待办kim_message_todo
加急kim_message_urgent
添加表情kim_message_add_expression
举报kim_message_report

自定义示例

样式配置

消息列表样式配置需要在消息列表加载之前进行,可以通过修改 KIMChatMessageListConfig 中定义的各种属性达到个性化样式配置。

代码示例

Kotlin
// 修改发出的消息气泡背景颜色。
KIM.chatModule.chatMessageListConfig.messageBackgroundColorSend = R.color.color_background_chat
// 修改发出的消息文字大小/样式。
KIM.chatModule.chatMessageListConfig.messageTextFontSend = KIMFont(R.dimen.text_send)

自定义标题栏

可通过实现KIMExpChatMessageListPageconfigTitleBaronClickedMoreButton等协议方法来自定义标题栏的展示及点击事件。

代码示例

Kotlin
class CustomPageMessageList : KIMExpChatMessageListPage() {
    
    override fun configTitleBar(titleBar: CommonTitleBar, chatId: String) {
        // 标题栏设置右侧 icon 图片资源
        titleBar.setBackgroundColor(Color.parseColor("#80ff0000"))
        titleBar.setRightIcon1ImageResource(R.drawable.ic_titlebar_stick)
        WLog.debugLog(TAG, "configTitleBar, chatId = $chatId")
    }

    override fun onClickedMoreButton(button: View, chatMeta: KIMChatMeta, defaultHandler: () -> Unit) {
        WToastUtil.show("更多按钮被点击")
        WLog.debugLog(TAG, "onClickedMoreButton, chatId = ${chatMeta.chatId}, chatType = ${chatMeta.chatType}, customType = ${chatMeta.customType}")
        defaultHandler.invoke()
    }
}

开启自定义书签入口

可通过KIM.chatModule.chatMessageListConfig.openCustomBookmark来控制是否开启书签入口。true表示开启,false表示关闭。


代码示例

Kotlin
KIM.chatModule.chatMessageListConfig.openCustomBookmark = true

拦截消息列表点击事件

可通过实现KIMExpChatMessageListPageonClickUser 协议方法拦截用户点击事件(个人头像/个人高亮)。

代码示例

Kotlin
class CustomPageMessageList : KIMExpChatMessageListPage() {
    
    override fun onClickedUser(
        context: Context,
        userId: String,
        chatMessage: KIMCoreMessage,
        defaultHandler: () -> Unit
    ) {
        WToastUtil.show("用户${userId}被点击, chatId = ${chatMessage.chatId}")
        defaultHandler.invoke()
    }
}

自定义加号面板

“加号面板” 指在会话页面中点击输入框中 + 号按钮弹出的面板。消息列表默认提供了基础功能,包括相册、拍摄、文件、位置、云文档等。通过实现KIMExpChatMessageListPageupdateToolMoreItemsonClickedToolMoreItem 方法自定义面板item样式,点击事件,和增加删除item。

代码示例

Kotlin
class CustomPageMessageList : KIMExpChatMessageListPage() {
    
    override fun updateToolMoreItems(
        items: List<KIMToolMoreItem>,
        chatMeta: KIMChatMeta
    ): List<KIMToolMoreItem> {
        // 调整相册和拍摄菜单位置
        val list = mutableListOf<KIMToolMoreItem>()
        items.forEach {
            // 调整拍摄和相册位置
            if (it.identifier == "kim_input_capture") {
                list.add(0, it)
            } else {
                // 删除文件菜单
                if (it.identifier != "kim_input_file") {
                    list.add(it)
                }
            }
        }
        list.add(KIMToolMoreItem(R.drawable.ic_input_panel_weather, "查询天气", "custom_weather"))
        return list
    }

    override fun onClickedToolMoreItem(context: Context, item: KIMToolMoreItem, chatMeta: KIMChatMeta, defaultHandler: () -> Unit) {
        // if (item.identifier == "kim_input_capture") {
        if (item.identifier == "kim_input_album") {
            WToastUtil.show("相册被点击, chatId = ${chatMeta.chatId}, chatType = ${chatMeta.chatType}, customType = ${chatMeta.customType}")
        } else if (item.identifier == "custom_weather") {
            onWeatherClicked(context, chatMeta)
        }
        defaultHandler.invoke()
    }
}

自定义消息长按菜单

通过实现KIMExpChatMessageListPageupdateMessageMenuItemsonClickedMessageMenuItem 方法自定义面板item样式,点击事件,和增加删除item。

代码示例

Kotlin
class CustomPageMessageList : KIMExpChatMessageListPage() {
    
    override fun updateMessageMenuItems(
        items: List<KIMMessageMenuItem>,
        chatMessage: KIMCoreMessage,
        chatMeta: KIMChatMeta
    ): List<KIMMessageMenuItem> {
        val list = mutableListOf<KIMMessageMenuItem>()
        items.forEach {
            // 置顶和取消置顶互斥,排列到第一位
            if (it.identifier == "kim_message_stick") {
                list.add(0, it)
            } else if (it.identifier == "kim_message_unstick") {
                list.add(0, it)
            } else {
                list.add(it)
            }
        }
        if (chatMessage.isAppCustomMessage() && chatMessage.content.safeCast<KIMCoreAppCustomizeMessage>()?.customizeType == WEATHER_MSG_TYPE) {
            list.add(0, KIMMessageMenuItem(R.drawable.ic_input_panel_weather, "天气动图", "custom_weather"))
        }
        return list
    }

    override fun onClickedMessageMenuItem(
        context: Context,
        item: KIMMessageMenuItem,
        chatMessage: KIMCoreMessage,
        defaultHandler: () -> Unit
    ) {
        if (item.identifier == "kim_message_stick") {
            WToastUtil.show("置顶被点击, chatId = ${chatMessage.chatId}")
        } else if (item.identifier == "kim_message_unstick") {
            WToastUtil.show("取消置顶被点击, chatId = ${chatMessage.chatId}")
        } else if (item.identifier == "custom_weather") {
            WToastUtil.show("打开城市天气动图, chatId = ${chatMessage.chatId}")
        }
        defaultHandler.invoke()
    }
}

注册自定义实现

实现了消息列表自定义相关接口后,可通过以下方式注册自定义实现,达到替换SDK默认实现的效果。

代码示例

  1. 实现KIMSdkApplication,并注册自定义实现:
Kotlin
class AppCustomizeApplication : KIMSdkApplication() {
    override fun confMeatsOnBone(): KConf<Meat> {
        return kConfOf(
            // 注册自定义消息列表扩展接口
            KIMExpChatMessageListPage::class.java confTo CustomPageMessageList::class.java
            ...
        )
    }
}
  1. AndroidManifest中声明:
Xml
<meta-data
   android:name="{your-package-name}.AppCustomizeSdkApplication"
   android:value="@string/kim_sdk_application" />

至此,完成了自定义消息列表的注册。