关于 android 中 edittext 特殊字符过滤和字符长度限制的最优方法

1985 T.于星期四, 07/03/2013 - 20:36提交

在android开发中,经常会碰到edittext中特殊字符过滤和字符长度限制同时要求的问题,由于android不同版本之间的兼容问题,以及各种手机支持情况不同,因此,经常会出现一些设备上面不兼容问题。为了解决这个问题,这里经过实践总结,给出一个最优的方案:

首先,对于字符长度的限制我们可以使用3种方法,如下:

1,使用EditText的setFilter方法实现,代码如下:

定义EditText对象mEditText;

字符限制长度int MAX_TEXT_INPUT_LENGTH;

mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_TEXT_INPUT_LENGTH)});

这种方法只能限制固定长度的字符数,也就是说MAX_TEXT_INPUT_LENGTH必须是一个定值。

2, 同样是使用setFilters方法,动态改变限制的字符长度:

int mMaxLenth = 20;//mMaxLenth可以动态改变

InputFilter[] FilterArray = new InputFilter[1];
FilterArray[0] = new InputFilter() {
@Override
public CharSequence filter (CharSequence source, int start, int end,
Spanned dest, int dstart, int dend){
boolean bInvlid = false;
int sourceLen = getCharacterNum(source.toString());
int destLen = getCharacterNum(dest.toString());
if (sourceLen + destLen > mMaxLenth) {
return ""; }
return source;
}
};

mEditText.setFilters(FilterArray);

3使用EditText的addTextChangedListener监听事件实现:

mEditText.addTextChangedListener(new TextWatcher() {
private int cou = 0;
int selectionEnd = 0;

@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
cou = before + count;
String editable = mEditText.getText().toString();
mEditText.setText(editable);
}
mEditText.setSelection(mEditText.length());
cou = mEditText.length();
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}

@Override
public void afterTextChanged(Editable s) {
if (cou > mMaxLenth) {
selectionEnd = mEditText.getSelectionEnd();
s.delete(mMaxLenth, selectionEnd);
}
}
});

对于以上三种方法,通过在不同手机上测试,发现如下问题:

如果使用1,2两种方法,在android 4.0以下的版本中,对于三星键盘英文输入法,会出现输入框上下跳动问题,比如三星S1等,而对于4.0以上版本的手机,同样是三星键盘英文输入法,会出现输入字符错误,比如:三星NOTE 2上面在输入框内会莫名的多出许多字符。

对于第3种方法,则性能相对稳定。

对于字符过滤,同理,如果我们使用setFilters方法实现,那么,依然会出现输入框跳动和莫名多出许多字符的问题。

经过三星,LG,谷歌等各种品牌手机的测试,最后给出一种最优的解决方法,即,在EditText的addTextChangedListener监听事件中实现字符过滤和长度限制:

//设置过滤字符函数(过滤掉我们不需要的字符)

publicstaticString stringFilter(String str)throwsPatternSyntaxException{

String regEx ="[/\\:*?<>|\"\n\t]";

Pattern p = Pattern.compile(regEx);

Matcher m = p.matcher(str);

returnm.replaceAll("");

}

int mMaxLenth = 50;

mEditText.addTextChangedListener(newTextWatcher() {

privateintcou= 0;

intselectionEnd= 0;

@Override

publicvoidonTextChanged(CharSequence s,intstart,intbefore,

intcount) {

cou= before + count;

String editable =mEditText.getText().toString();

String str =stringFilter(editable);

if(!editable.equals(str)) {

mEditText.setText(str);

}

mEditText.setSelection(mEditText.length());

cou=mEditText.length();

}

@Override

publicvoidbeforeTextChanged(CharSequence s,intstart,intcount,

intafter) {

}

@Override

publicvoidafterTextChanged(Editable s) {

if(cou>mMaxLenth) {

selectionEnd=mEditText.getSelectionEnd();

s.delete(mMaxLenth,selectionEnd);

if(androidVersion.charAt(0)>='4')

{

mEditText.setText(s.toString());

}

}

}

});

关于 android 中 edittext 特殊字符过滤和字符长度限制的最优方法相关推荐

  1. Android中EditText优先弹出数字输入法

    Android Android中EditText优先弹出数字输入法 项目中一个EditText输入数字的频率较高,但是汉字和英文的输入也偶有需要,直接在xml文件将inputType设置为number ...

  2. android屏蔽表情输入法,Android中EditText屏蔽第三方输入法表情的方法示例

    前言 众所周知如果用第三方的输入法的表情会给开发带来一定的麻烦,一般地像服务器上传的字符都是普通的字符,但是测试,就是狠狠得拿出搜狗输入法,点几个表情,那么问题就来了,要么是显示异常,要么是直接cra ...

  3. android edittext光标太大,Android中EditText样式修改 聚焦光标、背景

    在Android开发中,根据项目的需求,需要定制一些特殊的样式,例如:使用EditText时,聚焦时的背景及光标图片使用自定义而非android系统默认的.这两天,在项目中涉及此需求,现记录如下: 首 ...

  4. 【Andrid】去掉android中EditText的下划线

    去掉android中EditText的下划线 android:background="@null"

  5. android布局密码,Android中EditText显示明文与密码的两种方式

    效果图如下所述: 布局 xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="h ...

  6. android列表滑到底部,Android中判断listview是否滑动到顶部和底部的实现方法

    今天实现listview的下拉刷新和上拉加载的时候,遇到了一个问题,*就是说需要根据listview中滑动的位置来进行下拉刷新和上拉加载.* 具体点,只有当我的listview滑动到最顶部的时候,这时 ...

  7. Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法

    Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法 参考文章: (1)Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法 (2)https: ...

  8. Android中解析读取复杂word,excel,ppt等的方法

    前段时间在尝试做一个Android里的万能播放器,能播放各种格式的软件,其中就涉及到了最常用的office软件.查阅了下资料,发现Android中最传统的直接解析读取word,excel的方法主要用了 ...

  9. mysql 字符串不限长度_mysql提示字符长度超限制的解决方法

    mysql提示字符长度超限制的解决方法 发布时间:2020-06-11 16:16:16 来源:亿速云 阅读:294 作者:鸽子 mysql在创建数据库的时候,字符集设置的不是utf8而是utf9mb ...

最新文章

  1. java实现二叉树的非递归遍历
  2. Retrofit 上传文件显示进度及踩坑记录
  3. OpenKruise v0.8.0 版本发布:K8s 社区首个规模化镜像预热能力
  4. 思科防火墙nat-control的作用
  5. Django开发—如何重置migration
  6. Jython 安装使用
  7. macOS查看IP地址的命令
  8. MySQL性能优化的参数简介
  9. WP7有约(六):AppBarUtils使用指南
  10. javascript-DOM-节点
  11. es客户端工具_超越 Cookie:当今的客户端数据存储
  12. Flutter进阶—平台插件
  13. [译] 在 Android 使用协程(part III) - 在实际工作中使用
  14. 深度学习图像分类(五): ResNet
  15. 游戏 Npk文件解压
  16. 安装系统显示sql服务器未安装,win7系统安装SQLServer2005提示“SQL Server服务无法启动”的解决方法...
  17. WPF_界面_图片/界面/文字模糊解决之道整理
  18. McAfee如何卸载?MacBook 如何卸载麦克菲
  19. ftp服务器设置登录账号密码是什么意思,局域网ftp服务器登录密码是什么
  20. 去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60。本题就请你写个程序替客户计算折扣价。

热门文章

  1. 神秘的40毫秒延迟与 TCP_NODELAY
  2. 深入理解Oracle索引(17):Cost 值相同 CBO 对索引的选择
  3. 提示找不到msvcr71.dll怎么办
  4. 【修真院WEB小课堂】定时器有哪些用法?
  5. 一个java写的贪吃蛇程序
  6. docker镜像-运行
  7. SSH与EJB 比较
  8. 使用微信支付购买《微信公众平台最佳实践》
  9. linux fdisk 分区
  10. luoguP4705 玩游戏