思路是自定义了 一个TextWatcher;主需要配置如下代码:
mInput.addTextChangedListener(new myTextWatcher(mInput,30));
/** * 定义了监测 ASCII 码最大长度 的监听器 */ class myTextWatcher implements TextWatcher{ private EditText myEditText ; private int mAsciiLength = -1; public myTextWatcher(EditText editText,int asciiLength){ this.myEditText = editText; this.mAsciiLength = asciiLength; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { Log.d(TAG, ";;beforeTextChanged s:"+s+"start:"+start+"after:"+after+"count:"+count); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { Log.d(TAG, ";;onTextChanged s:"+s+"start:"+start+"before:"+before+"count:"+count); if(myEditText == null || mAsciiLength <=0){ return ; } int mTextMaxlenght = 0; Editable editable = myEditText.getText(); String str = editable.toString()/*.trim()*/; if(str.length()>mAsciiLength){ str = str.substring(0, mAsciiLength-1); } //得到最初字段的长度大小,用于光标位置的判断 int selEndIndex = Selection.getSelectionEnd(editable); // 取出每个字符进行判断,如果是字母数字和标点符号则为一个字符加1, //如果是汉字则为两个字符 for (int i = 0; i < str.length(); i++) { char charAt = str.charAt(i); //32-122包含了空格,大小写字母,数字和一些常用的符号, //如果在这个范围内则算一个字符, // 如果不在这个范围比如是汉字的话就是两个字符 if (charAt >= 32 && charAt <= 122) { mTextMaxlenght++; } else { mTextMaxlenght += 2; } // 当最大字符大于40时,进行字段的截取,并进行提示字段的大小 if (mTextMaxlenght > mAsciiLength) { // 截取最大的字段 String newStr = str.substring(0, i); myEditText.setText(newStr); // 得到新字段的长度值 editable = myEditText.getText(); int newLen = editable.length(); if (selEndIndex > newLen) { selEndIndex = editable.length(); } // 设置新光标所在的位置 Selection.setSelection(editable, selEndIndex); break; } } } @Override public void afterTextChanged(Editable s) { Log.d(TAG, ";;afterTextChanged s:"+s); if(s.toString().trim().length() == 0){ //todo 该字符串为空字符如何处理 } } }