在 EditText 输入中追加空格

精髓一句:

在增加字符的时候,输入数字: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);
            }
        }
    }
点赞