Android限制輸入框 4 個中文字符(漢字/Emoji)或 12 個英文字符(字母/數(shù)字)
遇到的問題
昨天產(chǎn)品提出的一個Bug,用戶姓名需要添加長度限制,但對中、英文的限制要求又不一致,所以就不能只用字符串的長度去判斷了。

bug
解題思路
不管是中文還是英文字符,在編譯的時候,最終都會被計算機(jī)轉(zhuǎn)成二進(jìn)制編碼,所以我們的解題思路就是以 Byte 字節(jié)為核心,在 UTF-8 編碼下,將中英文字符轉(zhuǎn)成 Byte 數(shù)組,再計算 Byte 數(shù)組所占的空間大小,在輸入框的攔截器中進(jìn)行比較,實現(xiàn)攔截效果。
實現(xiàn)方式
1. 不同的編碼,中英字符比值不同,可以根據(jù)自己的需求去選擇
private val Charset_UTF = StandardCharsets.UTF_8; //中英字符比值1:3
private val charset_GB = Charset.forName("GB2312") //中英字符比值1:2
我們的需求:中英字符比值是1:3,所以我選擇了UTF-8編碼
查看中英文字符比值,可以在記事本中查看
在這里插入圖片描述
在這里插入圖片描述
2. 過濾器源碼
/**
* Desc 輸入框過濾器
* Author ZY
* Date 2021/3/24 16:17
*/
object InputFilter {
private val Charset = StandardCharsets.UTF_8;
/**
* 保留布局內(nèi)部的過濾條件
*/
private fun addFilter(editText: EditText, filter: InputFilter) {
val mFilters = arrayOfNulls<InputFilter>(editText.filters.size + 1)
editText.filters.forEachIndexed<InputFilter?> { i: Int, inputFilter: InputFilter? ->
if (inputFilter != null) {
mFilters[i] = inputFilter
}
}
mFilters[editText.filters.size] = filter
editText.filters = mFilters
}
/**
* 長度過濾器
*/
fun lengthFilter(editText: EditText, maxLen: Int) {
val lengthFilter = InputFilter { source, _, _, _, _, _ ->
val oldLen = editText.text.toString().toByteArray(charset)
val len: ByteArray = source.toString().toByteArray(charset)
if ((oldLen.size + len.size) > maxLen) {
return@InputFilter ""
}
return@InputFilter null
}
addFilter(editText, lengthFilter)
}
}
3. 調(diào)用代碼
InputFilter.lengthFilter(et_input, 12)
4. 效果展示
純中文:最多輸入四個中文字符

純中文輸入
英文或數(shù)字:最多輸入12個英文字符或數(shù)字

英文數(shù)字輸入
中英文字符混合輸入:總的字符長度不超過12個,1個中文字符 = 3個英文字符

中英數(shù)字混合輸入