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); } }
时间: 2024-10-05 17:26:28