Android EditText输入字数限制总结(包括中文输入内存溢出的解决方法)
来源:互联网 发布:淘宝怎么看别人的销量 编辑:程序博客网 时间:2024/06/11 17:53
转载请注明,大飞:http://blog.csdn.net/rflyee/article/details/38856539
(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 内存溢出。呵呵,百度输入法不会哈。
方案一,中文按两个,英文按一个。个数到限制,用户不能输入
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;}};
补加:
其实在字符超出的情况下不一个一个删,而是将多余字符一次性全删掉,即可避免内存溢出的问题,如以下方式。(暂未在afterTextChanged处理验证,可自行尝试,后续补上)。方案二同理,只不过处理截取方式不同罢了。(注:中英字符问题如以上方案自行处理)
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String str = s.toString();
if (length > maxNum) {
ToastUtil.show(mContext, "超出字数限制!");
str = str.substring(0, maxNum);
etContent.setText(str);
etContent.setSelection(str.length());
}
}
方案二
// 达到限制字数后,如果在文字中间输入文字或者空格,最后的字符会被删除
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,解决方法参考上边方案一}}}});
转载请注明,大飞:http://blog.csdn.net/rflyee/article/details/38856539
2 0
- Android EditText输入字数限制总结(包括中文输入内存溢出的解决方法)
- 【移动开发】EditText输入字数限制总结(包括中文输入内存溢出的解决方法)
- android EditText限制输入字数的方法
- android EditText限制输入的字数
- Android中EditText的输入字数限制
- Android EditText 限制输入的字数
- Android editText 输入字数限制
- android editText 输入字数限制
- Android editText 输入字数限制
- Android editText 输入字数限制
- android editText 输入字数限制
- Android EditText限制输入字数
- android EditText输入字数限制
- 限制EditText的输入字数
- 修改Android EditText光标,限制EditText的输入字数
- EditText限制输入字数
- 限制EditText输入字数
- EditText 字数限制输入
- Armadillo sparse matrix get the index of an element
- C# jmail收取邮件(带附件)
- NYOJ-整除个数(水题)
- 游戏中的常用术语
- 关注健康橱柜请选择环保陶瓷橱柜、水泥橱柜、瓷砖橱柜
- Android EditText输入字数限制总结(包括中文输入内存溢出的解决方法)
- 万物鼻祖Object和Java异常
- viewpager自动循环滑动和手动滑动(手动滑动后自动滑动延后处理)
- vs2013 激活
- 手机评测怎么看?
- 享元模式
- KMP字符串模式匹配详解
- Jboss eap 6.1 用户配置与登录管理控制台备忘
- MVC Log4net