限定EditText输入个数的解决方案很多,但是一般主要考虑两点,也就是处理两件事:
(1)不同语言字符(英文、中文等)处理方式
(2)输入字符达到数目后,是否仍然允许用户输入

第一点,涉及的东东其实蛮多,不同语言在不同编码中占据字节数等,不同语言在U8等编码的表示范围等,这一整块知识很丰富,

自己暂时没有理的特别顺,稍后整理再说吧。

第二点,目前主流app的处理方案也各有不同,qq5.0以前的版本,发表说说貌似是没有字数限制的(我试了一个350字左右的照样发),

5.0以后限制了,这样如果用户输入字数超过限制便显示负数,但是仍然允许用户输入,就是不能发表了。这样就把处理权全部交给用户了,

其实更省事了!

实现吧。

方法一:
布局中限制。

android:maxLength=10  // 即限制最大输入字符个数为10。

(1)中英文都算一个字符。
(2)字数到,不能输入

方法二:
InputFilter限制,同布局中限制类似。

editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)});

(1)中英文都算一个字符。
(2)字数到,不能输入

方法三:
TextWatcher限制。这里如果字数达到限制仍然允许用户输入的情况不多说,好实现。

crash问题:使用搜狗输入法时,在字数将要或者已经达到限制之后,一次输入大量中文(不按空格,一直打字,知道搜狗的缓存字符达到上限),

crash,stackoverflow 内存溢出。呵呵,百度输入法不会哈。

解决:监听器中动态去除、添加就ok了。见下边方案一

方案一,中文按两个,英文按一个。个数到限制,用户不能输入

private TextWatcher textWatcher = new TextWatcher() {private int editStart;private int editEnd;private int maxLen = 10; // the max byte@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {Log.d(TextChanged, ---->beforeTextChanged : start =  + start +  count =  + count +  after =  + after);}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {editStart = opinion.getSelectionStart();editEnd = opinion.getSelectionEnd();// 先去掉监听器,否则会出现栈溢出opinion.removeTextChangedListener(textWatcher);if (!TextUtils.isEmpty(opinion.getText())) {String etstring = opinion.getText().toString().trim();while (calculateLength(s.toString()) > maxLen) {s.delete(editStart - 1, editEnd);editStart--;editEnd--;Log.d(TextChanged, editStart =  + editStart +  editEnd =  + editEnd);}}opinion.setText(s);opinion.setSelection(editStart);// 恢复监听器opinion.addTextChangedListener(textWatcher);// end by zyf --------------------------}private int calculateLength(String etstring) {char[] ch = etstring.toCharArray();int varlength = 0;for (int i = 0; i < ch.length; i++) {// changed by zyf 0825 , bug 6918,加入中文标点范围 , TODO 标点范围有待具体化if ((ch[i] >= 0x2E80 && ch[i] <= 0xFE4F) || (ch[i] >= 0xA13F && ch[i] <= 0xAA40) || ch[i] >= 0x80) { // 中文字符范围0x4e00 0x9fbbvarlength = varlength + 2;} else {varlength++;}}Log.d(TextChanged, varlength =  + varlength);// 这里也可以使用getBytes,更准确嘛// varlength = etstring.getBytes(CharSet.forName(GBK)).lenght;// 编码根据自己的需求,注意u8中文占3个字节...return varlength;}
};

方案二
// 达到限制字数后,如果在文字中间输入文字或者空格,最后的字符会被删除

titleTv.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {// add by zyf 0825 . 多余的从新输入的位置删除,而不是最后editStart = opinion.getSelectionStart();editEnd = opinion.getSelectionEnd();if (!TextUtils.isEmpty(titleTv.getText())) {int varlength = 0;int size = 0;String etstring = titleTv.getText().toString().trim();char[] ch = etstring.toCharArray();for (int i = 0; i < ch.length; i++) {size++;if (ch[i] >= 0x4e00 && ch[i] <= 0x9fbb) {varlength = varlength + 2;} elsevarlength++;if (varlength > 80) {break;}}if (varlength > 80) {s.delete(size - 1, etstring.length());// add by zyf 0825 . 多余的从新输入的位置删除,而不是最后// s.delete(editStart - 1, editEnd); // crash stackoverflow,解决方法参考上边方案一}}}}); 

转载于:https://www.cnblogs.com/xiaomaohai/p/6158000.html

【移动开发】EditText输入字数限制总结(包括中文输入内存溢出的解决方法)...相关推荐

  1. 开发chrome 插件, background.js中 console log 看不到解决方法

    开发chrome 插件, background.js中 console log 看不到解决方法 参考文章: (1)开发chrome 插件, background.js中 console log 看不到 ...

  2. 安装完Hadoop之后,命令行输入hadoop或hdfs却找不到命令的解决方法

    安装完Hadoop之后,命令行输入hadoop或hdfs却找不到命令的解决方法 参考文章: (1)安装完Hadoop之后,命令行输入hadoop或hdfs却找不到命令的解决方法 (2)https:// ...

  3. 微信开发学习 问题1: 网页授权问题 “该连接无法访问” 解决方法

    微信开发学习 问题1: 网页授权问题 "该连接无法访问" 解决方法 参考文章: (1)微信开发学习 问题1: 网页授权问题 "该连接无法访问" 解决方法 (2) ...

  4. Mac OS 输入adb命令无效(zsh: command not found: adb)的解决方法

    Mac OS 输入adb命令无效(zsh: command not found: adb)的解决方法 出现这个问题大概率是因为Android环境未配置或者未生效,需要配置Android环境变量才能执行 ...

  5. 数据库开发基本操作-安装Sql Server 2005出现“性能监视器计数器要求”错误解决方法...

    今天在安装SQL Server 2005时,出现"性能监视器计数器要求"错误,因为以前出现过这种错误,得到了解决.今天又又出现这种错误,但并不是很清楚当时的解决办法,所以这次把解决 ...

  6. 奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法

    swift关于字符串的推断中 有前导.有后缀 两个方法.竟然没有包括推断. 经过学习找了个简单的解决方法: extension String {func has(v:String)->Bool ...

  7. ubuntu 文本输入源, 找不到中文输入源问题的解决.

    今天开机, 中文输入法(sunpinyin)不起作用了. 昨天还好好的呢. 折腾了一个小时才改好, 下面说说遇到的问题. 问题. sunpinyin 在面板上是存在的,选了它也不出中文输入面板 步骤1 ...

  8. Android开发:APP桌面只显示默认机器人图标的几个解决方法

    在我们进行Android APP的过程中,对于设置桌面图标应该早就信手拈来了吧,我们只要在AndroidMinifest.xml中的application中设置android:icon="& ...

  9. C语言开发日记(4)C语言上手以及一些问题和解决方法3

    目录 一,选择条件的补充 二,案例 三,解析while语句 四,一些常见的错误和解决方法 导言:在初步了解C语言的if条件语句后,我们可以把if条件语句用在一些需要选择的程序编写上:可是,用作选择语句 ...

最新文章

  1. labview 随笔记录
  2. IDEA 打可执行jar包(maven项目)
  3. 开启文件高级共享功能
  4. 再次记录 Visual Studio 2015 CTP 5 的一个坑
  5. Docker 图形界面管理工具 -- Portainer
  6. 基于MUI框架的使用HTML5+实现的二维码扫描功能
  7. learning scala pattern matching 03
  8. VC6.0 Dialog 如何添加 WM_ERASEBACKGROUND 消息
  9. CentOS 5.4安装rar
  10. 本地编译AndroidX源码
  11. 论文笔记:《DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks》
  12. webpack插件之HtmlWebpackPlugin
  13. el-table表格横竖双表头,表头带斜线
  14. 中国大陆开源(Linux)镜像站汇总
  15. 卷积神经网络 CNN 简述
  16. python 02 --python从安装到学习精品网站(廖雪峰官方网站)
  17. unity3d学习路线选哪家?unity3d培训哪家专业?
  18. 微型四轴DIY机架,轻巧稳固耐摔,通用720空心杯电机,9厘米轴距
  19. 新闻管理系统——新闻详情页面+评论模块
  20. Excel2016绘图新功能

热门文章

  1. UI设计:浅议内滚动布局
  2. 2013第四届蓝桥杯Java组省赛题解析
  3. 计算机网络面试题整理
  4. PHP面试题:请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
  5. 下载离线插件包 谷歌浏览器的方法
  6. aix察看根目录各文件和子目录大小,去除文件系统统计
  7. Python Revisited Day 07 (文件处理)
  8. springboot(三):Spring boot中Redis的使用
  9. linux下部署tomcat服务器之安装jdk
  10. 无法加载主类的10中方法