一直以为在xml布局文件中对EditText添加 android:maxLength="30";属性是控制EditText字符数的。想当然的以为一个中文占2个字符,一个英文占1个字符。结果的结果当然不是了。

确切的说来android:maxLength="30"是对EditText的字数进行控制的。不管中文还是英文。都是30个字。这下麻烦了,查了整个API就没发现有真正是对字符进行控制的。最后发现只能用自定义的InputFilter来实现。

  1. package com.example.inputfilterdemo;
  2.  
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5.  
  6. import android.app.Activity;
  7. import android.os.Bundle;
  8. import android.text.Editable;
  9. import android.text.InputFilter;
  10. import android.text.Spanned;
  11. import android.text.TextWatcher;
  12. import android.util.Log;
  13. import android.widget.EditText;
  14. import android.widget.TextView;
  15. import android.widget.Toast;
  16.  
  17. /**
  18. *
  19. * ClassName:MainActivity
  20. *
  21. * @author Jerome Song
  22. * @version
  23. * @since Ver 1.1
  24. * @Date 2013 2013-4-4 下午2:55:42
  25. *
  26. * @see
  27. */
  28. public class MainActivity extends Activity {
  29.  
  30. private EditText etTest;
  31.  
  32. @Override
  33. protected void onCreate(Bundle savedInstanceState) {
  34. super.onCreate(savedInstanceState);
  35. setContentView(R.layout.activity_main);
  36. init();
  37. }
  38.  
  39. private void init() {
  40. etTest = (EditText) findViewById(R.id.et_test);
  41. InputFilter[] filters = { new NameLengthFilter(16) };
  42. etTest.setFilters(filters);
  43. }
  44.  
  45. private class NameLengthFilter implements InputFilter {
  46. int MAX_EN;// 最大英文/数字长度 一个汉字算两个字母
  47. String regEx = "[\\u4e00-\\u9fa5]"; // unicode编码,判断是否为汉字
  48.  
  49. public NameLengthFilter(int mAX_EN) {
  50. super();
  51. MAX_EN = mAX_EN;
  52. }
  53.  
  54. @Override
  55. public CharSequence filter(CharSequence source, int start, int end,
  56. Spanned dest, int dstart, int dend) {
  57. int destCount = dest.toString().length()
  58. + getChineseCount(dest.toString());
  59. int sourceCount = source.toString().length()
  60. + getChineseCount(source.toString());
  61. if (destCount + sourceCount > MAX_EN) {
  62. Toast.makeText(MainActivity.this, getString(R.string.count),
  63. Toast.LENGTH_SHORT).show();
  64. return "";
  65.  
  66. } else {
  67. return source;
  68. }
  69. }
  70.  
  71. private int getChineseCount(String str) {
  72. int count = 0;
  73. Pattern p = Pattern.compile(regEx);
  74. Matcher m = p.matcher(str);
  75. while (m.find()) {
  76. for (int i = 0; i <= m.groupCount(); i++) {
  77. count = count + 1;
  78. }
  79. }
  80. return count;
  81. }
  82. }
  83.  
  84. }
  1. /*
  2. * 使用输入过滤器约束用户输入
  3. * (只能输入两个大写字母)
  4. * setFilters方法需要调用一个InputFilter对象数组。
  5. * 本例中将所有输入的小写字母自动转换为大写字母,而且被限定在
  6. * 两个字符
  7. */
  8. EditText text_f = (EditText)findViewById(R.id.editText01);
  9. text_f.setFilters(new InputFilter[]{
  10. new InputFilter.AllCaps(),
  11. new InputFilter.LengthFilter(2)
  12. });

参考链接:http://blog.csdn.net/songzhiyong1121/article/details/8758902

关于EditText的android:maxLength属性的注意事项的更多相关文章

  1. android gravity属性 和 weight属性

    来看这个布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...

  2. 【转】android gravity属性 和 weight属性

    有点忘记这两个属性了,复习一下. 来看这个布局文件 <?xml version="1.0" encoding="utf-8"?> <Linea ...

  3. Android编程 EditView 中如何设置最多可以输入的字符数量 属性 android:ems 与 android:maxLength 的区别

    最近有一个新的感悟,那就是工作的时候千万不要遇到那种特要人无语的领导,很不幸我现在就遇到了这样的一个领导,说是要给领导认识的一个熟人家的孩子写本科毕业设计预算把我给派过去给本科生写毕业设计,这事情的确 ...

  4. Android——edittext的几个属性

    <EditText android:layout_columnSpan="2" android:hint="To" android:layout_grav ...

  5. Android布局属性大全

    RelativeLayout http://wenku.baidu.com/view/2e39724333687e21af45a97e.html?from=related&hasrec=1 h ...

  6. android layout 属性大全

    第一类:属性值为true可false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:la ...

  7. Android TextView属性

    android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all)android:a ...

  8. Android TextEdit属性

    EditText继承关系:View-->TextView-->EditText 去掉边框 将EditText属性设置修改 android:background="@null&qu ...

  9. Android——TextView属性XML详解

    Android_TextView属性XML详解 博客分类: android   属性名称    描述 android:autoLink    设置是否当文本为URL链接/email/电话号码/map时 ...

随机推荐

  1. oracle数据库子查询的结果需要使用多次解决办法

    with c as (select a.trandt,sum(a.tranam) tranam from tran a group by a.trandt )--将子查询抽取出来,以后可以直接用.该方 ...

  2. 【INSERT】逐行提交、批量提交及极限提速方法

    在Oracle数据库中,不是提交越频繁越好.恰恰相反,批量提交可以得到更好的性能.这篇文章给大家简单展示一下在Oracle数据库中逐行提交于批量提交两者之间的性能差别.最后再给出一种可以极大改变性能的 ...

  3. C++11 Thread多线程的学习心得与问题

    C++11 ,封装了thread的多线程的类,这样对多线程的使用更加方便. 多线程的原理我不加赘述,可以参看操作系统等参考书. 多线程代码可以最大化利用计算机性能资源,提高代码的运行效率,是常用优化方 ...

  4. Python学习——集合

    集合 python中的集合和数学上集合具有基本相同的性质,此处不再赘述. 1.创建集合的两种方法 #直接创建 num={1,2,3,4,5} #利用set方法创建 num1=set([1,2,3,4, ...

  5. jetty添加容器容器提供包

    在tomcat的使用中,我们常常会吧容器提供的包放入:TOMCAT_HOME\lib下, 比如mysql-connection-java-version.jar 在使用jetty容器的时候,若要让容器 ...

  6. MySQL导入-导出数据库-mac版

    MySQL导入-导出数据库-mac版 导出数据库-表结构,和数据 mysqldump -u 账号 -p 数据库名 表 > 文件名.sql 例如:mysqldump -u root -p test ...

  7. HDU 1130

    题目大意 给定节点数 , 求通过这么多个节点能得到的二叉树的组成方式 用卡特兰数解决 f[n] = (4*n-2) * f[n-1] / (n+1); 递归不断解决 /** * @(#)Main.ja ...

  8. 线段树题集 (cf版)

    lazy区间修改   : http://acm.hdu.edu.cn/showproblem.php?pid=4902   (hdu4902) http://acm.hdu.edu.cn/showpr ...

  9. jquery ajax报Uncaught TypeError :Illegal invocation

    使用jquery ajax异步提交的时候报Uncaught TypeError :Illegal invocation错误,报错信息如图: 上网查了一下jquery的这个错误,导致这个错误的原因有俩点 ...

  10. jQuery通过event获取点击事件的事件对象

    要想搞明白js的事件机制,必须搞清楚几个概念:事件对象,事件源,还有事件流 事件对象: 当事件发生时会产生事件对象,事件对象的作用是用来记录“事件发生是一些相关的信息.注意事件对象只有在事件发生时才会 ...