自定义长按消息菜单
自定义长按消息菜单
用户在会话页面长按消息可打开弹窗,根据当前消息类型、会话类型提供不同选项。您可以在自定义菜单选项的显示名称、顺序、以及自行增删菜单选项。


自定义长按消息弹窗的菜单选项
监听会话页面的长按消息事件(
onMessageLongClick
)。IMCenter.setConversationClickListener( new ConversationClickListener() { @Override public boolean onUserPortraitClick( Context context, Conversation.ConversationType conversationType, UserInfo user, String targetId) { return false; } @Override public boolean onUserPortraitLongClick( Context context, Conversation.ConversationType conversationType, UserInfo user, String targetId) { return false; } @Override public boolean onMessageClick( Context context, View view, Message message) { return false; } @Override public boolean onMessageLongClick( Context context, View view, Message message) { return false; } @Override public boolean onMessageLinkClick( Context context, String link, Message message) { return false; } @Override public boolean onReadReceiptStateClick( Context context, Message message) { return false; } });
已复制1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44通过
MessageItemLongClickActionManager
修改会话页面中的长按消息的操作选项(MessageItemLongClickAction
)。您可以自行增删菜单选项。长按消息的操作选项,或调整菜单选项的显示名称、顺序。MessageItemLongClickActionManager
在初始化方法initCommonMessageItemLongClickActions
中添加了部分操作选项。您可以使用addMessageItemLongClickAction
添加选项。可参考 IMKit 源码中的 MessageItemLongClickActionManager.java。如需删除已有选项时,需先获取到要删除选项的对象,然后调删除接口
removeMessageItemLongClickAction
。以去除默认已经添加的「删除消息」选项为例:List<MessageItemLongClickAction> clickActions = MessageItemLongClickActionManager .getInstance().getMessageItemLongClickActions(); Iterator<MessageItemLongClickAction> iterator = clickActions.iterator(); String delActionTitle = getString(R.string.rc_dialog_item_message_delete); while (iterator.hasNext()) { MessageItemLongClickAction clickAction = iterator.next(); boolean isDelAction = delActionTitle.equals(clickAction.getTitle(this)); if (isDelAction) { iterator.remove(); break; } }
已复制1
2
3
4
5
6
7
8
9
10
11
12
MessageItemLongClickAction
类属性如下表所示。属性 类型 描述 title String 显示名称。 listener MessageItemLongClickListener 长按消息监听器。 priority int 优先级越高,排在越前面(由上到下的顺序)。默认全是 0
,按添加顺序排列。filter Filter 控制是否会被显示出来的过滤器。
自定义消息多选操作菜单
在长按消息弹窗的菜单选项选择更多后,SDK 进入消息多选模式,多选模式下默认提供了转发和删除按钮。您可以增删已有按钮、添加自定义按钮。
实现
IClickActions
接口。public class CustomClickActions implements IClickActions { /** * 获取点击按钮的图标 * * @param context 上下文 * @return 图片的Drawable, 如需高亮或者置灰,则返回类型为selector, 分别显示enable或者disable状态下的drawable */ @Override public Drawable obtainDrawable(Context context) { return null; } /** * 图标按钮点击事件 * * @param curFragment 当前 Fragment, 请注意不要持有该 fragment, 否则容易引起内存泄露。 */ @Override public void onClick(Fragment curFragment) { } /** * 是否过滤。可以根据业务场景,设置某些会话下过滤掉此按钮,即不进行显示。 * @param message 消息 * @return 返回true,表示过滤掉,页面上不显示此 item。 */ @Override public boolean filter(UiMessage message) { return false; } }
已复制1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30将自定义按钮配置到 SDK 中。
RongConfigCenter.conversationConfig().addMoreClickAction(0, new CustomClickAction());
已复制1根据业务需要,彻底移除某内置按钮。以下示例以移除转发按钮为例。
List<IClickActions> clickActions = RongConfigCenter.conversationConfig().getMoreClickActions(); List<IClickActions> removeActions = new ArrayList<>(); for (IClickActions action : clickActions){ if (action instanceof ForwardClickActions){ RongConfigCenter.conversationConfig().removeMoreClickAction(action); } }
已复制1
2
3
4
5
6
7移除“转发”按钮仅在 IMKit 合并转发功能关闭的情况下生效。
自行控制多选状态
您可以自行控制多选状态,或获取多选状态下的数据。
进入多选状态:
MessageViewModel messageViewModel = ViewModelProviders.of(fragment).get(MessageViewModel.class);
messageViewModel.enterEditState();
已复制
1
2
关闭多选状态:
MessageViewModel messageViewModel = ViewModelProviders.of(fragment).get(MessageViewModel.class);
messageViewModel.quitEditMode();
已复制
1
2
获取选中的信息:
MessageViewModel messageViewModel = ViewModelProviders.of(fragment).get(MessageViewModel.class);
List<UiMessage> selectedMessages = messageViewModel.getSelectedUiMessages();
已复制
1
2
监听多选状态变化
通过 MessageViewModel 获取多选状态的 LiveData, 可以监听多选状态的变化。
MessageViewModel messageViewModel = ViewModelProviders.of(fragment).get(MessageViewModel.class);
messageViewModel.getEditStatusLiveData().observe(this, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
//根据业务需要,进行 UI 更新。
}
});
已复制
1
2
3
4
5
6
7