正在输入

用户正在输入文字或者正在录制语音消息时,SDK 可以在聊天界面的标题栏中显示对方正在输入和对方正在讲话的提示。

rc_configuration.xml 里的 rc_typing_status 开关可以开启输入状态提醒的功能。

提示

目前仅支持单聊。默认为 true 开启,设置为 false 为关闭。

<!-- 设置发送输入状态 -->
<bool name="rc_typing_status">true</bool>

SDK 只需要注册监听,在回调里更新标题栏即可。

由于 IMKit SDK 只提供 fragment ,所以标题栏的处理需要开发者自己实现。请在集成了 ConversationFragment 的 activity 里注册输入状态的监听,您可以在 activity 的 onCreate() 里添加如下代码。

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())) {
                    //显示“对方正在输入”
                    mHandler.sendEmptyMessage(SET_TEXT_TYPING_TITLE);
                } else if (objectName.equals(voiceTag.value())) {
                    //显示"对方正在讲话"
                    mHandler.sendEmptyMessage(SET_VOICE_TYPING_TITLE);
                }
            } else {
                //当前会话没有用户正在输入,标题栏仍显示原来标题
                mHandler.sendEmptyMessage(SET_TARGETID_TITLE);
            }
        }
    }
});

当前会话正在输入的用户有变化时,会触发 onTypingStatusChanged() ,回调里携带有当前正在输入的用户列表。对于单聊而言,当对方正在输入时,监听会触发一次;当对方不处于输入状态时,该监听还会触发一次,但是回调里上来的输入用户列表为空,开发者需要在此时取消正在输入的显示,显示原有的标题。