简单记录一下EditText的addTextChangedListener的使用mEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public xtChanged(Editable s) {
} ;
});
其中 public void beforeTextChanged(CharSequence s, int start, int count, int after)的三个参数的意思如下 s为键盘输入前EditText里面的内容,比如EditText已经里有he这个了字符串了,那么s就是"he"了,start为输入的起始位置(跟传统的一样都是从0开始),因为已经有"he",所以start为2,count为取代原来多少个字符的意思,比如我们在"he"之后输入"l",那么count为0,因为"he"并没有被取代掉只是,after就是我们输入字符的个数,因为现在我们只输入了"l",所以after为1。
然后在public void onTextChanged(CharSequence s, int start, int before, int count),因为我们输入了”l”,所以s就是”hel”,而start跟beforeTextChanged里的意思是一样的,就是输入的位置,因为我们是从”he”后面输入的,start就是2, before里跟beforeTextChanged里的第二参数是一个意思 ,就是取代原来多少个字符,这里为0,count跟beforeTextChanged里的第三个”一个意思,我们只输入l”,所以count为1。 然后我们在没有选择”l”的时候又输入了”l”,这里reTextChanged又会被调用,这时我们看看截图 这时s就是为”hel”,因为我们之前输入了一个”l”了,start为2不变,这时count变成了1,也就是说我们将取代一个字符,那这个字符是什么呢,根据start和count计算也就是取代了”he”之后的”l”,用多少个字符取代呢,因为after为2,所以就是用两个字符取代。这两个字符即”ll”(因为我们没有确认输入而是连输)。 再接下来我们看看onTextChanged的截图 这里s变成了”hell”,也就是我们输入后EditText里面的内容了,也就是在2的下标处开始用两个字符取代之前一个字符,通过计算可以知道是用”ll”取代”l”,这跟我们实际的输入情况是一致的。 而当我们不是连输,是在第一个”l”输入后点击确认。那么将会有不同的结果 我们来看看beforeTextChanged的截图 确认输入一个”l”时会再次调用beforeTextChanged(这里说一下,我昨天用另外一个版本时在确认时并不会调用beforeTextChanged,也可能是我昨天弄错了), 然后是oneTxtChanged的截图图 然后我们再输入一个”l”,看beforeTextChanged的截图 注意,这里start变成了3,其他参数也变了,再看看onTextChanged的截图 这就是连输入”ll”和单输入两个”l”的不同。 当我们删除的时候,就是beforeTextChanged里的after变成了0而已,也就是用0个去代替多少其他字符。