public class CustomTextChangedListener implements TextWatcher {
private int mTextMaxLength;
private EditText mEditText;
private int mFinalFilter = 0;
private InputFilter[] filters = new InputFilter[2];
/**
* @param length edittext限制的英文字符长度
* @param editText edittext对象
*/
public CustomTextChangedListener(int length, EditText editText) {
this.mEditText = editText;
mTextMaxLength = length;
filters[0] = new InputFilter.LengthFilter(mTextMaxLength);
filters[1] = TextUtils.filter;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
int filter = mTextMaxLength;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) < 32 || s.charAt(i) > 122) {
filter--;
}
}
if (filter <= mTextMaxLength / 2) {
mFinalFilter = mTextMaxLength / 2;
} else {
mFinalFilter = filter;
}
filters[0] = new InputFilter.LengthFilter(filter);
//设置过滤器,限制输入字长,及不能输入空格
mEditText.setFilters(filters);
}
@Override
public void afterTextChanged(Editable s) {
//检查字符串是否超出限制,超出的话去掉超出的部分,主要发生在,粘贴一个常字符串过来,或者在输入框打了很长一段话的情形
if (s.length() > mFinalFilter) {
s.delete(mFinalFilter + 1, mEditText.getSelectionEnd());
mEditText.setText(s); //去掉的这两行会有指针溢出,改成下面的方式
s.delete(mFinalFilter, mEditText.getSelectionEnd());
mEditText.setSelection(s.length());
}
}
}