在之前的android开发中,碰到需要限制EditText中特殊字符的输入和字符长度限制并提示问题。同样这些开发并不难,很快完成了,不过后来给我起了一个Bug“当第一次输入长度达到上限100时给出了提示,达到上限后再次输入没能再次给出提示”。为了解决这个问题,这里经过实践总结,给出一个方案:
mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
String editable = mEditText.getText().toString();
String str = stringFilter(editable);
//过滤输入无效字符并提示
if (!editable.equals(str)) {
Toast.makeText(this, R.string.invalid_character,
Toast.LENGTH_LONG).show();
mEditText.setText(str);
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable editable) {
//設置最大輸入長度100,並提示達到輸入上限
if (editable.toString().length() > 100) {
Toast.makeText(this,R.string.max_character,
Toast.LENGTH_SHORT).show();
//删除超出100长度部分的字符
editable.delete(mEditText.getSelectionStart() - 1,
mEditText.getSelectionEnd());
}
}
});
// 设置过滤字符函数(过滤掉我们不需要的字符)
public static String stringFilter(String str) throws PatternSyntaxException {
//定义一个无效字符的正则表达式
String regEx = "[/\\:*?<>|\"]";
//生成Pattern对象并且编译一个正则表达式regEx
Pattern p = Pattern.compile(regEx);
//用Pattern类的matcher()方法生成一个Matcher对象
Matcher m = p.matcher(str);
//如果输入为无效字符则替代为""
return m.replaceAll("");
}
这里的解决办法是当输入长度超过100时便会给出提示,并删除超出部分,这样效果来看EditText的最大长度还是100,并且子后再次输入都会给出提示达到上限。