中文和Emoji表情占两个字符,其他的占一个字符~
首先先编写一个过滤器,限制EditText可输入的最大字符数。
为什么不用.MaxLeng呢?因为这个属性的话,中文,英文都算一个字符。所以不符合我们的要求~
public class EditTextFilter implements InputFilter { int MAX_EN;// 最大英文/数字长度 一个汉字算两个字母 String regEx = "[\\u4e00-\\u9fa5]"; // unicode编码,判断是否为汉字 public EditTextFilter(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) { 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; } }
下面通过接口,实现类似QQ个性签名的效果,显示剩余可输入的字符数。
新建一个工具类 EditTextWatcher
定义一个接口,拿到剩余可输入的字符数
public interface EditTextWhaterListener{ void getSurplusNum(String s); }
初始化方法,传需要限定的EditText,最大字符数过来
public void init(EditText editText,int MaxChar,EditTextWhaterListener listener){ EditTextFilter[] nameLengthFilter2 = {new EditTextFilter(MaxChar)}; editText.setFilters(nameLengthFilter2); this.maxNum=MaxChar; this.listener=listener; editText.addTextChangedListener(textWatcher); }
public void init(EditText editText,int MaxChar){ EditTextFilter[] nameLengthFilter2 = {new EditTextFilter(MaxChar)}; editText.setFilters(nameLengthFilter2); }
editText.setFilters(nameLengthFilter2);
public TextWatcher textWatcher=new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { int EngNum=s.length()-getChineseCount(s.toString()); int CnNum=getChineseCount(s.toString())*2; listener.getSurplusNum((maxNum-EngNum-CnNum)+"");//剩余可输入的字符数 } @Override public void afterTextChanged(Editable s) { } };监听器
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; }获取中文个数
EditTextWatcher editTextWatcher = new EditTextWatcher(); editTextWatcher.init(edtSgignature, 50, new EditTextWatcher.EditTextWhaterListener() { @Override public void getSurplusNum(String s) { tip.setText("还可输入"+s+"字"); } });
使用~
非常简单