刚刚接到这个需求,感觉应该特别简单,看了下,网上有例子,但是说的不是特别详细,在官网上看了一下,然后总结了一下,终于也是被搞定,
不得不说官网也是比较坑,官网上给的例子的一些方法好多都已经过期了,一开始写的时候,发现长按事件之后怎么也出发不了回调,后来找到了融云官方的jdk,才发现已经过期了,新的融云列表事件监听用的是
RongIM.setConversationListBehaviorListener();
一共有四个回调方法分别是:
头像点击事件
@Override
public boolean onConversationPortraitClick(Context context, Conversation.ConversationType conversationType, String s) {
return false;
}
头像长按事件
@Override
public boolean onConversationPortraitLongClick(Context context, Conversation.ConversationType conversationType, String s) {
return false;
}
消息点击事件
@Override
public boolean onConversationClick(Context context, View view, UIConversation uiConversation) {
return false;
}
消息长按事件
@Override
public boolean onConversationLongClick(final Context context, View view, final UIConversation uiConversation) {
return false;
}
我们需要处理的就是onConversationLongClick()方法,首先把返回值更改为true,调用的时候就会调用我们自定义的弹框,而不是融云提供的
首先我们需要先自定好弹窗代码如下:
/*聊天浮层*/ public static void Chatshow(final Context mContext, String title,final OnFloatingLayerClickLisenter onOKClickLisenter) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext); final AlertDialog alertDialog = builder.create(); alertDialog.show(); alertDialog.getWindow().setContentView(R.layout.chatlist_dia); TextView closeBtn = (TextView) alertDialog.getWindow().findViewById(R.id.btn_delete); TextView upgradeText = (TextView) alertDialog.getWindow().findViewById(R.id.nomsg); upgradeText.setText(title); upgradeText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { alertDialog.dismiss(); onOKClickLisenter.onOkClick(); } }); closeBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { alertDialog.dismiss(); onOKClickLisenter.onDismiss(); } }); alertDialog.setCancelable(true); alertDialog.setCanceledOnTouchOutside(true); alertDialog.show(); }
布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:background="@color/white" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center" android:textSize="15sp" android:id="@+id/btn_delete" android:textColor="#504f60" android:text="删除" /> <View style="@style/lineView"/> <TextView android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center" android:id="@+id/nomsg" android:textSize="15sp" android:textColor="#504f60" android:text="免打扰" /> </LinearLayout>
效果图就是这样子:
接下来我们需要在长按事件中处理我们的操作了,首先第一步,我们需要获取到当前消息是否免打扰
RongIM.getInstance().getConversationNotificationStatus(Conversation.ConversationType.PRIVATE,
uiConversation.getConversationTargetId(), new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() {
@Override
public void onSuccess(final Conversation.ConversationNotificationStatus conversationNotificationStatus) {
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
}
});
成功之后返回了一个conversationNotificationStatus对象,这个对象是干嘛用的呢,里面就包含了当前的是否免打扰的信息,他有一个getvalue()方法,返回值是一个int型的,1=未开启免打扰,0=开启免扰,也就是说是1的时候点击出现弹窗显示的是开启免打扰,0的时候关闭免打扰。但是此处有一个小坑就是,你获取到这个值之后,点击设置免打扰,会发现无效,先来看看如果设置免打扰的方法吧;
RongIM.getInstance().setConversationNotificationStatus(Conversation.ConversationType.PRIVATE,
uiConversation.getConversationTargetId(), conversationNotificationStatus1, new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() {
@Override
public void onSuccess(Conversation.ConversationNotificationStatus conversationNotificationStatus) {
showToast("设置成功");
}
@Override
public void onError(RongIMClient.ErrorCode errorCode) {
showToast("设置失败");
}
});
调用此方法后会发现结果一直不变,这是为什么呢;后来查看了源码之后,才发现融云会把conversationNotificationStatus对象里面的getValue()的值拿出来,但是值一直都是1,所以会没有效果,此时此刻或许你就会明白了,咱们可以手动给他设置,
这个对象既然有gevalue方法,那么久会有setvalue方法,而且这个方法又会返回一个conversationNotificationStatus对象,于是我们再把这个对象设置进去,运行代码,ok没问题啦。贴出此处整体代码吧:
RongIM.getInstance().getConversationNotificationStatus(Conversation.ConversationType.PRIVATE, uiConversation.getConversationTargetId(), new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() { @Override public void onSuccess(final Conversation.ConversationNotificationStatus conversationNotificationStatus) { final int value = conversationNotificationStatus.getValue(); String title; final Conversation.ConversationNotificationStatus conversationNotificationStatus1; if(value==1){ conversationNotificationStatus1=conversationNotificationStatus.setValue(0); title="免打扰"; }else{ conversationNotificationStatus1=conversationNotificationStatus.setValue(1); title="取消免打扰"; } AgreementDialog.Chatshow(context,title, new OnFloatingLayerClickLisenter() { @Override public void onOkClick() { RongIM.getInstance().setConversationNotificationStatus(Conversation.ConversationType.PRIVATE, uiConversation.getConversationTargetId(), conversationNotificationStatus1, new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() { @Override public void onSuccess(Conversation.ConversationNotificationStatus conversationNotificationStatus) { showToast("设置成功"); } @Override public void onError(RongIMClient.ErrorCode errorCode) { showToast("设置失败"); } }); } @Override public void onDismiss() { RongIM.getInstance().getRongIMClient().removeConversation(Conversation.ConversationType.PRIVATE, uiConversation.getConversationTargetId(), new RongIMClient.ResultCallback<Boolean>() { @Override public void onSuccess(Boolean aBoolean) { showToast("删除成功"); } @Override public void onError(RongIMClient.ErrorCode errorCode) { showToast("删除失败"); } }); } }); } @Override public void onError(RongIMClient.ErrorCode errorCode) { } });好了,这个功能到这里也就结束了,还是比较简单的,但是没做过的,可能就会采一些坑,希望这篇博客会对你们开发有帮助。
更多推荐
android融云消息免打扰
发布评论