限制EditText输入中英文Emoji表情字符个数

来源:互联网 发布:网络攻防web 编辑:程序博客网 时间:2024/05/14 15:10

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

使用~


非常简单


1 0