跳到主要内容

输入状态

输入状态可让用户直观地了解其他用户是否正在键入消息。在对方用户键入内容时,标题栏会一直显示「对方正在输入」,直到用户发送消息或完全删除文本。如果用户停止打字超过 6 秒,该提示也会消失。SDK 在输入框中有内容变化时,默认向对端用户发送一条正在输入的状态消息,包含消息内容对象 TypingStatusMessage(类型标识:RC:TypSts)。

提示

IMKit 在默认会话页面 Activity(RongConversationActivity)包含了标题栏显示正在输入状态的实现。如果基于 Fragment 构建会话页面,请自行实现标题栏输入状态的展示与更新。

(width=250)

局限

  • 只支持单聊会话。
  • 因无法确定用户的输入操作,该功能可能会产生大量状态消息,为防止消息发送频繁,默认在 6 秒钟内的多次状态变化,只产生一条输入状态消息。
  • 该功能可能会导致大量状态消息,如不需要此功能建议关闭。

用法

如果使用 IMKit 默认会话页面 Activity(RongConversationActivity),该功能默认可用,无需额外处理。

在自定义会话页面监听输入状态

IMKit 的 ConversationFragment 不含标题栏实现。如果使用 Fragment 构建自定义会话页面,您需要自行实现输入状态的展示与更新。IMKit SDK 内部已经处理好逻辑,在输入框中有内容变化时,SDK 会向目标用户发送一条正在输入的状态消息。接收方可根据该状态消息,实现类似「对方正在输入」的提示。

应用程序仅需要在自定义会话页面 Activity 注册监听器,在收到回调通知时更新标题栏。

  1. 在自定义会话页面 Activity 中注册输入状态的监听器。您可以在 ActivityonCreate() 里添加如下代码:

    RongIMClient.setTypingStatusListener(new RongIMClient.TypingStatusListener() {
    @Override
    public void onTypingStatusChanged(Conversation.ConversationType type, String targetId, Collection<TypingStatus> typingStatusSet) {
    //当输入状态的会话类型和targetID与当前会话一致时,才需要显示
    if (type.equals(mConversationType) && targetId.equals(mTargetId)) {
    //count表示当前会话中正在输入的用户数量,目前只支持单聊,所以判断大于0就可以给予显示了
    int count = typingStatusSet.size();
    if (count > 0) {
    Iterator iterator = typingStatusSet.iterator();
    TypingStatus status = (TypingStatus) iterator.next();
    String objectName = status.getTypingContentType();

    MessageTag textTag = TextMessage.class.getAnnotation(MessageTag.class);
    MessageTag voiceTag = VoiceMessage.class.getAnnotation(MessageTag.class);
    //匹配对方正在输入的是文本消息还是语音消息
    if (objectName.equals(textTag.value())) {
    //显示“对方正在输入”

    } else if (objectName.equals(voiceTag.value())) {
    //显示"对方正在讲话"

    }
    } else {
    //当前会话没有用户正在输入,标题栏仍显示原来标题

    }
    }
    }
    });

  2. 当对方正在输入时,本端会触发 onTypingStatusChanged(),回调里携带有正在输入的用户列表。当对方停止输入时,该监听还会触发一次,此时回调里的输入用户列表为空。这时您需要取消「正在输入」的显示,并显示原有的会话标题栏。

定制化

设置发送输入状态消息的默认时间间隔

如果修改 IMKit 默认配置,您可以在应用 res/values 目录下创建 rc_configuration.xml 文件,修改以下配置项的值,单位为毫秒。

<integer name="rc_disappear_interval">6000</integer>

关闭输入状态功能

IMKit 默认开启输入状态功能。您可以通过修改 XML 关闭输入状态功能。在应用 res/values 目录下创建 rc_configuration.xml 文件,修改以下配置项。

<bool name="rc_typing_status">false</bool>