Android 優(yōu)雅的實現(xiàn)通用格式化編輯
格式化編輯的需求一般是從編輯手機號開始的,UI 給出的效果不是11個連續(xù)的數(shù)字,而是采用3、4、4的形式,每段中間會空一個字符。在技術(shù)實現(xiàn)的時候,一般會自定義一個控件 TelEditText 實現(xiàn)功能,隨著項目迭代,格式化編輯的需求可能會增加,比如說身份證號、自定義的優(yōu)惠券碼等,這個時候再給每種情況自定義一個控件就沒必要了,通過一個控件實現(xià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)最多進行一次操作,如果后續(xù)還需要操作,放在下一次 afterTextChanged 回調(diào)中進行。
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設(shè)置Padding和Margin(動態(tài)/靜態(tài))的方法實例
如何在java代碼中設(shè)置margin,也就是組件與組件之間的間距,下面這篇文章主要給大家介紹了關(guān)于Android設(shè)置Padding和Margin(動態(tài)/靜態(tài))的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11Flutter 利用CustomScrollView實現(xiàn)滑動效果
我們可以使用ListView將幾個GridView組合在一起實現(xiàn)了不同可滑動組件的粘合,但是這里必須要設(shè)置禁止 GridView 的滑動,防止多個滑動組件的沖突。這種方式寫起來不太方便,事實上 Flutter 提供了 CustomScrollView 來粘合多個滑動組件,并且可以實現(xiàn)更有趣的滑動效果。2021-06-06Android利用碎片fragment實現(xiàn)底部標(biāo)題欄(Github模板開源)
Fragment可以作為Activity的組成部分,一個Activity可以有多個Fragment,這篇文章主要介紹了Android利用碎片fragment實現(xiàn)底部標(biāo)題欄(Github模板開源),需要的朋友可以參考下2019-12-12Android OnCreate()中獲取控件高度與寬度兩種方法詳解
這篇文章主要介紹了Android OnCreate()中獲取控件高度與寬度兩種方法詳解的相關(guān)資料,這里提供了兩種方法,大家可以都看下,需要的朋友可以參考下2016-12-12Android view更改背景資源與padding消失的問題解決辦法
這篇文章主要介紹了Android view更改背景資源與padding消失的問題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04