Android 丨 限制輸入框4個中文字符或12個英文字符

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ù)字混合輸入
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容