自己在學習控件的時候,學到關于EditText的addTextChangedListener()方法,想做一個類似發(fā)微博限制字數(shù)為140那樣的功能,以此文記錄上機過程中發(fā)現(xiàn)的一些問題。在做這個的時候,是第五節(jié)課視頻剛提到addTextChangedListener()這個方法,所以以下僅僅是我自己上機的記錄,不是課程的內容記錄。
addTextChangedListener()初識

addTextChangedListener()是TextView的方法,
EditText繼承自TextView,當然也有這個方法。
從官方的介紹可知,添加了TextWatcher后,
每當TextView的文本改變時,TextWatcher的那幾個方法就會被調用。
另外一句,是關于在afterTextChanged(Editable)中setTest()的一些問題,
也就是在監(jiān)測"改變后"狀態(tài)的方法又去改變那個文本,這樣想想都容易出問題,
不是我目前關心的內容,所以忽略。
關于TextWatcher那幾個方法的解釋
它那幾個方法,分別監(jiān)測了文本"改變前"、"改變時"、"改變中"三種狀態(tài)。
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的舊文本。
多留一些數(shù)據(jù),留著自己研究吧
| 操作 | 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字的功能
經過上面兩個方法各種參數(shù)的折騰后,
我發(fā)現(xiàn)其實想要輸入后有多少字,
直接用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(太大了,壓縮過度):
看不了的點擊這個鏈接
這個代碼當然是爛,之后我再學習一下別人的吧。
繼承接下來的課程,暫記錄到這里吧。