Android TextWatcher三個(gè)回調(diào)以及監(jiān)聽EditText的輸入案例詳解
TextWatcher是一個(gè)監(jiān)聽字符變化的類。當(dāng)我們調(diào)用EditText的addTextChangedListener(TextWatcher)方法之后,就可以監(jiān)聽EditText的輸入了。
在new出一個(gè)TextWatcher之后,我們需要實(shí)現(xiàn)三個(gè)抽象方法:
- beforeTextChanged
- onTextChanged
- afterTextChanged
看下beforeTextChanged的注釋:
This method is called to notify you that, within s, the count characters beginning at start are about to be replaced by new text with length after. It is an error to attempt to make changes to s from this callback.
不知道你看懂沒有,可能是因?yàn)橛⑽乃降膯栴},我反正是看的很含糊不清。
既然這樣,那最好的辦法就是自己打個(gè)log試一下了。
EditText et = (EditText) findViewById(R.id.et); TextWatcher watcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { Log.d(TAG, "beforeTextChanged: s = " + s + ", start = " + start + ", count = " + count + ", after = " + after); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Log.d(TAG, "onTextChanged: s = " + s + ", start = " + start + ", before = " + before + ", count = " + count); } @Override public void afterTextChanged(Editable s) { Log.d(TAG, "afterTextChanged: " + s); } }; et.addTextChangedListener(watcher);
首先輸入abc123
然后在c和1之間添加一個(gè)0,現(xiàn)在文字變成了abc0123,再看下LOGCAT的顯示:
再把0給刪掉,log如下:
把0替換成12:
通過Log,結(jié)合Android源碼注釋,可以得出結(jié)論:
- beforeTextChanged(CharSequence s, int start, int count, int after)
s: 修改之前的文字。
start: 字符串中即將發(fā)生修改的位置。
count: 字符串中即將被修改的文字的長(zhǎng)度。如果是新增的話則為0。
after: 被修改的文字修改之后的長(zhǎng)度。如果是刪除的話則為0。 - onTextChanged(CharSequence s, int start, int before, int count)
s: 改變后的字符串
start: 有變動(dòng)的字符串的序號(hào)
before: 被改變的字符串長(zhǎng)度,如果是新增則為0。
count: 添加的字符串長(zhǎng)度,如果是刪除則為0。 - afterTextChanged(Editable s)
s: 修改后的文字
Tips:
**需要特別注意的是,在TextWatcher中setText要小心不要陷入死循環(huán)。**即:
文字改變->watcher接收到通知->setText->文字改變->watcher接受到通知->…
在watcher中使用setText的解決方案
關(guān)于這三個(gè)回調(diào)方法調(diào)用的時(shí)機(jī),可以參考這篇文章
當(dāng)對(duì)EditText使用setText之后,記得再使用setSelection()來設(shè)置光標(biāo)位置。
一個(gè)完整的TextWatcher例子:
// 用于屏蔽空格輸入的TextWatcher TextWatcher watcher = new TextWatcher() { private String mBefore;// 用于記錄變化前的文字 private int mCursor;// 用于記錄變化時(shí)光標(biāo)的位置 @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { mBefore = s.toString(); mCursor = start; Log.d(TAG, "beforeTextChanged: " + s + ", " + mCursor); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Log.d(TAG, "onTextChanged: " + s); } @Override public void afterTextChanged(Editable s) { Log.d(TAG, "afterTextChanged: " + s); // 這里圖方便,是在afterTextChanged判斷是否輸入之后含有空格,并不是最好的方案 // 理論上應(yīng)該在onTextChanged中判斷輸入內(nèi)容 if (s.toString().contains(" ")) { Log.i(TAG, "onTextChanged: 包含空格, 設(shè)置" + mBefore); et.removeTextChangedListener(this); et.setText(mBefore); et.addTextChangedListener(this); et.setSelection(mCursor); } } }; et.addTextChangedListener(watcher);
到此這篇關(guān)于Android TextWatcher三個(gè)回調(diào)以及監(jiān)聽EditText的輸入案例詳解的文章就介紹到這了,更多相關(guān)Android TextWatcher三個(gè)回調(diào)以及監(jiān)聽EditText的輸入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android開發(fā)EditText實(shí)現(xiàn)密碼顯示隱藏
- Android開發(fā)EditText禁止輸入監(jiān)聽及InputFilter字符過濾
- Android中EditText光標(biāo)的顯示與隱藏方法
- Android EditText輸入框?qū)崿F(xiàn)下拉且保存最近5個(gè)歷史記錄思路詳解
- Android使用EditText小技巧匯總
- Android EditText隨輸入法一起移動(dòng)并懸浮在輸入法之上的示例代碼
- Android EditText每4位自動(dòng)添加空格效果
- Android編輯框EditText與焦點(diǎn)變更監(jiān)視器及文本變化監(jiān)視器實(shí)現(xiàn)流程詳解
相關(guān)文章
Android Studio升級(jí)到3.0 Terminal 中文顯示異常解決
本篇文章主要介紹了Android Studio升級(jí)到3.0 Terminal 中文顯示異常解決,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10建造者模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
建造者實(shí)現(xiàn)抽象類的所有未實(shí)現(xiàn)的方法,具體來說一般是兩項(xiàng)任務(wù),組建產(chǎn)品;返回組建好的產(chǎn)品2017-08-08Android基于wheelView實(shí)現(xiàn)自定義日期選擇器
這篇文章主要為大家詳細(xì)介紹了Android基于wheelView實(shí)現(xiàn)自定義日期選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07android獲取當(dāng)前手機(jī)號(hào)示例程序
這篇文章主要介紹了android如何獲取當(dāng)前手機(jī)號(hào)的方法,大家參考使用吧2013-11-11Android實(shí)現(xiàn)EditText輸入金額
EditText是Android中一個(gè)非常實(shí)用的控件,有很多InputType,可以來達(dá)到不同的輸入效果,下面通過實(shí)例代碼給大家解析android實(shí)現(xiàn)edittext輸入金額,需要的朋友參考下吧2016-12-12Android制作一個(gè)錨點(diǎn)定位的ScrollView
這篇文章主要介紹了Android制作一個(gè)錨點(diǎn)定位的ScrollView,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下2021-04-04Flutter?+?Idea?環(huán)境搭建及配置教程
本文主要總結(jié)我實(shí)際搭建的過程,最后發(fā)現(xiàn)不一定按網(wǎng)上那些博客或者官方文檔寫的來也可以搭建成功,在這里小編給大家分享下Flutter?+?Idea?環(huán)境搭建及配置教程,感興趣的朋友參考下吧2021-12-12