关于EditText的android:maxLength属性的注意事项
一直以为在xml布局文件中对EditText添加 android:maxLength="30";属性是控制EditText字符数的。想当然的以为一个中文占2个字符,一个英文占1个字符。结果的结果当然不是了。
确切的说来android:maxLength="30"是对EditText的字数进行控制的。不管中文还是英文。都是30个字。这下麻烦了,查了整个API就没发现有真正是对字符进行控制的。最后发现只能用自定义的InputFilter来实现。
package com.example.inputfilterdemo; import java.util.regex.Matcher;
import java.util.regex.Pattern; import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; /**
*
* ClassName:MainActivity
*
* @author Jerome Song
* @version
* @since Ver 1.1
* @Date 2013 2013-4-4 下午2:55:42
*
* @see
*/
public class MainActivity extends Activity { private EditText etTest; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
} private void init() {
etTest = (EditText) findViewById(R.id.et_test);
InputFilter[] filters = { new NameLengthFilter(16) };
etTest.setFilters(filters);
} private class NameLengthFilter implements InputFilter {
int MAX_EN;// 最大英文/数字长度 一个汉字算两个字母
String regEx = "[\\u4e00-\\u9fa5]"; // unicode编码,判断是否为汉字 public NameLengthFilter(int mAX_EN) {
super();
MAX_EN = mAX_EN;
} @Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
int destCount = dest.toString().length()
+ getChineseCount(dest.toString());
int sourceCount = source.toString().length()
+ getChineseCount(source.toString());
if (destCount + sourceCount > MAX_EN) {
Toast.makeText(MainActivity.this, getString(R.string.count),
Toast.LENGTH_SHORT).show();
return ""; } else {
return source;
}
} private int getChineseCount(String str) {
int count = 0;
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
while (m.find()) {
for (int i = 0; i <= m.groupCount(); i++) {
count = count + 1;
}
}
return count;
}
} }
/*
* 使用输入过滤器约束用户输入
* (只能输入两个大写字母)
* setFilters方法需要调用一个InputFilter对象数组。
* 本例中将所有输入的小写字母自动转换为大写字母,而且被限定在
* 两个字符
*/
EditText text_f = (EditText)findViewById(R.id.editText01);
text_f.setFilters(new InputFilter[]{
new InputFilter.AllCaps(),
new InputFilter.LengthFilter(2)
});
参考链接:http://blog.csdn.net/songzhiyong1121/article/details/8758902
关于EditText的android:maxLength属性的注意事项的更多相关文章
- android gravity属性 和 weight属性
来看这个布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...
- 【转】android gravity属性 和 weight属性
有点忘记这两个属性了,复习一下. 来看这个布局文件 <?xml version="1.0" encoding="utf-8"?> <Linea ...
- Android编程 EditView 中如何设置最多可以输入的字符数量 属性 android:ems 与 android:maxLength 的区别
最近有一个新的感悟,那就是工作的时候千万不要遇到那种特要人无语的领导,很不幸我现在就遇到了这样的一个领导,说是要给领导认识的一个熟人家的孩子写本科毕业设计预算把我给派过去给本科生写毕业设计,这事情的确 ...
- Android——edittext的几个属性
<EditText android:layout_columnSpan="2" android:hint="To" android:layout_grav ...
- Android布局属性大全
RelativeLayout http://wenku.baidu.com/view/2e39724333687e21af45a97e.html?from=related&hasrec=1 h ...
- android layout 属性大全
第一类:属性值为true可false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android:la ...
- Android TextView属性
android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all)android:a ...
- Android TextEdit属性
EditText继承关系:View-->TextView-->EditText 去掉边框 将EditText属性设置修改 android:background="@null&qu ...
- Android——TextView属性XML详解
Android_TextView属性XML详解 博客分类: android 属性名称 描述 android:autoLink 设置是否当文本为URL链接/email/电话号码/map时 ...
随机推荐
- 解决vue项目运行过程中,npm run dev 报错问题
[方案1] 错误如下: npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! travel@1.0.0 dev: `webpack-dev-server ...
- Java之希尔排序
希尔排序 前面已经知道了插入排序,明白插入排序的原理,不断比较来交换相邻的元素,这样的话效率不高,为此希尔排序,在插入排序上做出了改进,通过间隔增量来比较并交换元素,这样可以减少比较交换的次数. pa ...
- IOS上MediaPlayer framework实现视频播放
播放电影文件: iOS sdk中可以使用MPMoviePlayerController来播放电影文件.但是在iOS设备上播放电影文件有严格的格式要求,只能播放下面两个格式的电影文件. • H.264 ...
- UVA - 208 Firetruck(并查集+dfs)
题目: 给出一个结点d和一个无向图中所有的边,按字典序输出这个无向图中所有从1到d的路径. 思路: 1.看到紫书上的提示,如果不预先判断结点1是否能直接到达结点d,上来就直接dfs搜索的话会超时,于是 ...
- Linux 安装 MySQL 详解(rpm 包)
说明:Linux 系统中软件的安装在 root 用户下进行,此安装方式为 rpm 包方式,安装的版本为:MySQL-5.6.25-1.linux_glibc2.5.x86_64.rpm-bundle. ...
- linux(Ubuntu16)下切换python2和python3(转)
采用update-alternatives 切换版本 1.打开终端:Ctrl+Alt+T 2.查看update-alternatives的帮助信息:update-alternatives --help ...
- ssh中将常用的命令做别名
1.vim ~/.bashrc 将光标落到user下面 2. 输入 alias x=‘ssh的命令’ 3.按ESC键,退出输入状态: 4.按:,然后输入wq,保存退出: 5. source ~/.ba ...
- led1,1s取反,led2计数10次取反
1 //利用定时器0 1s,led1取反,利用计数器1,跳10,取反 #include<reg52.h> #define uchar unsigned char #define uint ...
- BZOJ 2806 Luogu P4022 [CTSC2012]Cheat (广义后缀自动机、DP、二分、单调队列)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2806 (luogu) https://www.luogu.org/pro ...
- RabbitMQ-linux安装rabbitmq(二)
说明 本地装了个虚拟机模拟集群 所以记下安装步骤 安装Erlang 安装类库 yum -y install ncurses-devel yum -y install openssl-devel yum ...