EditText限制输入字数及过滤emoji表情

我接到的需求时,在EditText的输入中要限制输入的字数1000,倒计显示,输入一个英文字符减1,一个中文字符减2。

utf-8的字符集中,一个英文字符或数字占用1个字节,一个汉字大部分都是占有3或4个字节。GBK字符集中,一个英文字符占用1个字节,一个汉字占用2个字节。

在讲用InputFilter过滤EditText之前,先要说EditText的两个属性:maxLength和maxEms。

maxLength:android:maxLength=“10”是对EditText的字数进行控制的。不管中文还是英文,字的个数都是10。
maxEms:个人还不会用android提供的这个属性,所以它具体该怎么使用还不清楚,但是它有一个规律:设你输入的参数为x,屏幕显示的数量为y。值为1~5时,y = x。 6~11时,y = x+1。 12~18时,y = x+2。

过滤字数

根据上述需求以及各个属性中的限制,大家应该能看得出来,限制字数这并不适合使用maxLength和maxEms这两个属性,所以我们要使用InputFilter。而在使用InputFilter中,我们需要设定一下其字符集(GBK)。下面贴代码可以感受一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
edittext.setFilters(new InputFilter[]{new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
//此为过滤emoji表情地方法,后面会为大家介绍
if (RegexUtils.isHasEmoji(source)) {
return "";
}
int len = 0;
boolean more = false;
do {
SpannableStringBuilder builder = new SpannableStringBuilder(dest).replace(dstart, dend, source.subSequence(start, end));
//此时一个汉字等于两个字节。如果想改成一个汉字和英文一样减1,那么可以改成len = builder.toString().length();
len = builder.toString().getBytes(“GBK”).length;
//这个是倒计字数设置,setText()中的代码,是在string文件中配过value并且其中有需要倒计字数的占位符,charactersLen代表总限制多少个字,按需求该值为1000;
tvCharacters.setText(String.format(getResources().getString(R.string.placeholder_num_characters), charactersLen - len));
more = len > charactersLen;
//以下,如果字数大于限制数,那么不显示输入
if (more) {
end--;
source = source.subSequence(start, end);
}
} while (more);
return source;
}
}});

过滤emoji表情

此时就可以完成上述需求,接下来是限制emoji表情的输入。
大家看见的RegexUtils是我写的工具类,isHasEmoji()是其中判断是否存在emoji表情,这个校验也是要写在InputFilter这个过滤器中的。代码如下:

1
2
3
4
5
6
7
8
9
10
11
public static boolean isHasEmoji(CharSequence source) {
Pattern emoji = Pattern.compile("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
//过滤emoji
Matcher emojiMatcher = emoji.matcher(source);
if (emojiMatcher.find()) {
return true;
}
return false;
}

这个方法就可以判断输入的字符中是不是emoji,如果是,return true。再看InputFilter中的方法,则return “”;返回了一个空字符串,就输入不进emoji表情了。

如需转载,请注明出处:YauLam’s Blog,thank u~