集成腾讯云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是否有值,有值证明是发生了@事件。已腾讯云自定义消息模式发送出去,