输入状态
输入状态可让用户直观地了解其他用户是否正在键入消息。在对方用户键入内容时,标题栏会一直显示「对方正在输入」,直到用户发送消息或完全删除文本。如果用户停止打字超过 6 秒,该提示也会消失。SDK 在输入框中有内容变化时,默认向对端用户发送一条正在输入的状态消息,包含消息内容对象 TypingStatusMessage
(类型标识:RC:TypSts
)。
IMKit 在默认会话页面 Activity(RongConversationActivity
)包含了标题栏显示正在输入状态的实现。如果基于 Fragment 构建会话页面,请自行实现标题栏输入状态的展示与更新。
局限
- 只支持单聊会话。
- 因无法确定用户的输入操作,该功能可能会产生大量状态消息,为防止消息发送频繁,默认在 6 秒钟内的多次状态变化,只产生一条输入状态消息。
- 该功能可能会导致大量状态消息,如不需要此功能建议关闭。
用法
如果使用 IMKit 默认会话页面 Activity(RongConversationActivity
),该功能默认可用,无需额外处理。
在自定义会话页面监听输入状态
IMKit 的 ConversationFragment
不含标题栏实现。如果使用 Fragment 构建自定义会话页面,您需要自行实现输入状态的展示与更新。IMKit SDK 内部已经处理好逻辑,在输入框中有内容变化时,SDK 会向目标用户发送一条正在输入的状态消息。接收方可根据该状态消息,实现类似「对方正在输入」的提示。
应用程序仅需要在自定义会话页面 Activity 注册监听器,在收到回调通知时更新标题栏。
-
在自定义会话页面 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())) {
//显示“对方正在输入”
} else if (objectName.equals(voiceTag.value())) {
//显示"对方正在讲话"
}
} else {
//当前会话没有用户正在输入,标题栏仍显示原来标题
}
}
}
}); -
当对方正在输入时,本端会触发
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>