IM 即时通讯
Android
产品介绍
简介
产品优势
主要功能
功能介绍
帐号集成与登录
群组功能
聊天室功能
聊天室标签功能
圈组功能
多端登录与互踢策略
质量数据监控台
海外数据中心
IM平滑迁移方案
接口及业务限制
更新日志
IM UIKit 更新日志
NIM SDK 开发版更新日志
NIM SDK 稳定版更新日志
体验 Demo
下载 SDK 与 Demo 源码
快速开始
跑通 IM Demo 源码
实现单聊消息收发(不含 UI)
跑通圈组 Demo 源码
实现圈组消息收发(不含 UI)
含 UI 集成
什么是 IM UIKit
IM UIKit 功能概览
快速集成 IM UIKit
组件导入
初始化
界面跳转
自定义用户信息
全局配置
会话列表相关
集成会话列表界面
会话列表事件监听
自定义会话列表界面 UI
会话列表 API 概览
会话消息相关
集成会话界面
会话界面事件监听
实现音视频通话
实现地理位置消息功能(含 UI)
实现自定义消息发送(含 UI)
自定义会话界面 UI
会话消息 API 概览
通讯录相关
集成通讯录界面
自定义通讯录界面 UI
通讯录界面事件监听
通讯录 API 概览
IM UIKit 常见问题排查
IM UIKit API 概览
不含 UI 集成
集成 SDK
初始化
登录相关
登录 IM
多端登录与互踢
登出 IM
消息相关
消息概述
消息收发
自定义消息收发
消息配置选项
NOS 存储场景
广播消息收发
消息已读回执
消息撤回
消息重发与转发
消息更新
消息过滤
语音消息处理
插入本地消息
历史消息
最近会话
服务端会话服务
用户资料
用户关系
在线状态订阅
系统通知
系统通知概述
内置系统通知管理
内置系统通知未读数
自定义系统通知收发
Android 离线推送
实现离线推送
配置消息的推送属性
设置群消息强制推送
设置推送全局免打扰
设置多端推送策略
集成小米推送
集成华为推送
集成荣耀推送
集成 OPPO 推送
集成 vivo 推送
集成魅族推送
集成谷歌推送(FCM)
消息提醒
实现消息提醒
配置消息提醒功能
设置群消息强制提醒
设置消息提醒文案
定制通知栏显示信息
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
聊天室
圈组功能
圈组概述
登录管理
服务器相关
服务器概述
服务器管理
服务器成员管理
游客功能
服务器未读数管理
频道相关
频道概述
频道管理
频道黑白名单
实时互动频道
频道分组
频道分组黑白名单
频道未读数管理
搜索服务器和频道
身份组相关
身份组概述
身份组应用场景
服务器身份组
频道身份组
用户定制权限
频道分组身份组
自定义权限项
成员权限查询与判定
身份组相关查询
圈组订阅机制
圈组消息相关
图解圈组消息流转
圈组消息收发
圈组消息撤回
圈组消息更新
圈组消息删除
消息正在输入
会话消息回复(Thread)
圈组快捷评论
获取频道最后一条消息
查询历史消息
查询@我的消息
圈组消息缓存
圈组消息搜索
圈组系统通知相关
圈组系统通知概述
圈组系统通知收发
圈组系统通知更新
圈组离线推送
圈组内容审核
圈组相关抄送
圈组第三方回调
圈组各端接口命名差异
反垃圾
聊天扩展
其他
最佳实践
IM 登录最佳实践
IM 应用隐私合规
聊天室重要消息投递
API 参考
Android SDK API
Android SDK 状态码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
开通聊天室功能
配置应用客户端标识
常见问题
FAQ
错题集
Android 端推送问题排查
第三方推送厂商的限制说明
服务协议

自定义通讯录UI

更新时间: 2022/12/23 10:24:24

IM UIKit 通讯录模块(contactkit-ui)提供通讯录界面的 UI 自定义配置项目,助您快速实现该界面的 UI 个性化定制。您也可以直接修改该界面的布局文件自定义 UI 风格。

请确保在加载通讯录界面之前完成该界面的 UI 自定义,加载的对象包括ContactFragment的 Activity 和您的 Application。

自定义功能概述

UI 元素自定义

通讯录界面可自定义的 UI 元素包括但不限于下图中的标注项。

您可通过ContactKit-uiContactUIConfig属性所提供的个性化配置项修改该界面 UI 元素的样式,具体如下:

属性
类型 说明
showTitleBar boolean 是否展示标题栏,具体自定义示例请参见下文的隐藏界面标题栏
showTitleBarRightIcon boolean 是否展示标题栏的最右侧图标
showTitleBarRight2Icon boolean 是否展示标题栏的次最右侧图标,具体自定义示例请参见下文的修改界面标题栏字体颜色和图标
titleBarRightRes int 标题栏的最右侧图标的 ID
titleBarRight2Res int 标题栏的次最右侧图标的 ID
title String 标题栏文案
titleColor int 标题栏字体颜色,具体自定义示例请参见下文的修改界面标题栏字体颜色和图标
showHeader int 是否在通讯录界面显示头部模块,具体自定义示例请参见下文的隐藏头部模块
headerData List<ContactEntranceBean> 头部模块的数据,如果不为空,则覆盖已有数据
contactAttrs ContactListViewAttrs 通讯录好友列表中 UI 属性设置,包括好友昵称的字体、好友头像、索引字体、颜色等,具体自定义示例请参见下文的修改通讯录列表字体颜色
itemClickListeners SparseArray<IContactClickListener> 好友列表的点击事件,由于列表中包含多种类型数据,所以采用 SparseArray,KEY 值即为类型,当前通讯录中包含的类型为IViewTypeConstant.CONTACT_ACTION_ENTER(值为1)和IViewTypeConstant.CONTACT_FRIEND(值为1)类型,具体配置示例请参见下文的修改头部模块
viewHolderFactory IContactFactory 通讯录好友列表 ViewHolder 构造器,用于列表中ViewHolder的创建和绑定,可参考默认实现的ContactDefaultFactory
customLayout IContactViewLayout 通讯录好友列表界面个性化配置,在该接口中会返回

界面布局自定义

除了界面的 UI 元素,您也可对界面的布局进行自定义,通讯录界面的默认布局如下图所示。

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

属性
类型 说明
TitleBar BackTitleBar 通讯录列表界面标题视图,可通过ContactLayoutgetTitleBar()来获取视图进行样式修改
BodyTopLayout FrameLayout 好友列表上方的小块视图,可通过ContactLayoutgetBodyTopLayout()来获取视图进行样式修改。该视图用于在通讯录列表和顶部界面标题中间增加新的 UI 元素。具体自定义示例请参见下文的在头部模块增加提示消息
BodyLayout FrameLayout 通讯录界面的主题视图,可通过ContactLayoutgetBodyLayout()来获取视图进行样式修改。该视图布局中包含ContactListView通讯录好友列表视图
BottomLayout FrameLayout 通讯录好友列表下方的小块视图,可通过ContactLayoutgetBottomLayout()来获取视图进行样式修改。该视图用于在通讯录列表底部增加新的 UI 元素
ContactListView ContactListView 通讯录好友列表视图,可通过ContactLayoutgetContactListView()来获取视图进行样式修改

在会话界面(即聊天界面),上述界面元素都可以通过ContactLayout提供的相应接口获取。ContactLayout的获取可参考上述的ContactUIConfig:customLayout来获取整个界面视图。示例代码可参考在头部模块增加提示消息

自定义示例

隐藏界面标题栏

  • 示例代码如下:

    //1、创建个性化定制对象
    ContactUIConfig contactUIConfig = new ContactUIConfig();
    //2、设置TitleBar不可见
    contactUIConfig.showTitleBar = false;
    //3、将自定义事件设置到ContactKitClient即可
    ContactKitClient.setContactUIConfig(contactUIConfig);
    

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

  • 效果对比

    默认 自定义后

修改界面标题栏字体颜色和图标

  • 示例代码

    //1、创建个性化定制对象
    ContactUIConfig contactUIConfig = new ContactUIConfig();
    //2、设置TitleBar标题字体颜色和右侧按钮图标
    contactUIConfig.titleColor = Color.parseColor("#337EFF");
    contactUIConfig.titleBarRight2Res = R.drawable.ic_about;
    //3、设置右侧第二个按钮点击事件
    contactUIConfig.titleBarRight2Click = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
              
        }
    };
    //4、将自定义事件设置到ContactKitClient即可
    ContactKitClient.setContactUIConfig(contactUIConfig);
    

    除此之外,还可以设置标题栏的右侧第一个按钮图标和点击事件。详见上文的个性化配置项列表。

  • 效果对比

    默认 自定义后

隐藏头部模块

  • 示例代码

    //1、创建个性化定制对象
    ContactUIConfig contactUIConfig = new ContactUIConfig();
    //2、设置列表头部不可见
    contactUIConfig.showHeader = false;
    //3、将自定义事件设置到ContactKitClient即可
    ContactKitClient.setContactUIConfig(contactUIConfig);
    
  • 效果对比

    默认 自定义后

修改头部模块

在好友列表头部模块添加您自定义的入口和点击事件,即可自定义其展示内容。

  • 示例代码

    //1、创建个性化定制对象
    ContactUIConfig contactUIConfig = new ContactUIConfig();
    //2、设置列表头部数据和点击事件
    List<ContactEntranceBean> header = new ArrayList<>();
    ContactEntranceBean firstHeader = new ContactEntranceBean(R.drawable.ic_about,"第一个头部站位");
    header.add(firstHeader);
    contactUIConfig.headerData = header;
    contactUIConfig.itemClickListeners.append(IViewTypeConstant.CONTACT_ACTION_ENTER, new IContactClickListener() {
          @Override
          public void onClick(int position, BaseContactBean data) {
              Toast.makeText(context,"第一个头部站位点击",Toast.LENGTH_LONG).show();
          }
    });
    //3、将自定义事件设置到ContactKitClient即可
    ContactKitClient.setContactUIConfig(contactUIConfig);
    
  • 效果对比

    默认 自定义后

修改通讯录列表字体颜色

  • 示例代码

    //1、创建个性化定制对象
    ContactUIConfig contactUIConfig = new ContactUIConfig();
    //2、设置列表中字体颜色
    contactUIConfig.contactAttrs = new ContactListViewAttrs();
    contactUIConfig.contactAttrs.setNameTextColor( Color.parseColor("#337EFF"));
    //3、将自定义事件设置到ContactKitClient即可
    ContactKitClient.setContactUIConfig(contactUIConfig);
    
    

    除此之外,还可以修改字体大小,索引的字体颜色和字体大小,头像圆角大小,分割小颜色,是否展示索引等,详见上文的个性化配置项列表。

  • 效果对比

    默认 自定义后

在头部模块增加提示消息

  • 示例代码

    //1、创建个性化定制对象
    ContactUIConfig contactUIConfig = new ContactUIConfig();
    //2、在列表界面头部增加自己的View
    contactUIConfig.customLayout =
    new IContactViewLayout() {
        @Override
        public void customizeContactLayout(ContactLayout layout) {
            FrameLayout topLayout = layout.getBodyTopLayout();
            TextView contentTv = new TextView(topLayout.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);
            topLayout.addView(contentTv,layoutParams);
          }
        };
    //3、将自定义事件设置到ContactKitClient即可
    ContactKitClient.setContactUIConfig(contactUIConfig);
    
  • 效果对比

    默认 自定义后

源码导读

界面布局

Contact-ui模块中,整个会话列表的布局配置在contact_fragment.xml中,可修改该文件源码实现界面元素调整和界面背景修改等自定义配置。

该文件中的源码概略如下:

<?xml version="1.0" encoding="utf-8"?>

<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">

    //头部区块,当前包括Titlebar和分割线
    <LinearLayout android:id="@+id/contact_header_layout"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimen_55_dp"
        android:orientation="vertical"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="MissingConstraints">

        <com.netease.yunxin.kit.common.ui.widgets.TitleBarView
            android:id="@+id/contact_title_layout"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dimen_52_dp"
            app:head_title="@string/contact_title"
            app:head_title_color="@color/title_color"/>

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/dimen_1_dp"
            android:background="@color/color_e9eff5"
            android:alpha="0.6"
            tools:ignore="MissingConstraints" />

    </LinearLayout>

    //内容区块,列表的形式,ContactListView对RecycleView进行封装,提供多中数据操作接口
    <FrameLayout android:id="@+id/contact_body_layout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintVertical_weight="1"
        app:layout_constraintTop_toBottomOf="@+id/contact_header_layout"
        app:layout_constraintBottom_toTopOf="@+id/contact_bottom_layout">
        <com.netease.yunxin.kit.contactkit.ui.view.ContactListView
            android:id="@+id/contact_listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:head_img_visible="gone"
            app:head_title="@string/contact_title"
            app:head_title_color="@color/title_color"/>

    </FrameLayout>

    //底部区块,暂时没有使用
    <LinearLayout android:id="@+id/contact_bottom_layout"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:orientation="horizontal"
        tools:ignore="MissingConstraints"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent">

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

通讯录列表

ContactListView为通讯录列表的实现类,ContactListView是对RecyclerViewContactAdapter的封装,同时提供数据更新接口,具体如下:

方法 入参类型 说明
setViewHolderFactory IContactFactory 设置RecyclerViewViewHolder构造器
setViewConfig ContactListViewAttrs 设置列表的 UI 个性化配置
showIndexBar boolean 设置列表是否展示右侧字母索引
addFriendData List<ContactFriendBean> 添加好友数据,添加到已有数据之后,以 account 为唯一值
removeFriendData List<ContactFriendBean> 移除好友数据,以 account 为唯一值
updateFriendData List<ContactFriendBean> 更新好友数据,以 account 为唯一值

通讯录界面UI

  • 在通讯录列表中存在两种类型的ViewHolder,即ContactViewHolderEntranceViewHolder
    • ContactViewHolder代表好友,其布局文件为friend_contact_view_holder.xml,可以在该文件中调整其布局结构。
    • EntranceViewHolder代表通讯录头部模块,其布局文件为friend_contact_view_holder.xml,可以在该文件中调整其布局结构。
  • 调用ViewHolder中的initViewBinding方法和onBind方法可分别实现布局的初始化和数据绑定。
此文档是否对你有帮助?
有帮助
我要吐槽
  • 自定义功能概述
  • UI 元素自定义
  • 界面布局自定义
  • 自定义示例
  • 隐藏界面标题栏
  • 修改界面标题栏字体颜色和图标
  • 隐藏头部模块
  • 修改头部模块
  • 修改通讯录列表字体颜色
  • 在头部模块增加提示消息
  • 源码导读
  • 界面布局
  • 通讯录列表
  • 通讯录界面UI