1. 程式人生 > >限制EditText輸入中英文Emoji表情字元個數

限制EditText輸入中英文Emoji表情字元個數

中文和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+"");
}
});

使用~

非常簡單