当前知识库站点已不再维护。请移步新版知识库:https://help.rongcloud.cn/

改变自定义消息样式

针对业务状态来改变自定义消息的展示,例如:报名类型的消息,刚收到消息时页面上显示“去报名”,点击后改变为“已报名”。
发布时间: 2021-11-01 15:24

回答:


1. 首先按照下面链接实现下自定义消息

4.xsdk

https://doc.rongcloud.cn/im/Android/4.X/ui/guide/private/conversation/msgsend/android#common

5.xsdk

https://doc.rongcloud.cn/im/Android/5.X/noui/message/customize


2. 这里使用点击消息改变消息信息实现 使用消息扩展 可同步到远端,可参考下面链接 

4.xsdk

https://doc.rongcloud.cn/im/Android/4.X/noui/guide/private/msgmanage/expansion/android#IMLib%E7%9A%84Message%E5%AF%B9%E8%B1%A1%E6%96%B0%E5%A2%9E%E5%B1%9E%E6%80%A7

5.xsdk

https://doc.rongcloud.cn/im/Android/5.X/noui/message/expansion



具体实现方式

1.发消息时要支持设置消息扩展,如下面代码块 

CustomMessage messageContent = CustomMessage.obtain("自定义消息");
        Message message = Message.obtain(targetId, Conversation.ConversationType.PRIVATE, messageContent);
        message.setCanIncludeExpansion(true);//设置是否可以包含扩展信息
        RongIM.getInstance().sendMessage(message, pushContent, pushData, new IRongCallback.ISendMessageCallback(){}


2.在自定义消息provider的bindView() 方法中 使用textview点击模拟打开红包

TextView tv = view.findViewById(R.id.您的控件id);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Map<String,String> map = new HashMap<>();
                map.put("key","自定义value");
                //更新扩展信息
                RongIMClient.getInstance().updateMessageExpansion(map, uiMessage.getUId(), new RongIMClient.OperationCallback() {
                    @Override
                    public void onSuccess() {
                        tv.setText("红包已经打开");
                    }
                    @Override
                    public void onError(RongIMClient.ErrorCode errorCode) {
                    }
                });
            }
        });


3.在自定义消息provider的bindview中获取消息扩展内容并修改消息样式 

//获取扩展信息 
 if (null!=uiMessage.getMessage().getExpansion()&&!TextUtils.isEmpty(uiMessage.getMessage().getExpansion().get("key"))&&uiMessage.getMessage().getExpansion().get("key").equals("自定义value")){
            viewById.setText("红包已经打开");
        }else {
            viewById.setText("红包未打开");
        }