在項目中經常會遇到限制EditText輸入長度的需求,這個很好解決,設置maxLength屬性就行了;但是偶爾會遇到限制長度的升級版:中文算兩個字符。比如說這個輸入框最多可以輸入16個英文字符或8箇中文,如果中英文混合輸入,那麼中文數*2+英文數要小於等於16。
佈局文件內容不變
LengthFilter.java
package com.wind.demo;
import android.text.InputFilter;
import android.text.Spanned;
public class LengthFilter implements InputFilter {
private static final int ASCII = 1; //英文字符長度
private static final int OTHER = 2; //其他字符長度
private final int mMaxLength; //可輸入的最大長度
public LengthFilter(int maxLength) {
mMaxLength = maxLength;
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
int keep = mMaxLength - countStringLength(dest); //計算剩餘可輸入的長度
if(keep <= 0) { //剩餘可輸入的長度不大於0,返回空字符
return "";
} else if(keep >= countStringLength(source)) { //剩餘可輸入的長度大於輸入字符串的長度,不做過濾處理,使用原來的輸入字符串
return null;
} else { //輸入字符串的長度大於剩餘可輸入的長度
int index = countCutIndex(keep, source); //計算截斷輸入字符串的位置
return source.subSequence(0, index); //返回截斷後的字符串
}
}
/**
* 計算輸入字符串的截斷位置
* */
private int countCutIndex(int keep, CharSequence source) {
int length = 0;
for(int i = 0; i < source.length(); i++) {
char c = source.charAt(i);
length += countCharLength(c);
if(length > keep) {
return i;
}
}
return source.length() - 1;
}
/**
* 計算字符串的長度
* */
private int countStringLength(CharSequence str) {
if(str == null) {
return 0;
}
int length = 0;
for(int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
length += countCharLength(c);
}
return length;
}
/**
* 計算字符的長度
* */
private int countCharLength(char c) {
if(33 <= c && c <= 126) { //英文字符值的範圍
return ASCII;
} else {
return OTHER;
}
}
}
MainActivity.java
package com.wind.demo;
import android.app.Activity;
import android.os.Bundle;
import android.text.InputFilter;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editText = (EditText) findViewById(R.id.edittext);
editText.setFilters(new InputFilter[]{new LengthFilter(16)});
}
}