如果将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"
android:layout_centerInParent="true" />
2.也可以在代码中这样写
InputFilter[] filters = { new InputFilter.LengthFilter(16) };
etTest.setFilters(filters);
这样做只能控制字符串长度,但项目中可能会遇到这样的需求,英文字母最多N个,而中文最多N/2个。这样的话直接用LengthFilter就无法实现了,但是我们可以通过自定义InputFilter实现:
package com.example.inputfilterdemo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/**
*
* ClassName:MainActivity
*
* @author Jerome Song
* @version
* @since Ver 1.1
* @Date 2013 2013-4-4 下午2:55:42
*
* @see
*/
public class MainActivity extends Activity {
private EditText etTest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
etTest = (EditText) findViewById(R.id.et_test);
InputFilter[] filters = { new NameLengthFilter(16) };
etTest.setFilters(filters);
}
private class NameLengthFilter implements InputFilter {
int MAX_EN;// 最大英文/数字长度 一个汉字算两个字母
String regEx = "[\\u4e00-\\u9fa5]"; // unicode编码,判断是否为汉字
public NameLengthFilter(int mAX_EN) {
super();
MAX_EN = mAX_EN;
}
@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 > MAX_EN) {
Toast.makeText(MainActivity.this, getString(R.string.count),
Toast.LENGTH_SHORT).show();
return "";
} else {
return source;
}
}
private int getChineseCount(String str) {
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;
}
}
}
demo源码就这样了,有更好的方法或者错的地方希望大家指出,共同进步!