您好,登錄后才能下訂單哦!
這篇“Android開發(fā)EditText禁止輸入監(jiān)聽及InputFilter字符過濾的方法”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android開發(fā)EditText禁止輸入監(jiān)聽及InputFilter字符過濾的方法”文章吧。
setOnEditorActionListener:軟鍵盤回車監(jiān)聽事件
testEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { Log.e("TAG", "onEditorAction: 點(diǎn)擊了回車按鈕"); return false; } });
Kotlin代碼
testEditText.setOnEditorActionListener(OnEditorActionListener { v, actionId, event -> Log.e("TAG", "onEditorAction: 點(diǎn)擊了回車按鈕") false })
addTextChangedListener:文本變化監(jiān)聽事件,里面有三個(gè)回調(diào)函數(shù)
beforeTextChanged(CharSequence s, int start, int count, int after)
參數(shù)一代表輸入的字符,參數(shù)二代表當(dāng)前光標(biāo)所在EditText整個(gè)字符串的位置,參數(shù)三一般為0,參數(shù)四代表一次性輸入了幾個(gè)字符,主要是中文狀態(tài)或直接粘貼上去的字符(數(shù)字或符號或英文都是點(diǎn)擊一個(gè)就顯示上去了,所以該值為1,中文一般都是打幾個(gè)字顯示上去)
onTextChanged(CharSequence s, int start, int before, int count)
基本同上面的說明
afterTextChanged(Editable s)
參數(shù)為修改后的字符
testEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { //參數(shù)1代表輸入的 Log.e("TAG", "beforeTextChanged: 輸入前(內(nèi)容變化前)的監(jiān)聽回調(diào)"+s.toString()+"==="+start+"==="+count+"==="+after); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Log.e("TAG", "beforeTextChanged: 輸入中(內(nèi)容變化中)的監(jiān)聽回調(diào)"+s.toString()+"==="+start+"==="+before+"==="+count); } @Override public void afterTextChanged(Editable s) { Log.e("TAG", "beforeTextChanged: 輸入后(內(nèi)容變化后)的監(jiān)聽回調(diào)"+s.toString()); } });
Kotlin代碼
testEditText.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { //參數(shù)1代表輸入的 Log.e("TAG", "beforeTextChanged: 輸入前(內(nèi)容變化前)的監(jiān)聽回調(diào)$s===$start===$count===$after") } override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { Log.e("TAG", "beforeTextChanged: 輸入中(內(nèi)容變化中)的監(jiān)聽回調(diào)$s===$start===$before===$count") } override fun afterTextChanged(s: Editable) { Log.e("TAG", "beforeTextChanged: 輸入后(內(nèi)容變化后)的監(jiān)聽回調(diào)$s") } })
setOnFocusChangeListener:是否獲取焦點(diǎn)的監(jiān)聽
testEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { Log.e("TAG", "onFocusChange: 是否獲取焦點(diǎn):hasFocus:為true表示獲取焦點(diǎn),為false表示未獲取"); } });
Kotlin代碼
testEditText.setOnFocusChangeListener(OnFocusChangeListener { v, hasFocus -> Log.e("TAG", "onFocusChange: 是否獲取焦點(diǎn):hasFocus:為true表示獲取焦點(diǎn),為false表示未獲取") })
字符過濾在項(xiàng)目中也是經(jīng)常會遇到的業(yè)務(wù)功能(比如限制輸入小數(shù)點(diǎn)后兩位,比如僅限制中文輸入,比如不能輸入特殊字符,再比如WOCAO等敏感詞屏蔽)。
有的同學(xué)要說了,【android:inputType】不就是做這個(gè)的嗎,確實(shí),但是為了兼容大多數(shù)人,必須要有取舍,因此也就有了局限性。
系統(tǒng)內(nèi)置了兩個(gè)過濾:new InputFilter.AllCaps()和new InputFilter.LengthFilter(int max)
AllCaps為全部自動(dòng)轉(zhuǎn)換為大寫,LengthFilter為限制字符長度最大為幾。
我們【Ctrl+左鍵】快捷鍵點(diǎn)進(jìn)去看遠(yuǎn)嗎,他們是繼承的【InputFilter】,所以我們也能繼承繼而實(shí)現(xiàn)自己的過濾規(guī)則。
InputFilter custemInputFiter = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { //source 新輸入的字符串 //start 新輸入的字符串起始下標(biāo),一般為0 //end 新輸入的字符串終點(diǎn)下標(biāo),一般為source長度-1 //dest 輸入之前文本框內(nèi)容 //dstart 原內(nèi)容起始坐標(biāo),一般為0 //dend 原內(nèi)容終點(diǎn)坐標(biāo),一般為dest長度-1 if (source.toString().equals("芝麻粒兒")) { //此示例:輸入的如果是【芝麻粒兒】,則直接返回null,頁面上表現(xiàn)為不顯示 return null; } Log.e("TAG", "filter: 自定義的過濾規(guī)則"); return null; } }; //傳遞的參數(shù)是數(shù)組,也就是可以有多個(gè)過濾規(guī)則 testEditText.setFilters(new InputFilter[]{ custemInputFiter, new InputFilter.LengthFilter(6), new InputFilter.AllCaps()});
Kotlin代碼
val custemInputFiter = InputFilter { source, start, end, dest, dstart, dend -> //source 新輸入的字符串 //start 新輸入的字符串起始下標(biāo),一般為0 //end 新輸入的字符串終點(diǎn)下標(biāo),一般為source長度-1 //dest 輸入之前文本框內(nèi)容 //dstart 原內(nèi)容起始坐標(biāo),一般為0 //dend 原內(nèi)容終點(diǎn)坐標(biāo),一般為dest長度-1 if (source.toString() == "芝麻粒兒") { //此示例:輸入的如果是【芝麻粒兒】,則直接返回null,頁面上表現(xiàn)為不顯示 return@InputFilter null } Log.e("TAG", "filter: 自定義的過濾規(guī)則") null } //傳遞的參數(shù)是數(shù)組,也就是可以有多個(gè)過濾規(guī)則 testEditText.setFilters( arrayOf( custemInputFiter, LengthFilter(6), AllCaps() ) )
以上就是關(guān)于“Android開發(fā)EditText禁止輸入監(jiān)聽及InputFilter字符過濾的方法”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。