如果将EditText的输入长度设置为N个字符,则有如下两种方式:
1.在xml布局文件中对EditText添加 android:maxLength=“N”,比如;
<EditText
android:id="@+id/et_test"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="16" />
2.代码添加:
//java写法
InputFilter[] filters = { new InputFilter.LengthFilter(16) };
editText.setFilters(filters);
//kotlin写法
editText.filters = arrayOf<InputFilter>(LengthFilter(16))
如果只限制字符长度,那上面两种方式则可满足要求,但项目开发中往往会出现这种需求,比如英文字母最多N个,而中文最多N/2个,那么直接用LengthFilter就无法实现要求,但是我们可以通过自定义InputFilter实现:
kotlin实现:
object EditTextFilter {
fun setChineseLimit(editText: EditText,maxLength:Int){
//限制问题内容输入字符长度
val inputFilter = InputFilter { source, start, end, dest, dstart, dend ->
val destCount: Int = (dest.toString().length
+ getChineseCount(dest.toString()))
val sourceCount: Int = (source.toString().length
+ getChineseCount(source.toString()))
return@InputFilter if (destCount + sourceCount > maxLength) {
Toast.makeText(MainActivity.this,"最多可以输入N/2个中文或者N个英文字母、数字",Toast.LENGTH_SHORT).show()
""
} else {
source
}
}
editText.filters = arrayOf(inputFilter)
}
/**
* 计算中文的长度
*/
fun getChineseCount(str: String): Int {
val regEx = "[\\u4e00-\\u9fa5]" // unicode编码,判断是否为汉字
var count = 0
val p: Pattern = Pattern.compile(regEx)
val m: Matcher = p.matcher(str)
while (m.find()) {
for (i in 0..m.groupCount()) {
count += 1
}
}
return count
}
}
Java实现:
public class EditTextFilter {
public void setChineseLimit(EditText editText, int maxLength) {
InputFilter inputFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
int destCount = dest.toString().length()
+ getChineseCount(dest.toString());
int sourceCount = source.toString().length()
+ getChineseCount(source.toString());
if (destCount + sourceCount > maxLength) {
Toast.makeText(MainActivity.this, "最多可以输入N/2个中文或者N个英文字母、数字", Toast.LENGTH_SHORT).show();
return "";
} else {
return source;
}
}
};
editText.setFilters(new InputFilter[]{inputFilter});
}
private int getChineseCount(String str) {
String regEx = "[\\u4e00-\\u9fa5]"; // unicode编码,判断是否为汉字
int count = 0;
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
while (m.find()) {
for (int i = 0; i <= m.groupCount(); i++) {
count = count + 1;
}
}
return count;
}
}