TextView设置LengthFilter,正常情况下用户字符超长则会有提示。
但是,如果是粘贴文字,比如限制最大100字,当文本框已有50字,一次性粘贴51字,可以看到最后一个字会丢失,但是不会弹出提示。
总之洒家之前的判断条件是错了,打了一下午的log,新算出一个条件来。。。
记录+分享~
private static class TextLengthFilter extends InputFilter.LengthFilter {
private Context mContext;
private int mLen;
public TextLengthFilter(Context context, int len) {
super(len);
mLen = len;
mContext = context;
}
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
Log4j.e("dj", "TextLengthFilter.filter,dest.length()=" + dest.length() + ";source.length()=" + source.length() + ";start=" + start + ";end=" + end + ";dstart=" + dstart + ";dend=" + dend);
// 从log来看,dest表示文本框原有的内容,source表示新的内容
// start、end 表示新内容截取的起始、终止位置~没看出有什么作用
// dstart、dend 表示需要从dest截取掉的字符串起始、终止位置。想看效果的话请这么做:输入10个字符,选取范围2-5字符,然后粘贴。或者删除一个字符。
// dest的长度减去被删除的长度,为文本框将保留的原内容长度
int keepLen = dest.length() - (dend - dstart);
int insertLen = source.length();
int newLen = keepLen + insertLen;
Log4j.e("dj", "TextLengthFilter.filter,keepLen="+keepLen+";insertLen="+insertLen+";newLen="+newLen);
if (newLen > mLen) {
Toast.makeText(mContext, "客观,请不要这样", Toast.LENGTH_SHORT).show();
}
return super.filter(source, start, end, dest, dstart, dend);
}
}