Android 優(yōu)雅的實現(xiàn)通用格式化編輯
格式化編輯的需求一般是從編輯手機號開始的,UI 給出的效果不是11個連續(xù)的數(shù)字,而是采用3、4、4的形式,每段中間會空一個字符。在技術(shù)實現(xiàn)的時候,一般會自定義一個控件 TelEditText 實現(xiàn)功能,隨著項目迭代,格式化編輯的需求可能會增加,比如說身份證號、自定義的優(yōu)惠券碼等,這個時候再給每種情況自定義一個控件就沒必要了,通過一個控件實現(xiàn)多種格式化編輯需求是更好的方案。
其實還可以更進(jìn)一步,格式化編輯的核心邏輯就是給 EditText 添加一個 TextWatcher,通過 TextWatcher 中的文本變化回調(diào)來調(diào)整 EditText 中的文本,所以自定義 EditText 并不是必須的,對于開發(fā)者需要調(diào)用的字段和方法,可以通過擴展函數(shù)的方式提供。
使用
格式化編輯手機號
布局:
<androidx.appcompat.widget.AppCompatEditText android:id="@+id/etPhone" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" />
代碼:
// format is ' ' etPhone.setFormatRules(3, 4, 4) // format is '-' etPhone.setFormatRules(3, 4, 4, formatChar = '-')

格式化編輯身份證號
布局:
<androidx.appcompat.widget.AppCompatEditText android:id="@+id/etIDNumber" android:layout_width="match_parent" android:layout_height="wrap_content" android:digits="@string/digits_id_number"/>
資源:
<string name="digits_id_number">0123456789xX</string>
代碼:
etIDNumber.setFormatRules(6, 4, 4, 4)

設(shè)置監(jiān)聽
etPhone.setOnFormatEditListener { isComplete, text ->
if (isComplete) { // 編輯完成
// 使用 toast 顯示移除格式化的文本
Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}
}
移除格式化的文本
etPhone.textWithFormatRemoved
實現(xiàn)原理
自定義一個 TextWatcher,定義一個字段 formatChar,值為格式化字符,默認(rèn)是空格。定義一個字段 formatCharIndexList,值為 EditText 文本中格式化字符所在位置的列表,比如對于格式化編輯手機號, formatCharIndexList 中的值為 [3, 8],既在 EditText 文本中格式化字符的位置應(yīng)該是3和8。
var formatChar: Char = ' ' val formatCharIndexList = ArrayList<Int>()
EditText 文本發(fā)生變化后,如果 EditText 文本的最后一個字符為格式化字符,則刪除最后一個字符;然后遍歷 EditText 文本中的每一個字符,如果該字符的位置等于格式化字符位置但不是格式化字符,則在該位置插入一個格式化字符,如果該字符的位置不等于格式化字符的位置但又是格式化字符,則刪除該格式化字符。
調(diào)用 insertFormatChar 或者 deleteChar 后,afterTextChanged 又會立即回調(diào)一次,可能會引起多次添加或刪除,導(dǎo)致格式化錯誤。所以每次 afterTextChanged 回調(diào)最多進(jìn)行一次操作,如果后續(xù)還需要操作,放在下一次 afterTextChanged 回調(diào)中進(jìn)行。
override fun afterTextChanged(s: Editable?) {
val value = s?.toString() ?: return
if (value.isEmpty()) return
if (value.last() == formatChar) {
deleteChar(s, value.lastIndex)
return
}
value.forEachIndexed { index, c ->
if (formatCharIndexList.contains(index)) {
if (c != formatChar) {
insertFormatChar(s, index)
return
}
} else {
if (c == formatChar) {
deleteChar(s, index)
return
}
}
}
...
}
項目地址
format-edit,覺得用起來很爽的,請不要吝嗇你的 Star !
以上就是Android 優(yōu)雅的實現(xiàn)通用格式化編輯的詳細(xì)內(nèi)容,更多關(guān)于Android 通用格式化編輯的資料請關(guān)注腳本之家其它相關(guān)文章!
- AndroidStudio修改Code Style來格式化自定義標(biāo)簽的xml文件方式
- 解決Android Studio 格式化 Format代碼快捷鍵問題
- 解決Android Studio xml 格式化不自動換行的問題
- Android Studio實現(xiàn)格式化XML代碼順序
- AndroidStudio 設(shè)置格式化斷行寬度教程
- Android Studio 3.5格式化布局代碼時錯位、錯亂bug的解決
- Android studio kotlin代碼格式化操作
- 解決Android Studio 格式化快捷鍵和QQ 鎖鍵盤快捷鍵沖突問題
- Android 國際貨幣格式化的示例代碼
- Android中使用 AutoCompleteTextView 實現(xiàn)手機號格式化附帶清空歷史的操作
- Android實現(xiàn)的數(shù)字格式化用法示例
相關(guān)文章
Android開發(fā)高級組件之自動完成文本框(AutoCompleteTextView)用法示例【附源碼下載】
這篇文章主要介紹了Android開發(fā)高級組件之自動完成文本框(AutoCompleteTextView)用法,簡單描述了自動完成文本框的功能并結(jié)合實例形式分析了Android實現(xiàn)自動完成文本框功能的具體步驟與相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2018-01-01
Android 關(guān)于ExpandableListView刷新問題的解決方法
下面小編就為大家?guī)硪黄狝ndroid 關(guān)于ExpandableListView刷新問題的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Android 實現(xiàn)可任意拖動的懸浮窗功能(類似懸浮球)
這篇文章主要介紹了Android 可任意拖動的懸浮窗(類似懸浮球),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
android中ProgressDialog與ProgressBar的使用詳解
本篇文章是對android中ProgressDialog與ProgressBar的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
android AsynTask處理返回數(shù)據(jù)和AsynTask使用get,post請求
本文主要介紹了android AsynTask處理返回數(shù)據(jù)和AsynTask使用get,post請求方法。具有一定的參考價值,下面跟著小編一起來看下吧2017-01-01
修改Android Studio 的 Logcat 緩沖區(qū)大小操作
這篇文章主要介紹了修改Android Studio 的 Logcat 緩沖區(qū)大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04

