EditText中文英文长度限制

如果将EditText的输入长度设置为N个字符,则有如下两种方式:
1.在xml布局文件中对EditText添加 android:maxLength=“N”,比如;

 <EditText
        android:id="@+id/et_test"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:maxLength="16" />

2.代码添加:

//java写法
InputFilter[] filters = { new InputFilter.LengthFilter(16) };
editText.setFilters(filters);

//kotlin写法
 editText.filters = arrayOf<InputFilter>(LengthFilter(16))

如果只限制字符长度,那上面两种方式则可满足要求,但项目开发中往往会出现这种需求,比如英文字母最多N个,而中文最多N/2个,那么直接用LengthFilter就无法实现要求,但是我们可以通过自定义InputFilter实现:

kotlin实现:

object EditTextFilter {
  fun setChineseLimit(editText: EditText,maxLength:Int){
        //限制问题内容输入字符长度
        val inputFilter = InputFilter { source, start, end, dest, dstart, dend ->
            val destCount: Int = (dest.toString().length
                    + getChineseCount(dest.toString()))
            val sourceCount: Int = (source.toString().length
                    + getChineseCount(source.toString()))
            return@InputFilter if (destCount + sourceCount > maxLength) {
               Toast.makeText(MainActivity.this,"最多可以输入N/2个中文或者N个英文字母、数字",Toast.LENGTH_SHORT).show()
                ""
            } else {
                source
            }
        }
        editText.filters = arrayOf(inputFilter)
    }

 /**
     * 计算中文的长度
     */
    fun getChineseCount(str: String): Int {
        val regEx = "[\\u4e00-\\u9fa5]" // unicode编码,判断是否为汉字
        var count = 0
        val p: Pattern = Pattern.compile(regEx)
        val m: Matcher = p.matcher(str)
        while (m.find()) {
            for (i in 0..m.groupCount()) {
                count += 1
            }
        }
        return count
    }
}

Java实现:

public class EditTextFilter {
    public void setChineseLimit(EditText editText, int maxLength) {
        InputFilter inputFilter = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                int destCount = dest.toString().length()
                        + getChineseCount(dest.toString());
                int sourceCount = source.toString().length()
                        + getChineseCount(source.toString());
                if (destCount + sourceCount > maxLength) {
                    Toast.makeText(MainActivity.this, "最多可以输入N/2个中文或者N个英文字母、数字", Toast.LENGTH_SHORT).show();
                    return "";

                } else {
                    return source;
                }
            }
        };
       editText.setFilters(new InputFilter[]{inputFilter});
    }

    private int getChineseCount(String str) {
        String regEx = "[\\u4e00-\\u9fa5]"; // unicode编码,判断是否为汉字
        int count = 0;
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        while (m.find()) {
            for (int i = 0; i <= m.groupCount(); i++) {
                count = count + 1;
            }
        }
        return count;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值