自己在学习控件的时候,学到关于EditText的addTextChangedListener()方法,想做一个类似发微博限制字数为140那样的功能,以此文记录上机过程中发现的一些问题。在做这个的时候,是第五节课视频刚提到addTextChangedListener()这个方法,所以以下仅仅是我自己上机的记录,不是课程的内容记录。
addTextChangedListener()初识
addTextChangedListener()是TextView的方法,
EditText继承自TextView,当然也有这个方法。
从官方的介绍可知,添加了TextWatcher后,
每当TextView的文本改变时,TextWatcher的那几个方法就会被调用。
另外一句,是关于在afterTextChanged(Editable)
中setTest()的一些问题,
也就是在监测"改变后"状态的方法又去改变那个文本,这样想想都容易出问题,
不是我目前关心的内容,所以忽略。
关于TextWatcher那几个方法的解释
它那几个方法,分别监测了文本"改变前"、"改变时"、"改变中"三种状态。
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//这个方法被调用,说明在s字符串中,从start位置开始的count个字符即将被长度为after的新文本所取代。在这个方法里面改变s,会报错。
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//这个方法被调用,说明在s字符串中,从start位置开始的count个字符刚刚取代了长度为before的旧文本。在这个方法里面改变s,会报错。
}
@Override
public void afterTextChanged(Editable s) {
//这个方法被调用,那么说明s字符串的某个地方已经被改变。
}
});
beforeTextChanged()&onTextChanged()
具体解释一下,这里其实有点绕,最好自己上机观察。
1.增加字符的操作
例如,原来有4个字,我再输入2个字。
- beforeTextChanged:start为4、count为0、after为2;
- onTextChanged:start为4、before为0、count为2。
对于beforeTextChanged(),是从第4个字符的位置开始,
因为是增加操作,没有字符会被新字符替代,即0个字符即将被2个字符取代;
对于onTextChanged,是从第4个字符的位置开始,
因为是增加操作,没有字符会被新字符替代,即2个字符刚刚取代了长度为0的旧文本。
2.删除字符的操作
因为按←进行删除操作,只会一个个计算,效果不明显,我就直接剪切了3个字符。
- beforeTextChanged:start为3、count为3、after为0;
- onTextChanged:start为3、before为3、count为0。
对于beforeTextChanged(),是从第3个字符的位置开始,
因为是删除操作,取代原来字符的“新文本”长度为0,即3个字符即将被0个字符取代;
对于onTextChanged,是从第3个字符的位置开始,
因为是删除操作,取代原来字符的“新文本”长度为0,即0个字符刚刚取代了长度为3的旧文本。
多留一些数据,留着自己研究吧
操作 | beforeTextChanged (s,start,count,after) | onTextChanged (s,start,before,count) |
---|---|---|
从无到有输入5个字符 | 0-0-5 | 0-0-5 |
5个字符,再输入3个字符,变8个字符 | 5-0-3 | 5-0-3 |
8个字符,删掉4个,剩4个字符 | 4-4-0 | 4-4-0 |
4个字符,删掉2个,剩2个字符 | 2-2-0 | 2-2-0 |
2个字符,输入3个,变5个字符 | 2-0-3 | 2-0-3 |
回到微博那个140字的功能
经过上面两个方法各种参数的折腾后,
我发现其实想要输入后有多少字,
直接用public void afterTextChanged(Editable s)
就行了。
核心代码:
@Override
public void afterTextChanged(Editable s) {
int textSum = s.toString().length();
if(textSum<130){
textView.setText("");
}
if(textSum>=130&&textSum<=140){
textView.setText(String.valueOf(140-textSum));
textView.setTextColor(getResources().getColor(R.color.gray));
}
if(textSum>140){
textView.setText(String.valueOf(140-textSum));
textView.setTextColor(getResources().getColor(R.color.red));
}
}
上机的Gif(太大了,压缩过度):
看不了的点击这个链接
这个代码当然是烂,之后我再学习一下别人的吧。
继承接下来的课程,暂记录到这里吧。