【移动开发】EditText输入字数限制总结(包括中文输入内存溢出的解决方法)
限定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
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d(TextChanged, ---->beforeTextChanged : start = + start + count = + count + after = + after);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public 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 0x9fbb
varlength = 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() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public 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;
} else
varlength++;
if (varlength > 80) {
break;
}
}
if (varlength > 80) {
s.delete(size - 1, etstring.length());
// add by zyf 0825 . 多余的从新输入的位置删除,而不是最后
// s.delete(editStart - 1, editEnd); // crash stackoverflow,解决方法参考上边方案一
}
}
}
});
【移动开发】EditText输入字数限制总结(包括中文输入内存溢出的解决方法)的更多相关文章
- Android EditText输入字数限制总结(包含中文输入内存溢出的解决方法)
转载请注明,大飞:http://blog.csdn.net/rflyee/article/details/38856539 限定EditText输入个数的解决方式非常多,可是一般主要考虑两点.也就是处 ...
- “ASP.default_aspx”并不包括“DropDownList1_SelectedIndexChanged”的定义,其解决方法。
"ASP.default_aspx"并不包括"DropDownList1_SelectedIndexChanged"的定义,其解决方法. 在使用DropDown ...
- idea开发工具下报Set language level to 6-@Override in interfaces的解决方法
idea开发工具下报Set language level to 6-@Override in interfaces的解决方法 实现接口时报如下错误:Set language level to 6-@O ...
- SAP无输入历史记录(已在本地数据开启历史记录)解决方法
SAP客户端已开启本地数据的历史记录,但是仍然没有录入记录,重装SAP无法解决问题,没有最近输入记录操作极为不方便,经研究表现出的问题特征如下:1.同一用户在另一台电脑使用SAP就有历史记录,到了本电 ...
- ios设备触发虚拟键盘输入后position:fixed 无效的一些简单另类的解决方法。
首先看一下我要解决的问题,第一张图是正常的情况下,第二张图是点击了输入框之后的情况,就是要解决此问题~! 百度了一下解决方法,好像有以下的一些方法: 1. iscroll 2. Jquery Mobi ...
- 奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法
swift关于字符串的推断中 有前导.有后缀 两个方法.竟然没有包括推断. 经过学习找了个简单的解决方法: extension String { func has(v:String)->Bool ...
- js动态显示可输入字数并提示还可以输入的字数
动态显示可输入的字数提示还可以输入的字数. 代码: <input name="title" type="text" size="50" ...
- JS 限制input框的输入字数,并提示可输入字数
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 【分享】4412开发板POP烧写ubuntu出错,如何挂载emmc分区解决方法
本文转自:http://bbs.topeetboard.com 平台:4412精英版系统:ubuntu系统 按照教程烧写ubuntu文件系统,TF卡和EMMC分区都完成(总之之前的操作试了几遍都是没问 ...
随机推荐
- ●BZOJ 1499 [NOI2005]瑰丽华尔兹
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1499 题解: 单调队列优化DP 定义 dp[t][x][y] 表示第t个时间段之后,处在(x ...
- ●BZOJ 3931 [CQOI2015]网络吞吐量
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3931 题解: 在最短路图上跑网络流,要开long long(无奈 BZOJ AC 不了,洛谷 ...
- NOIP 2015
Prob.1 2015 神奇的幻方 模拟就好了.(这不是noip2017的初赛题么.)代码: #include<cstdio> #include<cstring> #inclu ...
- 【无语凝噎(wordless)】
·题目: 西施与范蠡泛舟而去……不对,场景不对,咳咳.在甄嬛前往蓬莱洲之前,她与皇上在碧桐书院告别.为了这可能会长达数月的离别,两个人都似乎有很多话要对对方说,却都无语凝噎.这时,皇上 ...
- bzoj2434阿狸的自动机
转载自 http://www.cnblogs.com/zj75211/p/6934976.html ●BZOJ 2434: [Noi2011]阿狸的打字机 ●赘述题目 (题意就不赘述了) ●解法: ...
- 基于 HTML5 的 WebGL 3D 智能楼宇监控系统
前言 智能监控的领域已经涉及到了各大领域,工控.电信.电力.轨道交通.航天航空等等,为了减少人员的消耗,监控系统必不可少.之前我写过一篇 2D 的智能地铁监控系统广受好评,突然觉得,既然 2D 的这么 ...
- 运行C++程序是出现错误:cannot open Debug/1.exe for writing
今天,打开VC6.0环境编了个小程序,谁知给我报了“cannot open Debug/1.exe for writing”这样一个错,然后,我就纳闷了,这是什么错丫? 想了半天,后想通,为什么会这样 ...
- 面试题2:实现Singleton模式
题目:设计一个类,我们只能生成该类的一个实例.
- 9.QT-标准对话框
Qt提供的可复用的标准对话框,全部继承自QDialog类,如下图所示: QMessageBox:信息对话框,用于显示信息.询问问题等: QFileDialog:文件对话框 QColorDialog:颜 ...
- 4月18开始看《C++Primer Plus》
好久没有写博客了,之前也说过水平有限,也写不出什么技术博客,只能写些感悟. 过年之后,陆续做了2.3个项目,刚开始可能不太熟悉流程,怎么和页面传数据?最近一个项目1/2天就写完代码了,真的很简单,主要 ...