自定义会话列表界面 UI

更新时间: 2024/09/27 10:50:00

IM UIKit 的会话列表模块(convesationkit-ui)提供会话列表界面 UI 的自定义配置项,助您快速实现该界面的 UI 个性化定制。您也可在布局文件(conversation_fragment.xml)中直接修改源码实现您所需的 UI 风格。

请确保您在加载会话列表界面之前完成该界面的 UI 自定义,加载的对象包括 ConversationFragment 的 Activity 和您的 Application。

自定义功能概述

UI 元素自定义

会话列表界面可自定义的 UI 元素包括但不限于下图中的标注项。

您可通过 ConversationUIConfig 类中的个性化配置项修改会话列表中界面 UI 元素的样式。

属性
类型 说明
showTitleBar boolean 是否展示界面顶部的标题栏,具体自定义示例见下文的 隐藏标题栏
showTitleBarLeftIcon boolean 是否展示标题栏左侧图标,具体自定义示例见下文的 修改标题栏图标
showTitleBarRightIcon boolean 是否展示标题栏最右侧图标,具体自定义示例见下文的 修改标题栏图标
showTitleBarRight2Icon boolean 是否展示标题栏次最右侧图标,具体自定义示例见下文的 修改标题栏图标
showConversationTopAIList boolean 是否标题和会话列之间的置顶会话列表(当前只适用于 AI 数字人会话),具体自定义示例见下文的 隐藏置顶会话列表
titleBarLeftRes int 标题栏左侧图标 ID
titleBarRightRes int 标题栏最右侧图标 ID
titleBarRight2Res int 标题栏次最右侧图标 ID
titleBarTitle String 标题栏的文案
titleBarTitleColor int 标题栏的颜色值
itemTitleColor int 会话标题的字体颜色,具体示例见下文的 修改会话字体颜色和大小
itemTitleSize int 会话标题的字体大小
itemBackground Drawable 未被置顶的会话项的背景色,具体自定义示例见下文的 修改会话项的背景色
itemStickTopBackground Drawable 置顶的会话项的背景色,具体自定义示例见下文的 修改会话项的背景色
itemContentColor int 会话消息缩略内容的字体颜色
itemContentSize int 会话消息缩略内容的字体大小,具体示例见下文的 修改会话字体颜色和大小
itemDateColor int 会话时间的字体颜色,具体示例见下文的 修改会话字体颜色和大小
itemDateSize int 会话时间的字体大小
avatarCornerRadius float 会话列表中会话头像的圆角,0 代表方形,30dp 为原型。这里您需要自行将 dp(density-independent pixels)单位转换为像素(px)单位
titleBarRightClick View.OnClickListener 标题栏最右侧按钮单击事件
titleBarRight2Click View.OnClickListener 标题栏次最右侧按钮单击事件
titleBarLeftClick View.OnClickListener 标题栏左侧按钮单击事件
itemClickListener ItemClickListener 会话列表单击事件,包括单击和长按事件
conversationFactory IConversationFactory 会话列表 ViewHolder 构造器,用于完成会话列表中 ViewHolder 的创建和绑定,可参考默认实现 DefaultViewHolderFactory
itemStickTopBackground Drawable 置顶会话背景
itemBackground Drawable 非置顶会话背景
customLayout IConversationViewLayout 自定义界面 UI 接口,回调中会传入会话列表界面的 UI 布局,您可以进行 UI 元素调整。

界面布局自定义

除了界面的 UI 元素,您也可对界面的布局进行自定义,具体示例请参考下文的 在会话列表顶部增加提示条

会话列表界面的默认视图布局如下图所示。

会话列表布局.png

界面上各视图的说明如下:

属性
类型 说明
TitleBar BackTitleBar 会话列表界面标题视图,可通过 ConversationLayoutgetTitleBar() 来获取视图进行样式修改
BodyTopLayout FrameLayout 会话列表上方的小块视图,可通过 ConversationLayoutgetBodyTopLayout() 来获取视图进行样式修改。可用于在会话列表和顶部的界面标题中间增加新的 UI 元素
BodyLayout LinearLayout 会话列表界面的列表视图,可通过 ConversationLayoutgetBodyLayout() 来获取视图进行样式修改。布局中包含 ConversationView 会话列表和通知文本。通知文本的视图的 ID 为 conversationNetworkErrorTv,可用于断网提示
BottomLayout FrameLayout 会话列表底部的小块视图,可通过 ConversationLayoutgetBottomLayout() 来获取视图进行样式修改。用于在会话列表底部增加新的 UI 元素
ConversationView ConversationView 会话列表界面的列表视图,可通过 ConversationLayoutgetConversationView() 来获取视图进行样式修改
ErrorTextView TextView 会话列表界面错误提示视图,可通过 ConversationLayoutgetErrorTextView() 来获取视图进行样式修改

在会话界面(即聊天界面),上述界面元素都可以通过 ConversationLayout 提供的相应接口获取。ConversationLayout 的获取可参考上述的 ConversationUIConfig:customLayout 来获取整个界面视图。示例代码可参考下文的 在会话列表顶部增加提示条

自定义示例

隐藏标题栏

  • 示例代码

    Java//1、实现单击事件
    ConversationUIConfig conversationUIConfig = new ConversationUIConfig();
    //2、设置 TitleBar 不可见
    conversationUIConfig.showTitleBar = false;
    //3、将自定义事件设置到 ConversationKitClient 即可
    ConversationKitClient.setConversationUIConfig(config);
    

    除此之外,还可以隐藏标题栏中的标题图标和右侧按钮。请参考上文的个性化配置项列表。

  • 效果对比

    默认 自定义后
    conversation_01_resized.png conversation_01_resized.png

隐藏置顶会话列表

  • 示例代码

    Java//1、实现单击事件
    ConversationUIConfig conversationUIConfig = new ConversationUIConfig();
    //2、设置 TitleBar 不可见
    conversationUIConfig.showConversationTopAIList = false;
    //3、将自定义事件设置到 ConversationKitClient 即可
    ConversationKitClient.setConversationUIConfig(config);
    

    除此之外,还可以隐藏标题栏中的标题图标和右侧按钮。请参考上文的个性化配置项列表。

  • 效果对比

    默认 自定义后
    数字人.png 数字人.png

修改标题栏图标

  • 示例代码

    Java//1、实现单击事件
    ConversationUIConfig conversationUIConfig = new ConversationUIConfig();
    //2、设置 TitleBar 右侧图标和标题内容
    conversationUIConfig.titleBarRight2Res = R.drawable.ic_about;
    conversationUIConfig.titleBarRightRes = R.drawable.ic_collect;
    conversationUIConfig.titleBarTitle = "您好 IM";
    //3、将自定义事件设置到 ConversationKitClient 即可
    ConversationKitClient.setConversationUIConfig(config);
    

    除此之外,还可以修改标题栏的字体颜色、字体大小和左侧图标等,请参考上文的个性化配置项列表。

  • 效果对比

    默认 自定义后
    conversation_01_resized.png conversation_01_resized.png

修改会话字体颜色和大小

  • 示例代码

    Java//1、实现单击事件
    ConversationUIConfig conversationUIConfig = new ConversationUIConfig();
    //2、Item 中标题字体颜色、内容字体大小和右侧时间字体颜色
    conversationUIConfig.itemTitleColor = context.getResources().getColor(R.color.color_blue_3a9efb);
    conversationUIConfig.itemContentSize = 23;
    conversationUIConfig.itemDateColor = context.getResources().getColor(R.color.color_blue);
    //3、将自定义事件设置到 ConversationKitClient 即可
    ConversationKitClient.setConversationUIConfig(config);
    

    除此之外,还可以修改会话中的标题、内容和时间的字体颜色、字体大小,请参考上文的个性化配置项列表。

  • 效果对比

    默认 自定义后
    conversation_01_resized.png conversation_01_resized.png

修改会话项的背景色

在会话列表中,单个会话项的背景色有两种,按该会话项是否被置顶进行区分。未被置顶会话项的背景色和置顶会话项的背景色均支持自定义。

  • 示例代码

    Java//1、实现单击事件
    ConversationUIConfig conversationUIConfig = new ConversationUIConfig();
    //2、会话项的背景色修改
    conversationUIConfig.itemBackground = new ColorDrawable(context.getResources().getColor(R.color.color_be65d9));
    conversationUIConfig.itemStickTopBackground = new ColorDrawable(context.getResources().getColor(R.color.color_blue_3a9efb));
    //3、将自定义事件设置到 ConversationKitClient 即可
    ConversationKitClient.setConversationUIConfig(config);
    
  • 效果对比

    默认 自定义后
    conversation_01_resized.png conversation_01_resized.png

在会话列表顶部增加提示条

  • 示例代码

    基础版
    Java//1、实现单击事件
    ConversationUIConfig conversationUIConfig = new ConversationUIConfig();
    //2、对会话列表界面布局进行修改
    conversationUIConfig.customLayout =
    new IConversationViewLayout() {
        @Override
         public void customizeConversationLayout(ConversationBaseFragment fragment) {
    
                 // 基础版皮肤
                  if (fragment instanceof ConversationFragment){
                      ConversationFragment conversationFragment = (ConversationFragment) fragment;
                      TextView contentTv = new TextView(conversationFragment.getContext());
                      contentTv.setText("【温馨提示】欢迎使用运行 IM,在使用过程中如果遇到什么问题,请及时与我们联系。");
                      contentTv.setTextColor(Color.parseColor("#333333"));
                      contentTv.setBackgroundColor(Color.parseColor("#FFF8DC"));
                      contentTv.setPadding(8,8,8,8);
                      FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,150);
                      layoutParams.setMargins(16,12,16,12);
                      conversationFragment.getBodyTopLayout().addView(contentTv,layoutParams);
                  }
              }
        };
    //3、将自定义事件设置到 ConversationKitClient 即可
    ConversationKitClient.setConversationUIConfig(config);
    
    通用版
    Java//1、实现单击事件
    ConversationUIConfig conversationUIConfig = new ConversationUIConfig();
    //2、对会话列表界面布局进行修改
    conversationUIConfig.customLayout =
    new IConversationViewLayout() {
        @Override
         public void customizeConversationLayout(ConversationBaseFragment fragment) {
    
                  // 通用版皮肤
                   if (fragment instanceof FunConversationFragment){
                      FunConversationFragment conversationFragment = (FunConversationFragment)fragment;
                      TextView contentTv = new TextView(conversationFragment.getContext());
                      contentTv.setText("【温馨提示】欢迎使用运行 IM,在使用过程中如果遇到什么问题,请及时与我们联系。");
                      contentTv.setTextColor(Color.parseColor("#333333"));
                      contentTv.setBackgroundColor(Color.parseColor("#FFF8DC"));
                      contentTv.setPadding(8,8,8,8);
                      FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,150);
                      layoutParams.setMargins(16,12,16,12);
                      conversationFragment.getBodyTopLayout().addView(contentTv,layoutParams);
                  }
    
              }
        };
    //3、将自定义事件设置到 ConversationKitClient 即可
    ConversationKitClient.setConversationUIConfig(config);
    
  • 效果对比

    默认 自定义后
    conversation_01_resized2.png conversation_01_resized2.png

源码导读

界面布局

基础版

Conversation-ui 模块中的布局文件 conversation_fragment.xml 支持对界面布局进行调整,包括界面元素调整和界面背景修改等。布局中的内容具体如下:

XML<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    // Title Bar
    <com.netease.yunxin.kit.common.ui.widgets.TitleBarView .../>

    // Title Bar 与会话列表的分割线
    <View android:id="@+id/conversation_line" ... />

    // 会话列表内容
    <LinearLayout ...>

      // 断网提示 Tips
      <TextView android:id="@+id/conversation_network_error_tv" ... />

      // 会话列表 View,里面封装了 RecyclerView
      <com.netease.yunxin.kit.conversationkit.ui.view.ConversationView
          android:id="@+id/conversation_view" .../>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
通用版

Conversation-ui 模块中的布局文件 fun_conversation_fragment.xml 支持对界面布局进行调整,包括界面元素调整和界面背景修改等。布局中的内容具体如下:

XML<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    // Title Bar
    <com.netease.yunxin.kit.common.ui.widgets.TitleBarView .../>

    // Title Bar 与会话列表的分割线
    <View android:id="@+id/conversation_line" ... />

    // 会话列表内容
    <LinearLayout ...>

      // 断网提示 Tips
      <TextView android:id="@+id/conversation_network_error_tv" ... />

      // 会话列表 View,里面封装了 RecyclerView
      <com.netease.yunxin.kit.conversationkit.ui.view.ConversationView
          android:id="@+id/conversation_view" .../>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

会话列表

ConversationView 为会话列表的实现类,是对 RecyclerViewConversationAdapter 的封装,同时提供用于数据更新的方法,具体如下:

方法
入参类型 说明
setLoadMoreListener ILoadListener 加载更多监听,当界面滑动到底部会触发,如果 ILoadListenerhasMore 返回 false 则不再触发
setItemClickListener ViewHolderClickListener 设置会话列表单击事件,分为单击和长按
setViewHolderFactory IConversationFactory 列表 AdapterViewHolder 构造器
setData List 设置会话列表数据,会对已有数据进行清理
addData List 添加会话列表数据,添加到已有数据之后
update List 更新会话列表数据,根据会话 ID 进行更新
updateUserInfo List 更新会话用户数据,根据会话 ID 进行更新,一般用于更新用户头像、名称等的修改
updateFriendInfo List 更新会话用户数据,根据会话 ID 进行更新,一般用于更新好友昵称
updateTeamInfo List 更新会话用户数据,根据会话 ID 进行更新,一般用于更新群或者讨论组信息,群名称、群头像等
updateMuteInfo MuteListChangedNotify 更新消息提醒设置

会话列表 UI

基础版

会话列表中存在两种类型的 ViewHolder,即 ConversationP2PViewHolderConversationTeamViewHolder

  • ConversationP2PViewHolder 代表单聊会话,其布局文件为 conversation_view_holder.xml,可以在该文件中调整其布局结构。
  • ConversationTeamViewHolder 代表群聊会话,其布局文件为 conversation_view_holder.xml,可以在该文件中调整其布局结构。
通用版

会话列表中存在两种类型的 ViewHolder,即 FunConversationP2PViewHolderFunConversationTeamViewHolder

  • P2PViewHolder 代表单聊会话,其布局文件为 fun_conversation_view_holder.xml,可以在该文件中调整其布局结构。
  • TeamViewHolder 代表群聊会话,其布局文件为 fun_Conversation_view_holder.xml,可以在该文件中调整其布局结构。

其他

自定义配置
说明
修改会话列表中单击和长按事件 通过 ConversationBaseFragmentgetViewHolderClickListener 方法中进行修改
修改 Title Bar 最右侧按钮单击事件
  • 基础版:通过 ConversationFragmentinitView 方法中的 viewBinding.conversationView.viewBinding.conversationTitleBar.setRightImageClick() 进行修改
  • 通用版:通过 FunConversationFragmentinitView 方法中的 viewBinding.conversationView.viewBinding.conversationTitleBar.setRightImageClick() 进行修改
  • 构造最右侧按钮弹窗中的选项内容
  • 基础版:通过 PopItemFactory 类构造,当前默认设置为添加好友、创建讨论组和创建高级群。
  • 通用版:通过 FunPopItemFactory 类构造,当前默认设置为添加好友、创建讨论组和创建高级群。
  • 实现长按置顶会话和删除会话弹窗 请参考 ConversationBaseFragmentshowStickDialog 方法
    此文档是否对你有帮助?
    有帮助
    去反馈
    • 自定义功能概述
    • UI 元素自定义
    • 界面布局自定义
    • 自定义示例
    • 隐藏标题栏
    • 隐藏置顶会话列表
    • 修改标题栏图标
    • 修改会话字体颜色和大小
    • 修改会话项的背景色
    • 在会话列表顶部增加提示条
    • 源码导读
    • 界面布局
    • 会话列表
    • 会话列表 UI
    • 其他