Android EditText过滤换行符,回车符和空白符,以及过滤表情
查看文章前请参考:Java 中 Emoji 的正则表达式
功能介绍
- 过滤换行符,回车符,空白符
- 过滤Emoji
1. 背景
项目有个需求,所有与“标题”有关的输入,都不允许有换行。
第一次拿到这个需求的时候觉得很简单,直接设置一个InputFilter
public class NewlineFilter implements InputFilter {
/**
* @param source 输入的文字
* @param start 输入-0,删除-0
* @param end 输入-文字的长度,删除-0
* @param dest 原先显示的内容
* @param dstart 输入-原光标位置,删除-光标删除结束位置
* @param dend 输入-原光标位置,删除-光标删除开始位置
* @return null表示原始输入,""表示不接受输入,其他字符串表示变化值
*/
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source.toString().contains("\n")) {
return source.toString().replace("\n", "");
}
return null;
}
}
然后拿起手机测试,发现没毛病,开开心心的提测。。。
2. 问题
第二天打开jira一看,有个bug:
“魅蓝Note5输入字符的时候字符成倍出现,删除的时候还会输入字符”
我拿来测试机试了一下:
很明显,魅族的输入法会把当前“待输入字符”放入到EditText输入框里,而华为的讯飞输入法不会。
再回看上面的代码就会发现一个问题:
return source.toString().replace("\n", “”);会把当前魅族Note5输入框中的“待输入字符”转化为输入字符,但是,推荐词区域的字符并没有丢失,所以下次输入字符的时候会把推荐词内容一并倒入到输入框里,这就是测试同学说的现象。完美复现!
3. 方案
好,现在问题明了了,说白就是适配问题。
解决适配问题有个准则:
- 1.尽量少些特有平台代码
- 2.覆盖测试
所以我的思考方向是:看看官方怎么实现的