Android 实现限制EditText输入文字的数量

前段时间比较忙 没来的及时分享出来.需求是这样的要求用户只能输入12个字符或者6位中文的数据:作为一个菜鸟遇到这样的问题第一反应就是 Android:maxLength="12"这么个属性然而去测试发现中文也是十二个的瞬间被上司叫过去就是一顿说。没办法还得改方法可是作为菜鸟的我只知道这一个方法;只能去百度了打开百度以后发现大部分方法都是一样都是用editText.addTextChangedListener()这个方法处理的;可是作为菜鸟的我对于这方法还是不熟悉于是运行过程中出现了各种问题。。几近周折还是没解决,时间实在赶没办法换个方法于是找到了这个方式editText.setFilters( new InputFilter[]{new InputFilter.LengthFilter(MAX_LENGTH) });一开始也是一对问题直到在http://www.android100.org/html/201406/03/16568.html网站找到了这么个方法

InputFilter filter = new InputFilter() { 
public CharSequence filter(CharSequence source, int start, int end, 
Spanned dest, int dstart, int dend) { 
            for (int i = start; i < end; i++) { 
                    if ( !Character.isLetterOrDigit(source.charAt(i)) && !Character.toString(source.charAt(i)) .equals("_") && !Character.toString(source.charAt(i)) .equals("-")) { 
                            return ""; 
                    } 
            } 
            return null; 
    } 
}; 
但是看不懂也不知道是什么意思啊一开始没有管。。问题没解决找了个大牛询问最终得到了结果如下:
// 这个方法,返回空字符串,就代表匹配不成功,返回null代表匹配成功
public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) 经过大牛的提点算是奔着完成任务写代码的方式实现了最终的需求代码如下:
    mEditText.setFilters(new InputFilter[]{new InputFilter() {
            // 这个方法,返回空字符串,就代表匹配不成功,返回null代表匹配成功
            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend) {
                // 获取字符个数(一个中文算2个字符)
                if (getTextLength(dest.toString())
                        + getTextLength(source.toString()) >= MAX_LENGTH) {
                    return "";
                }
                return null;
            }
        }});

 getTextLength(String text);方法

 /**
     * 获取字符数量 汉字占2个,英文占一个
     *
     * @param text
     * @return
     */
    public static double getTextLength(String text) {
        double length = 0;
        for (int i = 0; i < text.length(); i++) {
       // text.charAt(i)获取当前字符是的chart值跟具ASCII对应关系255以前的都是英文或者符号之等而中文并不在这里面所以此方法可行</span>
         if (text.charAt(i) > 255) {
                length += 2;
            } else {
                length++;
            }
        }
        return length;
    }        

 

 

 

[html]  view plain  copy
 
 print ?
  1. mEditText.setFilters(new InputFilter[]{new InputFilter() {  
  2.             // 这个方法,返回空字符串,就代表匹配不成功,返回null代表匹配成功  
  3.             @Override  
  4.             public CharSequence filter(CharSequence source, int start, int end,  
  5.                                        Spanned dest, int dstart, int dend) {  
  6.                 // 获取字符个数(一个中文算2个字符)  
  7.                 if (getTextLength(dest.toString())  
  8.                         + getTextLength(source.toString()) >= MAX_LENGTH) {  
  9.                     return "";  
  10.                 }  
  11.                 return null;  
  12.             }  
  13.         }});  
 
     
 getTextLength(String text);方法
[html]  view plain  copy
 
 print ?
  1. /**  
  2.     * 获取字符数量 汉字占2个,英文占一个  
  3.     *  
  4.     * @param text  
  5.     * @return  
  6.     */  
  7.    public static double getTextLength(String text) {  
  8.        double length = 0;  
  9.        for (int i = 0; i < text.length(); i++) {  
[html]  view plain  copy
 
 print ?
  1. <span style="white-space:pre">    </span>//<span style="font-family: 'Microsoft YaHei', 微软雅黑, 'Microsoft JhengHei', 华文细黑, STHeiti, MingLiu;">text.charAt(i)获取当前字符是的chart值跟具ASCII对应关系255以前的都是英文或者符号之等而中文并不在这里面所以此方法可行</span>  
  2.          if (text.charAt(i) > 255) {  
  3.                 length += 2;  
  4.             } else {  
  5.                 length++;  
  6.             }  
  7.         }  
  8.         return length;  
  9.     }  
代码还有进步的空间有什么问题请及时提出

 

 
0
 
0
 
 
 

我的同类文章

 

参考知识库

img

Android知识库

20802关注|1808收录

猜你在找
查看评论

  暂无评论

 
 
发表评论
  • 用 户 名:
  • firelightdragon
  • 评论内容:
  • 插入代码
  •   
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
 
 
 
 
  • 0
    点赞
  • 0
    收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值