关于EditText的监听 主要用于设置输入长度给用户友好的提示, 提升良好的用户体验
方式一:
监听输入长度和文本信息 但是却做不了提示功能
EditText editText = (EditText) findViewById(R.id.et_main_text);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
L.e("beforeTextChanged : " + s + " - " + start + " - " + count + " - " + after);
// s: 之前的文字内容
// start: 添加文字的位置(从0开始)
// count: 一直是0
// after: 输入为1 擦除为0
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
L.e("onTextChanged : " + s + " - " + start + " - " + before + " - " + count);
// s: 之后的文字内容
// start: 添加文字的位置(从0开始)
// before: 一直是0
// after: 输入为1 擦除为0
}
@Override
public void afterTextChanged(Editable s) {
L.e("afterTextChanged : " + s);
// s:之后的文字内容
}
});
方式二:
监听输入长度,如果长度超过设置长度给出提示,提升用户体验
/**
* 作者: CoolTone
* 描述: 限制输入字符长度限制 字符长度到达字符限制时再输入给出友好提示
*/
public class MaxTextLengthFilter implements InputFilter {
private int mMaxLength;
private Toast mToast = null;
public MaxTextLengthFilter(Context context, int max) {
mMaxLength = max - 1;
mToast = Toast.makeText(context, String.format("字符不能超过%d个",mMaxLength), 1000);
// mToast.setGravity(Gravity.TOP, 0, 280); //设置显示位置
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int d_start, int d_end) {
int keep = mMaxLength - (dest.length() - (d_end - d_start));
if (keep < (end - start)) {
mToast.show();
}
if (keep <= 0) {
return "";
} else if (keep >= end - start) {
return null;
} else {
return source.subSequence(start, start + keep);
}
}
}
在使用时 传入上下文 和 (长度最大限制+1) 即可
mEditText.setFilters(new InputFilter[]{new MaxTextLengthFilter(this, 12)});
基于方式二,自定义一个EditTextLimit 可以设置EditText的长度限制
这里只是实现了代码设置,如果想要在 xml 里设置,还需要费一些功夫了
/**
* 作者:CoolTone
* 描述:可以设置输入长度限制的 EditText
*/
public class EditTextLimit extends EditText {
public EditTextLimit(Context context, AttributeSet attrs) {
super(context, attrs);
}
public EditTextLimit(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// 设置长度的方法(上下文,长度)
public void setTextMaxLengthFilter(Context context, int length) {
this.setFilters(new InputFilter[]{new MaxTextLengthFilter(context, length + 1)});
}
class MaxTextLengthFilter implements InputFilter {
private int mMaxLength;
private Toast mToast = null;
public MaxTextLengthFilter(Context context, int max) {
mMaxLength = max - 1;
mToast = Toast.makeText(context, String.format("字符不能超过%d个", mMaxLength), Toast.LENGTH_SHORT);
// mToast.setGravity(Gravity.TOP, 0, 235); //设置显示位置
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int d_start, int d_end) {
int keep = mMaxLength - (dest.length() - (d_end - d_start));
if (keep < (end - start)) {
mToast.show();
}
if (keep <= 0) {
return "";
} else if (keep >= end - start) {
return null;
} else {
return source.subSequence(start, start + keep);
}
}
}
}
用法很简单 findViewById 之后直接调用 setTextMaxLengthFilter( Content context , int length ) 方法即可。