先上图:
最近产品需要一个编辑标签的页面如图所示。
需要实现可以输入标签,按回车键或逗号生成标签。并且可以移动光标删除标签,和插入标签。
并且单个标签有字符限制(英文算一个中文算两个字符)
直接上代码
activity的代码
package com.fan.tagtest;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.InputFilter;
import android.text.Selection;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.TextWatcher;
import android.text.style.ImageSpan;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MainActivity extends AppCompatActivity {
List<String> source = new ArrayList<>();
private static final int maxLength = 8;
private static final boolean isChinese2English = true;
public static void setEditTextInhibitInputSpeChat(EditText editText) {
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
String chars = "\r\n\t ";
String speChat = "[" + chars + "]";
Pattern pattern = Pattern.compile(speChat);
Matcher matcher = pattern.matcher(source.toString());
if (matcher.find()) {
String str = source.toString();
char[] charArr = toCharArray(chars);
for (char c : charArr) {
str = str.replaceAll(new String(new char[]{c}), "");
}
return str;
} else return null;
}
};
InputFilter emojiFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int index = start; index < end; index++) {
int type = Character.getType(source.charAt(index));
if (type == Character.SURROGATE) {
return "";
}
}
return null;
}
};
editText.setFilters(new InputFilter[]{filter, emojiFilter});
}
@NonNull
private static MyImageSpanImage[] getSortedImageSpans(final Editable text) {
MyImageSpanImage[] spans = text.getSpans(0, text.length(), MyImageSpanImage.class);
Arrays.sort(spans, new Comparator<MyImageSpanImage>() {
@Override
public int compare(MyImageSpanImage o1, MyImageSpanImage o2) {
int start1 = text.getSpanStart(o1);
i