精髓一句:
在增加字符的时候,输入数字:count == 1,输入英文字符,count会等于23456….取决于单词的长度。所以,只要把判定条件改为:count != 0, 即可。
今天遇到的需求,也没问旁边的前辈,撸起袖子就开搞了。
每输入4位数字自动做空格处理,限定输入框长度16位,不包括空格。
看到这个需求,想法都是很简单的,在TextWatcher中做监听就行了。不管是直接让Activity实现TextWatcher接口也好,还是直接给EditText加上AddTextChangeListener然后new也好。
接着开始搜索一下,搜索到这么一篇东西:EditText输入手机号自动带空格。他在代码中很简单暴力的就开始使用了一个StringBuilder对象,来实现追加功能。
这样做明显是不妥的,即使Java有自动GC机制,但是也架不住EditText中的字符每改变一次就new一个对象啊!
然后看了这一篇:[原创]Android实现输入手机号时自动添加空格
在这篇博文中的代码相对靠谱。
public void onTextChanged(CharSequence s, int start, int before, int count) {
DLog.d("----------onTextChanged----------\n");
DLog.d("s:" + s + "\n");
DLog.d("start:" + start + "\n");
DLog.d("before:" + before + "\n");
DLog.d("count:" + count + "\n");
if (count == 1){
int length = s.toString().length();
if (length == 3 || length == 8){
editText.setText(s + " ");
editText.setSelection(editText.getText().toString().length());
}
}
}
修改之后,旁边的前辈说他之前也写过这个。不过最后因为光标会跳,而且还没有解决。
原代码我已经删了,这里就不贴出来了。
然后我开始去看他写的,并将我写的加入到之前的代码之中。
这个时候发现了一个BUG:在原生模拟器之中,输入法会自动将输入的英文字符拼接成为一个单词,这个时候,这个方法会失效。
接着我开始Debug,最后发现。在增加字符的时候,输入数字:count == 1, 输入英文字符,count 会等于23456….取决于单词的长度。
所以,只要把判定条件改为:count != 0, 即可。
我的最终源码:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (count != 0) {
int length = s.length() + 1;
if (length % 5 == 0 && length < 20) {
edx.setText(s + " ");
edx.setSelection(length);
}
}
}