您的位置:首页 > 其它

onTextChanged参数解释及实现EditText字数监听

2015-12-09 13:49 357 查看
http://www.picksomething.cn/?p=34

由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher。

它有三个成员方法,第一个after很简单,这个方法就是在EditText内容已经改变之后调用,重点看下面两个方法:

beforeTextChanged(CharSequences,intstart,intcount,intafter)

这个方法是在Text改变之前被调用,它的意思就是说在原有的文本s中,从start开始的count个字符将会被一个新的长度为after的文本替换,注意这里是将被替换,还没有被替换。

onTextChanged(CharSequences,intstart,intbefore,intcount)

这个方法是在Text改变过程中触发调用的,它的意思就是说在原有的文本s中,从start开始的count个字符替换长度为before的旧文本,注意这里没有将要之类的字眼,也就是说一句执行了替换动作。

可能说起来比较抽象,我举个简单的例子,比如说我们监听一个EditText,默认开始的时候EditText中没有文本,当我们输入LOVE四个字母的时候,在打印信息中我输出各个参数看一下参数的变化。

10-1816:40:21.528:D/Debug(4501):beforeTextChanged被执行---->s=----start=0----after=1----count=0
10-1816:40:21.528:D/Debug(4501):onTextChanged被执行---->s=L----start=0----before=0----count=1
10-1816:40:21.532:D/Debug(4501):afterTextChanged被执行---->L
10-1816:40:29.304:D/Debug(4501):beforeTextChanged被执行---->s=L----start=1----after=1----count=0
10-1816:40:29.308:D/Debug(4501):onTextChanged被执行---->s=LO----start=1----before=0----count=1
10-1816:40:29.308:D/Debug(4501):afterTextChanged被执行---->LO
10-1816:40:32.772:D/Debug(4501):beforeTextChanged被执行---->s=LO----start=2----after=1----count=0
10-1816:40:32.772:D/Debug(4501):onTextChanged被执行---->s=LOV----start=2----before=0----count=1
10-1816:40:32.776:D/Debug(4501):afterTextChanged被执行---->LOV
10-1816:40:34.772:D/Debug(4501):beforeTextChanged被执行---->s=LOV----start=3----after=1----count=0
10-1816:40:34.772:D/Debug(4501):onTextChanged被执行---->s=LOVE----start=3----before=0----count=1
10-1816:40:34.776:D/Debug(4501):afterTextChanged被执行---->LOVE


通过上面的打印信息我们可以发现在输入L之前
beforeTextChanged
被执行,s为空,所以s输入空,start=0,也就是从位置0开始,count=0,也就是0个字符将会被替换,after=1,也就是说0个字符将会被一个新的长度为after=1的文本(也就是L)替换。

当输入发生改变的时候
onTextChanged
被执行,此时s=L也就是输入的字母L,从start=0开
始,count=1个字符替换了长度为before=0的旧文本。通俗点将就是字母L从位置0开始替换了原来的空文本,下面的就可以依次类推了。那么我们
如何利用这个接口监听EditText的文本变化来实现限制输入字数的功能呢,我相信大家都有自己的想法了,这里我给出自己的一个简单实现,主要代码如
下:

source_des.addTextChangedListener(newTextWatcher(){ privateCharSequencetemp; privateintselectionStart; privateintselectionEnd; @Override publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){ Log.d(TAG,"onTextChanged被执行---->s="+s+"----start="+start +"----before="+before+"----count"+count);temp=s; } publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){ Log.d(TAG,"beforeTextChanged被执行---->s="+s+"----start="+start +"----after="+after+"----count"+count); } publicvoidafterTextChanged(Editables){ Log.d(TAG,"afterTextChanged被执行---->"+s); selectionStart=source_des.getSelectionStart(); selectionEnd=source_des.getSelectionEnd(); if(temp.length()>MAX_LENGTH){ Toast.makeText(MainActivity.this,"只能输入九个字", Toast.LENGTH_SHORT).show(); s.delete(selectionStart-1,selectionEnd); inttempSelection=selectionEnd; source_des.setText(s); source_des.setSelection(tempSelection); } } });


如大家有什么疑问,欢迎交流。

小结:多总结。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: