TextWatcher使用
TextWatcher作用為監測鍵盤輸入并根據輸入內容展示不同顯示效果
接口分析(按回調順序)
其中有4個參數:
* CharSequence s:文本改變之前的內容
* int start : 被替換文本區域起點位置
* int count:將被替換的文本區域字符數目
* int after:替換后的文本字符數目
文本 s 中的 start 位置之后的 count 個字符將被替換為 after 個新的字符
注:s為替換前的文本
2. 文本改變時
其中有4個參數:
CharSequence s:文本改變之后的內容
int start : 被替換文本區域起點位置,setText時是替換所有內容,此時數值為0
int before:被替換之前的文本區域字符數目
int count:替換后的文本字符數目
文本 s 中的 start 位置之后的 before 個字符已經被替換為 count 個新的字符
注:s為替換后的新文本
3. 文本改變后
其中有1個參數:
Editable s:文本改變之后的內容
TextWatcher使用
//所有繼承自TextView的類textView.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void afterTextChanged(Editable s) {}});注意事項 :
在回調方法中獲取的新字符串雖然已經設置到TextView中,但是還未在UI界面中更新.
重要 :
經網上查閱,幾乎沒有人提到過回調方法過程中UI是否已經更新數據,而筆者比較在意是否處理數據導致頁面閃爍.
發現有人已經注意到這一點,其情景為短時間內多次觸發回調,但是頁面只顯示了最后一次數據結果,而評論中卻歸結為處理速度快導致分辨不出閃爍.
筆者在回調方法中加入延時,而UI更新時間為3個回調方法結束后.判斷為只有在數據處理完畢后才會顯示在UI上.
如若判斷失誤歡迎大家指正有2種情況會觸發TextWatcher的3個回調方法,setText()和EditText鍵盤輸入
- 如果在回調方法中調用setText(),會進入無限循環,需要增加判斷條件
- afterTextChanged中去改變Editable s的值會觸發TextWatcher的3個回調方法,會進入無限循環,需要增加判斷條件
- Editable s和CharSequence s獲取的數據為去除空格和回車之后字符串.
應用場景
InputFilter過濾
InputFilter是系統提供的一個接口,是一個過濾器,修改傳入的字符串,返回值類型為CharSequence.
自定義InputFilter
public class mInputFilter implements InputFilter {@Overridepublic CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) {return null;} }可以看到只需要實現filter()方法,而方法會傳入6個參數,下面詳細解釋每個參數的含義
CharSequence source 用來替換的新的字符串,包括鍵盤輸入/setText()/粘貼的內容
int start source的起始位置
int end source的結束位置
以上3個參數描述出用來替換的新的字符串
Spanned dest 修改前的字符串,setText()時dest為EMPTY_SPANNED,添加或修改時為輸入框內的文本內容
int dstart dest選中范圍的起始位置
int dend dest選中范圍的結束位置
設置過濾器,inputFilters為InputFilter 數組.
注意事項
根據源碼得知,當返回值為null時,不對輸入數據進行任何過濾操作,數據不變
總結
以上是生活随笔為你收集整理的TextWatcher使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片机c语言串口中断函数,12手把手教你
- 下一篇: [css] 用CSS实现tab切换