跳到主要内容

自定义长按消息菜单

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

(width=220) (width=220)

自定义长按消息弹窗的菜单选项

  1. 监听会话页面的长按消息事件(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;
    }
    });
  2. 通过 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;
      }
      }

    MessageItemLongClickAction 类属性如下表所示。

    属性类型描述
    titleString显示名称。
    listenerMessageItemLongClickListener长按消息监听器。
    priorityint优先级越高,排在越前面(由上到下的顺序)。默认全是 0,按添加顺序排列。
    filterFilter控制是否会被显示出来的过滤器。

自定义消息多选操作菜单

在长按消息弹窗的菜单选项选择更多后,SDK 进入消息多选模式,多选模式下默认提供了转发和删除按钮。您可以增删已有按钮、添加自定义按钮。

  1. 实现 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;
    }
    }
  2. 将自定义按钮配置到 SDK 中。

    RongConfigCenter.conversationConfig().addMoreClickAction(0, new CustomClickAction());
  3. 根据业务需要,彻底移除某内置按钮。以下示例以移除转发按钮为例。

    List<IClickActions> clickActions = RongConfigCenter.conversationConfig().getMoreClickActions();
    List<IClickActions> removeActions = new ArrayList<>();
    for (IClickActions action : clickActions){
    if (action instanceof ForwardClickActions){
    RongConfigCenter.conversationConfig().removeMoreClickAction(action);
    }
    }
    提示

    移除“转发”按钮仅在 IMKit 合并转发功能关闭的情况下生效。

自行控制多选状态

您可以自行控制多选状态,或获取多选状态下的数据。

进入多选状态:

MessageViewModel messageViewModel = ViewModelProviders.of(fragment).get(MessageViewModel.class);
messageViewModel.enterEditState();

关闭多选状态:

MessageViewModel messageViewModel = ViewModelProviders.of(fragment).get(MessageViewModel.class);
messageViewModel.quitEditMode();

获取选中的信息:

MessageViewModel messageViewModel = ViewModelProviders.of(fragment).get(MessageViewModel.class);
List<UiMessage> selectedMessages = messageViewModel.getSelectedUiMessages();

监听多选状态变化

通过 MessageViewModel 获取多选状态的 LiveData, 可以监听多选状态的变化。

MessageViewModel messageViewModel = ViewModelProviders.of(fragment).get(MessageViewModel.class);
messageViewModel.getEditStatusLiveData().observe(this, new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
//根据业务需要,进行 UI 更新。
}
});