Android TextWatcher三個回調以及監(jiān)聽EditText的輸入案例詳解
TextWatcher是一個監(jiān)聽字符變化的類。當我們調用EditText的addTextChangedListener(TextWatcher)方法之后,就可以監(jiān)聽EditText的輸入了。
在new出一個TextWatcher之后,我們需要實現三個抽象方法:
- 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.
不知道你看懂沒有,可能是因為英文水平的問題,我反正是看的很含糊不清。
既然這樣,那最好的辦法就是自己打個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之間添加一個0,現在文字變成了abc0123,再看下LOGCAT的顯示:
再把0給刪掉,log如下:
把0替換成12:
通過Log,結合Android源碼注釋,可以得出結論:
- beforeTextChanged(CharSequence s, int start, int count, int after)
s: 修改之前的文字。
start: 字符串中即將發(fā)生修改的位置。
count: 字符串中即將被修改的文字的長度。如果是新增的話則為0。
after: 被修改的文字修改之后的長度。如果是刪除的話則為0。 - onTextChanged(CharSequence s, int start, int before, int count)
s: 改變后的字符串
start: 有變動的字符串的序號
before: 被改變的字符串長度,如果是新增則為0。
count: 添加的字符串長度,如果是刪除則為0。 - afterTextChanged(Editable s)
s: 修改后的文字
Tips:
**需要特別注意的是,在TextWatcher中setText要小心不要陷入死循環(huán)。**即:
文字改變->watcher接收到通知->setText->文字改變->watcher接受到通知->…
在watcher中使用setText的解決方案
關于這三個回調方法調用的時機,可以參考這篇文章
當對EditText使用setText之后,記得再使用setSelection()來設置光標位置。
一個完整的TextWatcher例子:
// 用于屏蔽空格輸入的TextWatcher TextWatcher watcher = new TextWatcher() { private String mBefore;// 用于記錄變化前的文字 private int mCursor;// 用于記錄變化時光標的位置 @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判斷是否輸入之后含有空格,并不是最好的方案 // 理論上應該在onTextChanged中判斷輸入內容 if (s.toString().contains(" ")) { Log.i(TAG, "onTextChanged: 包含空格, 設置" + mBefore); et.removeTextChangedListener(this); et.setText(mBefore); et.addTextChangedListener(this); et.setSelection(mCursor); } } }; et.addTextChangedListener(watcher);
到此這篇關于Android TextWatcher三個回調以及監(jiān)聽EditText的輸入案例詳解的文章就介紹到這了,更多相關Android TextWatcher三個回調以及監(jiān)聽EditText的輸入內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android Studio升級到3.0 Terminal 中文顯示異常解決
本篇文章主要介紹了Android Studio升級到3.0 Terminal 中文顯示異常解決,非常具有實用價值,需要的朋友可以參考下2017-10-10Flutter?+?Idea?環(huán)境搭建及配置教程
本文主要總結我實際搭建的過程,最后發(fā)現不一定按網上那些博客或者官方文檔寫的來也可以搭建成功,在這里小編給大家分享下Flutter?+?Idea?環(huán)境搭建及配置教程,感興趣的朋友參考下吧2021-12-12