这种方法也很实用,但是前提是这种只能限制你可以输入哪些字符,另外,这种方式我代码不是很推崇,列一个静态的可输入的列表,如果有这种需求的,建议参考下面的方法:
// 设置过滤字符函数(过滤掉我们不需要的字符)
public static String stringFilter(String str)throws PatternSyntaxException{
String regEx = "[/\\:*?<>|\"\n\t]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("");
}
int mMaxLenth = 50;
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();
String str = stringFilter(editable);
if (!editable.equals(str)) {
mEditText.setText(str);
}
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);
if(androidVersion.charAt(0)>='4')
{
mEditText.setText(s.toString());
}
}
}
});
转为重点,现在我们的需求是实现只能输入数字、字母(a-z A-Z)、以及部分的英文标点(@#$%^&*.~/\\{\\}|()'\"?>
那如何用正则匹配去做呢?
这里我先列出代码再来解释:
public abstract class PasswordTextWatcher implements TextWatcher {
private static final String LOG_TAG = PasswordTextWatcher.class
.getSimpleName();
// password match rule
private static final String PASSWORD_REGEX = "[A-Z0-9a-z!@#$%^&*.~/\\{\\}|()'\"?>
private boolean mIsMatch;
private CharSequence mResult;
private int mSelectionStart;
private int mSelectionEnd;
private EditText mPasswordEditText;
public PasswordTextWatcher() {};
public PasswordTextWatcher(EditText editText) {
mPasswordEditText = editText;
};
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
mSelectionStart = mPasswordEditText.getSelectionStart();---------①
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
CharSequence charSequence = "";
if ((mSelectionStart + count) <= s.length()) {---------②
charSequence = s.subSequence(mSelectionStart, mSelectionStart
+ count);
}
mIsMatch = pswFilter(charSeq