近期整理了@人和#话题#等一些标签在输入框中实现的代码
主要思路是 继承 AppCompatEditText 利用 SpannableString 和 一个指定的数据类型的Bean
实现后的效果如下
Android EditText利用SpannableString实现删除块
下面我们分析下具体的思路
1.我们首先继承 AppCompatEditText
2.在我们需要插入@人的时候 其实是往EditText里面插入了一个数据块,名称(libleName) /Id(libleId)/类型(type 用于扩展,如果需要插入#话题#或其他标签)/新旧数据类型(newType 用于二次编辑使用)
3.插入的数据是可变的,这个主要项目业务线的需求
4.获取EditText的内容是一个list,可以通过遍历list获取@人的数据(做发通知使用),或者直接传给后台,展示的时候就是有序的内容了
下面是自定义输入框的代码
public class CommEditText extends AppCompatEditText {
public static final char AT_PERSON_MARK = 8197;//特殊空格
protected int libleColor = 0xff3480ff;
protected StringBuilder builder;
public CommEditText(Context context) {
super(context);
}
public CommEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CommEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 插入一个Span块
*
* @param bean
*/
public void addLibleSpan(CommTextSpan bean) {
builder = new StringBuilder();
if (TextUtils.isEmpty(bean.getShowText())) {
return;
} else {
builder.append(bean.getShowText()).append(AT_PERSON_MARK);
}
getText().insert(getSelectionStart(), builder.toString());
SpannableString sps = new SpannableString(getText());
int start = getSelectionEnd() - b