最近做一个即时通讯项目,由于发送文本信息需要限定字节数,如果超过字节数信息会发送失败,因此可以通过提示用户达到输入的最大字符数。
考虑到的场景:
1,用户正常输入一串字符串,达到允许输入的最大字节数 ,提示用户;
2,输入框内的字符串已经的达到允许用户输入的最大字符串,如果用户在中间插入一段字符串,会将末尾的字符串删掉一部分,保留插入的一部分,
案例:用户输入不同的字符串,含中文,数字,字母
核心代码:
/*
* 监听输入内容是否超出最大长度,并设置光标位置
*/
public class MaxLengthWatcher implements TextWatcher {
String myStr = null;
private int maxLen = 0;
private EditText editText = null;
private Context context;
private Toast myToast;
protected static final String TAG = MaxLengthWatcher.class.getSimpleName();
private String oldStr;
boolean deletFlag;
private String mToastText;
/**
*
* @param context
* @param maxLen 允许输入的最大字符数如允许输入为5个,则赋值为6,
* @param editText 监听的控件
* @param toastText 超过最大弹出的提示
*/
public MaxLengthWatcher(Context context, int maxLen, EditText editText,String toastText) {
this.maxLen = maxLen;
this.editText = editText;
this.context = context;
mToastText=toastText;
if(mToastText==null){
mToastText="达到最大可发送字节数";
}
myToast = new MyToast(context);
// this.editable = editText.getText();
}
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
Log.d(TAG, "beforeTextChanged arg1=" + arg1 + "arg2=" + arg2 + "arg3=" + arg3);
}
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
Log.d(TAG, "onTextChangedarg1=" + arg1 + "arg2=" + arg2 + "arg3=" + arg3);
if (arg2 != 0) {
deletFlag = true;
}
Editable editable = editText.getText();
int len = editable.length();
StringBuffer sb = new StringBuffer();
sb.delete(0, sb.length());
int len1 = 0;
char[] charstr = arg0.toString().toCharArray();
for (int i = 0; i < charstr.length; i++) {
if (len1 < maxLen) {
char[] newChar = new char[1];
newChar[0] = charstr[i];
String str = new String(newChar);
try {
len1 = len1 + str.getBytes("UTF-8").length;
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sb.append(charstr[i]);
}
}
// Log.d(TAG, "================" + sb.toString() + "len1 =" + len1);
if (len1 >= maxLen) {
if (!myToast.isStart()) {
myToast.setText(mToastText);
myToast.show();
} else {
myToast.cancel();
myToast.setText(mToastText);
myToast.show();
}
int selEndIndex = Selection.getSelectionEnd(editable);
String str = editable.toString();
String newStr = null;
Log.d(TAG, "selEndIndex=" + selEndIndex + "str.length()=" + str.length());
// 截取新字符串
newStr = str.substring(0, sb.length() - 1);
editable.clear();
editable.append(newStr);
deletFlag = false;
oldStr = newStr;
Log.d(TAG, "editable.length()=" + editable.length());
// 设置新光标所在的位置
selEndIndex = Selection.getSelectionEnd(editable);
Selection.setSelection(editable, selEndIndex);
}
}
}
如何简单的使用:
//需要监听的EditText btn_message_edite;
//允许输入的最大字节数 int maxSentlenth;
//输入最大后,提示用户的字符串 toastStr;
btn_message_edite.addTextChangedListener(new MaxLengthWatcher(mContext, maxSentlenth, btn_message_edite,
toastStr));