【Android】關于addTextChangedListener()方法的上機記錄

自己在學習控件的時候,學到關于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(太大了,壓縮過度):


看不了的點擊這個鏈接

這個代碼當然是爛,之后我再學習一下別人的吧。
繼承接下來的課程,暫記錄到這里吧。

參考資料

很好的文章:Android字數(shù)限制的EditText實現(xiàn)方案研究

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,677評論 0 4
  • 晚上孩子放學回家抱著一堆網(wǎng)購的東西快速進了房間,吃完飯孩子拆開包裝我看見都是動漫服裝,我沒有說孩子,只是覺得很漂亮...
    蘭州李慧閱讀 616評論 6 11
  • (無題)國強不稱霸,權大不欺民。手無打拘棒,低頭過衙門。世道難不語,二餐饑無奈。遠山法不到,猴子稱大王。
    甘朝武閱讀 149評論 0 0
  • 陳茜茜 在鄉(xiāng)村里,我不向往那最純粹的綠,我不向往那最清新的空氣,我亦不向往那最開闊的視野,唯鐘情于鍋巴,那躲在大鍋...
    蘇北以南閱讀 551評論 1 1

友情鏈接更多精彩內容