public static class AmiLengthInputFilter extends InputFilter.LengthFilter{
private Context context;
private Toast mToast;
public AmiLengthInputFilter(int length, Context context) {
super(length);
Log.e("AmiLengthInputFilter", "AmiLengthInputFilter contrucstor begin");
this.context = context;
// TODO Auto-generated constructor stub
}
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
// TODO Auto-generated method stub
Log.e("AmiLengthInputFilter", "super.filter begin");
CharSequence charSequence = super.filter(source, start, end, dest, dstart, dend);
Log.e("AmiLengthInputFilter", "super.filter end");
if(charSequence != null){
Log.e("AmiLengthInputFilter", "charSequence.equals(\"\")");
if(null == mToast){
mToast = Toast.makeText(context, R.string.limit_length, Toast.LENGTH_SHORT);
mToast.show();
}else{
Log.e("AmiLengthInputFilter", "mToast not null");
mToast.cancel();
mToast = Toast.makeText(context, R.string.limit_length, Toast.LENGTH_SHORT);
mToast.show();
}
}
return charSequence;
}
}
下面是LengthInputFilter的源码
按backspace键时,不会马上删除输入框中的内容,而先删掉之前输入但没显示出来的东西。//测试结果是,在没满的时候返回null。在满的时候(达到maxlength),点得快的时候是返回“”,点得慢是返回整个字符串。
public static class LengthFilter implements InputFilter {
private final int mMax;
public LengthFilter(int max) {
mMax = max;
}
public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
int dstart, int dend) {//source是新增字符串所在charsequence,start和end是是新增字符的index范围,可知source还存有其他东西,而不只是
//本次新增的东西
int keep = mMax - (dest.length() - (dend - dstart));//dend和dstart应该是冗余长度,
//(dest.length() - (dend - dstart))是实际长度,keep则是表示还剩下的空间。
if (keep <= 0) {//表示已达到上限 return "";
} else if (keep >= end - start) {//空间可容纳全部新增的字符 return null; // keep original
} else {//有空间但是不够容纳所有字符 keep += start;
if (Character.isHighSurrogate(source.charAt(keep - 1))) { --keep; if (keep == start) { return ""; } }
return source.subSequence(start, keep); } }
/** * @return the maximum length enforced by this input filter */
public int getMax() { return mMax; } }