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

在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());

}

}

}

});

更多相关文章

  1. Android中遇到java.lang.NoSuchMethodError: java.io.File.toPat
  2. [置顶] [Android(安卓)Studio 权威教程]断点调试和高级调试
  3. 菜鸟的安卓实习之路----关于EditText的最大长度maxLength和密码
  4. Android(安卓)淘气三千传之 —— 插件化的一点理解(上)
  5. 用AutoCompleteTextView实现历史记录提示
  6. 关于Android中长度单位
  7. Android中Handler消息传递机制
  8. Fresco: android上的图像处理库
  9. Android(安卓)Activity全面解析

随机推荐

  1. 集成Android 科大讯飞免费在线语音合成播
  2. Android 侧滑菜单的简单实现(SlidingMenu)
  3. 研究一下Android滑屏的功能的原理,及scrol
  4. Android(安卓)自定义camera压缩图片到指
  5. Android—— Android 的属性系统
  6. android Task简介
  7. android之Eclipse如何使用adb
  8. 【Android 内存优化】Android 工程中使用
  9. Android中关于Volley的使用(四)利用Network
  10. Android图标设计标准和原则