public class MsgEditText extends AppCompatEditText {
public MsgEditText(Context context) {
super(context);
}
public MsgEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MsgEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
private void generateOneSpan(Spannable spannableString, UnSpanText unSpanText) {
//生成一个TextView
View spanView = getSpanView(getContext(), unSpanText.showText.toString(), getMeasuredWidth());
//再将TextView转换为一个图片
BitmapDrawable bitmpaDrawable = (BitmapDrawable) UIUtils.convertViewToDrawable(spanView);
bitmpaDrawable.setBounds(0, 0, bitmpaDrawable.getIntrinsicWidth(), bitmpaDrawable.getIntrinsicHeight());
//最后将这个图片放到Span里,
MyImageSpan what = new MyImageSpan(bitmpaDrawable, unSpanText.showText.toString(),unSpanText.returnText);
final int start = unSpanText.start;
final int end = unSpanText.end;
spannableString.setSpan(what, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置一个Span
spannableString.setSpan(touchableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
//这个是需要成块删除的内容
private class MyTextSpan extends MetricAffectingSpan {
private String showText;
private long userId;
//userId是为了适应需求,如果不需要请自行去掉
public MyTextSpan(String showText, long userId) {
this.showText = showText;
this.userId = userId;
}
public String getShowText() {
return showText;
}
public long getUserId() {
return userId;
}
@Override
public void updateMeasureState(TextPaint p) {
}
@Override
public void updateDrawState(TextPaint tp) {
}
}
//这个是非整块删除的内容,当然你如果想也是可以删除的
private class UnSpanText {
int start;
int end;
String returnText;
UnSpanText(int start, int end, String returnText) {
this.start = start;
this.end = end;
this.returnText = returnText;
}
}
//外部调用一个增加Span的方法
public void addSpan(String showText, String returnText, long userId) {
getText().append(showText);
SpannableString spannableString = new SpannableString(getText());
makeSpan(spannableString, new UnSpanText(spannableString.length() - showText.length(), spannableString.length(), showText, returnText), userId);
setText(spannableString);
setSelection(spannableString.length());
}
//生成一个需要整体删除的Span
private void makeSpan(Spannable sps, UnSpanText unSpanText, long userId) {
MyTextSpan what = new MyTextSpan(unSpanText.returnText, userId);
int start = unSpanText.start;
int end = unSpanText.end;
sps.setSpan(what, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
//向前删除一个字符,@后的内容必须大于一个字符,可以在后面加一个空格
if (lengthBefore == 1 && lengthAfter == 0) {
MyTextSpan[] spans = getText().getSpans(0, getText().length(), MyTextSpan.class);
for (MyTextSpan myImageSpan : spans) {
if (getText().getSpanEnd(myImageSpan) == start && !text.toString().endsWith(myImageSpan.getShowText())) {
getText().delete(getText().getSpanStart(myImageSpan), getText().getSpanEnd(myImageSpan));
break;
}
}
}
}
//获取用户Id列表,这只是个参考,可根据需求修改
public String getUserIdString() {
MyTextSpan[] spans = getText().getSpans(0, getText().length(), MyTextSpan.class);
StringBuilder builder = new StringBuilder();
for (MyTextSpan myTextSpan : spans) {
String realText = getText().toString().substring(getText().getSpanStart(myTextSpan), getText().getSpanEnd(myTextSpan));
String showText = myTextSpan.getShowText();
if (realText.equals(showText)) {
builder.append(myTextSpan.getUserId()).append(",");
}
}
if (!TextUtils.isEmpty(builder.toString())) {
builder.deleteCharAt(builder.length() - 1);
}
return builder.toString();
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有