最近公司很久之前的一个集成过环信聊天功能的app,要增加消息撤回的功能,由于这个app是很久之前的。。所以,那个时候的easeUi里面并没有这个功能,于是就参照有这个功能的sdk,把代码搬了过来。。
Ps:当前的sdk版本是2.2.4
首先找到聊天页面ChatActivity页面,里面是一个EaseUi里面的EaseChatFragment,然后找到消息框点击事件,messageList有个item点击事件,(EaseChatMessageList.MessageListItemClickListener),有一系列事件,你可以写在消息框点击事件里(onBubbleClick),也可以写在消息框长按事件里面(onBubbleLongClick),我是选择了后者。
原理图:
参考链接:
http://docs.easemob.com/im/490integrationcases/revoke-messages
下面是效果图:
下面贴代码:
messageList.setItemClickListener(new EaseChatMessageList.MessageListItemClickListener() {
@Override
public void onUserAvatarClick(String username) {
if (chatFragmentListener != null) {
chatFragmentListener.onAvatarClick(username);
}
}
@Override
public void onResendClick(final EMMessage message) {
new EaseAlertDialog(getActivity(), R.string.resend, R.string.confirm_resend, null, new AlertDialogUser() {
@Override
public void onResult(boolean confirmed, Bundle bundle) {
if (!confirmed) {
return;
}
resendMessage(message);
}
}, true).show();
}
@Override
public void onBubbleLongClick(EMMessage message) {
contextMenuMessage = message;
//这个是用来控制撤回这个菜单是否显示
boolean isvisibilty = false;
/**
* callback:这个用来判断是否已经是撤回的消息,
* 在消息撤回以后,会发送一条新的消息,内容是XX
* 撤回了一条消息(我暂且叫CallMessage)
* 我在这个CallMessage中加了个扩展字段callback,来标识该条消息已经是
* 撤回的消息了。即再长按该条消息不需要再显示撤回这个菜单了
*
*/
boolean callback = false;
try {
callback = message.getBooleanAttribute("callback");//如果已经是撤回的消息了,就不要显示撤回这个选项了
} catch (EaseMobException e) {
e.printStackTrace();
}
/**
* 这里需要判断下该条消息必须是自己发的,并且不是CallMessage
* 才能显示撤回菜单
*/
if (message.getFrom().equals(user.getHuanxinId()) && !callback) {
isvisibilty = true;
} else {
isvisibilty = false;
}
//长按以后弹出一个选择框(包括复制消息,删除消息,和撤回消息)
startActivityForResult((new Intent(getActivity(), ContextMenuActivity.class))
.putExtra("message", message)
.putExtra("ischatroom", chatType == EaseConstant.CHATTYPE_CHATROOM)
.putExtra("isvisibilty", isvisibilty),
REQUEST_CODE_CONTEXT_MENU);
}
@Override
public boolean onBubbleClick(EMMessage message) {
if (chatFragmentListener != null) {
return chatFragmentListener.onMessageBubbleClick(message);
}
return false;
}
});
选择框的样式:
下面是ContextMenuActivity.class(选择框)
import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import com.easemob.chat.EMMessage;
import com.easemob.easeui.R;
import com.easemob.easeui.utils.Constant;
//import com.easemob.redpacketsdk.constant.RPConstant;
//import com.hyphenate.chat.EMMessage;
//import com.hyphenate.chatuidemo.Constant;
//import com.hyphenate.chatuidemo.R;
/**
* 选择框页面,根据不同的type,来配置不同的布局,因为有的不需要有复制消息这个菜单
*/
public class ContextMenuActivity extends EaseBaseActivity {
public