聊天@功能记录

集成腾讯云IM功能,有一个@的需求,其实在腾讯云9.18号更新的SDK已经升级了,但是我是之前写的,成功打了一个时间差,导致自己做一个鸡肋的功能。
这里记录一下,方便今后的使用。

1、监听输入框 输入@字符,转跳选择好友界面

    /**
     * 识别输入框的是不是@符号
     */
    private class MyInputFilter implements InputFilter {
        @Override
        public CharSequence filter(CharSequence source, int start, int end,
                                   Spanned dest, int dstart, int dend) {
            if ((source.toString().equalsIgnoreCase("@")
                    || source.toString().equalsIgnoreCase("@"))) {
                resetSpan(input.getText());
                goPath();
            }
            return source;
        }
    }

input.setFilters(new InputFilter[]{new MyInputFilter()});
    /**
     * @author li_peng
     * 重新计算每一个span的位置重置map
     * created at 2020/8/20 14:37
     */
    private void resetSpan(Editable editable) {
        if (editable == null) return;
        LDSpan[] spans = editable.getSpans(0, input.getText().length(), LDSpan.class);
        personMap.clear();
        for (LDSpan s : spans) {
            AtPerson p = s.getPerson();
            p.setStartIndex(editable.getSpanStart(s));
            p.setEndIndex(editable.getSpanEnd(s) -1);
            personMap.put(s.getPerson().getId(), s.getPerson());
        }
    }

goPath() 是转跳好友界面,startActivityForResult()


    /**
     * @author li_peng
     * 针对返回结果的处理
     * created at 2020/8/20 14:39
     */
    public void handleResult(String keyId, String nameStr,boolean flag) {
        if (TextUtils.isEmpty(keyId) || TextUtils.isEmpty(nameStr)) return;
        //1、判断是否已经添加过,如果添加过则删除@符号并返回
        //找到当前的光标位置,也就是输入@符号的位置
        int curIndex = input.getSelectionStart();
        if (curIndex >= 1 && flag) {
            //删除@符号
            input.getText().replace(curIndex - 1, curIndex, "");
        }

        if (personMap.containsKey(keyId)) {
            //根据id判断,如果已经添加过则不做任何操作,直接返回
            return;
        } else {
            //2、没有添加过则构造span,添加到Edittext中
            setImageSpan(keyId, nameStr);
        }
    }

    /**
     * @author li_peng
     * 这是@图片
     * created at 2020/8/20 14:40
     */
    private void setImageSpan(String keyId, String nameStr) {
        int startIndex = input.getSelectionStart();//光标的位置
        int endIndex = startIndex + nameStr.length();//字符结束的位置
        AtPerson lBean = new AtPerson();
        lBean.setId(keyId);
        lBean.setName("@" + nameStr);
        lBean.setStartIndex(startIndex);
        lBean.setEndIndex(endIndex);
        personMap.put(keyId, lBean);
        //插入要添加的字符,此处是为了给span占位
        input.getText().insert(startIndex, "@" + nameStr);
        //1、使用mEditText构造一个SpannableString
        SpannableString ss = new SpannableString(input.getText().toString());
        //2、遍历添加span
        for (AtPerson p : personMap.values()) {
            LDSpan dynamicDrawableSpan = new LDSpan(getActivity(), p);
//            ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);
            spans.add(dynamicDrawableSpan);
            // 把取到的要@的人名,用DynamicDrawableSpan代替,使用这个span是为了防止在@人名中间插入任何字符
            //注意start和end的范围是前闭后开即[start,end)所以end要加1
//            int Index = ss.length() >= p.getEndIndex() ? p.getEndIndex() : ss.length()+1;
//            ss.setSpan(dynamicDrawableSpan, p.getStartIndex(), Index,
//                    SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);

            ss.setSpan(dynamicDrawableSpan, p.getStartIndex(), p.getEndIndex() + 1,
                    SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);

        }

        input.setTextKeepState(ss);
    }

    /**
     * @author li_peng
     * @选择的人 created at 2020/9/11 15:01
     */
    private Map<String, AtPerson> personMap = new LinkedHashMap<>();

然后判断Map是否有值,有值证明是发生了@事件。已腾讯云自定义消息模式发送出去,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值