限制EditText輸入中英文Emoji表情字元個數
阿新 • • 發佈:2019-02-08
中文和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);
這裡是用剛剛寫好的過濾器限定EditText可輸入的最大字元數
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+"字"); } });
使用~
非常簡單