概述
InputFilter是系統(tǒng)提供的一個接口,里面只有一個方法filter(),用于過濾輸入/插入的字符串,返回值為CharSequence。 一般都是通過判斷語句來過濾字符串,在這里 InputFilter 是另外一種實現(xiàn)方式。
實現(xiàn)
- 代碼
/******************************* 輸入框關(guān)聯(lián) *********************************/
et02.setFilters(filter);
/**********************************調(diào)用**************************************/
private InputFilter[] filter = new InputFilter[] {
new InputFilter() {
/**
* @param source 輸入的文字
* @param start 輸入-0,刪除-0
* @param end 輸入-文字的長度,刪除-0
* @param dest 原先顯示的內(nèi)容
* @param dstart 輸入-原光標(biāo)位置,刪除-光標(biāo)刪除結(jié)束位置
* @param dend 輸入-原光標(biāo)位置,刪除-光標(biāo)刪除開始位置
* @return
*/
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
System.out.println("source =="+ source+" start====="+start+" end======"+end+" dest===="+dest+" dstart==="+dstart+" dend=="+dend);
return null;
}
}
};
- Log
/*******************************輸入********************************/
09-09 09:30:18.977 10843-10843/zp.example.zptext I/System.out: source ==我 start=====0 end======1 dest==== dstart===0 dend==0
09-09 09:30:21.873 10843-10843/zp.example.zptext I/System.out: source ==喜歡 start=====0 end======2 dest====我 dstart===1 dend==1
09-09 09:30:26.817 10843-10843/zp.example.zptext I/System.out: source ==湖畔 start=====0 end======2 dest====我喜歡 dstart===3 dend==3
09-09 09:31:10.265 10843-10843/zp.example.zptext I/System.out: source ==的 start=====0 end======1 dest====我喜歡湖畔 dstart===5 dend==5
/************************************刪除*****************************/
09-09 09:33:08.089 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜歡湖畔的 dstart===5 dend==6
09-09 09:33:22.341 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜歡湖畔 dstart===4 dend==5
09-09 09:33:27.733 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜歡湖 dstart===3 dend==4
09-09 09:33:30.269 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜歡 dstart===2 dend==3
09-09 09:33:31.485 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我喜 dstart===1 dend==2
09-09 09:33:32.777 10843-10843/zp.example.zptext I/System.out: source == start=====0 end======0 dest====我 dstart===0 dend==1
- 使用
private InputFilter[] filter = new InputFilter[] {
new InputFilter() {
/**
* @param source 輸入的文字
* @param start 輸入-0,刪除-0
* @param end 輸入-文字的長度,刪除-0
* @param dest 原先顯示的內(nèi)容
* @param dstart 輸入-原光標(biāo)位置,刪除-光標(biāo)刪除結(jié)束位置
* @param dend 輸入-原光標(biāo)位置,刪除-光標(biāo)刪除開始位置
* @return
*/
// 不讓輸入框輸入內(nèi)容
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
return null;
}
},
/**這里限制輸入的長度為5個字母*/
new InputFilter.LengthFilter(5),
/**輸入小寫轉(zhuǎn)換成大寫*/
new InputFilter.AllCaps()
};
實例一
// 只要你輸入內(nèi)容都會替換成“I LOVE YOU”,刪除 - 正常刪除
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (end > 0){
return "I LOVE YOU";
}else {
return null;
}
}
實例二
// 控制不讓輸入空格,不讓輸入數(shù)字大于13位(解決手機號輸入問題)
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if(source.equals(" ") || source.toString().contentEquals("\n") || dstart == 13)return "";
else return null;
}
實例三
// 不讓輸入框輸入內(nèi)容(禁止輸入)
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
return dest.subSequence(dstart,dend);
}
實例四
類似臨摹,輸入字符正確則正常輸入,不正確則用 x 代替
/*****************************配置******************************/
private final String str = "Hello,Android!";
et03.setFilters(new InputFilter[]{ new MyInputFilter(str) });
/***************************代碼實現(xiàn)***************************/
public class MyInputFilter implements InputFilter {
String str = null;
public MyInputFilter(String str) {
this.str = str;
}
@Override
public CharSequence filter(CharSequence src, int start, int end, Spanned dest, int dstart, int dend) {
String ch = null;
if (dest.length() < str.length()) {
ch = str.substring(dstart + start, dstart + end);
} else {
return dest.subSequence(dstart, dend);
}
if (ch.equals(src)) {
Toast.makeText(TextWatchActivity.this, "match", Toast.LENGTH_SHORT).show();
return dest.subSequence(dstart, dend) + src.toString();
} else {
Toast.makeText(TextWatchActivity.this, "mismatch", Toast.LENGTH_SHORT).show();
return dest.subSequence(dstart, dend) + "×";
}
}
}
實例五
/**只允許輸入某些字符*/
et03.setKeyListener(new NumberKeyListener() {
@Override
public int getInputType() {
return InputType.TYPE_MASK_VARIATION;
}
/**這里實現(xiàn)字符串過濾,把你允許輸入的字母添加到下面的數(shù)組即可!*/
@Override
protected char[] getAcceptedChars() {
return new char[]{'0','1','2','3'};
}
});
實例六
實時格式化金額,三位一斷
/*******************************配置************************************/
et03.setFilters(new InputFilter[]{lengthfilter2});
/*******************************實現(xiàn)************************************/
private DecimalFormat myformat = new DecimalFormat("###,###"); //金額的格式
private InputFilter lengthfilter2 = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
// 刪除等特殊字符,直接返回
// "".equals(source.toString():不添加會出現(xiàn)刪除不了內(nèi)容的情況
if (source.toString() == null || source.toString().contains(".") || "".equals(source.toString())) {
return null;
}
String dValue = dest.toString();
if (dValue != null && dValue.contains(",")) {
dValue = dValue.replace(",", "");
}
if (dValue != null && dValue.length() > 2 && !dValue.contains(",")) {
String newValue = dValue + source;
String amountStr = myformat.format(Double.parseDouble(newValue));
et03.setText("");
et03.setText(amountStr);
et03.setSelection(amountStr.length());
return amountStr;
} else {
return null;
}
}
};