转自:http://blog.csdn.net/liujianminghero/article/details/7092236
Android 中的EditText最大可输入字符数可以通过xml文件中为EditText设置maxLength属性或者在代码中为EditText设置LengthFilter来设置。
例如要设置EditText只能输入10个字符
xml中:
比如SIM卡上的电话本姓名字段长度,纯英文下允许输入17个字符,而中文则只可以输入6个字符。此时可以重写InputFilter类来实现。
即:
其中的isChinese函数是判断是否字符串中是否包含中文字符,具体实现方法就不再赘述了。
LENGTH_ZNAME : 是中文模式下允许输入的最大字符数。
LENGTH_ENAME:是纯英文模式下允许输入的最大字符数。
判断汉字的方法
private boolean isChinese(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { return true; } return false; }
方法一:利用TextWatcher
editText.addTextChangedListener(new TextWatcher() { private CharSequence temp; private boolean isEdit = true; private int selectionStart ; private int selectionEnd ; @Override public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) { temp = s; } @Override public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) { } @Override public void afterTextChanged(Editable s) { selectionStart = editText.getSelectionStart(); selectionEnd = editText.getSelectionEnd(); Log.i("gongbiao1",""+selectionStart); if (temp.length() > Constant.TEXT_MAX) { Toast.makeText(KaguHomeActivity.this, R.string.edit_content_limit, Toast.LENGTH_SHORT) .show(); s.delete(selectionStart-1, selectionEnd); int tempSelection = selectionStart; editText.setText(s); editText.setSelection(tempSelection); } } });
private TextWatcher mTextWatcher = new TextWatcher(){ Toast mToast = null; public void beforeTextChanged(CharSequence s, int start, int count,int after) { } public void onTextChanged(CharSequence s, int start, int before,int count) { } public void afterTextChanged(Editable s) { int nSelStart = 0; int nSelEnd = 0; boolean nOverMaxLength = false; nSelStart = mEditText.getSelectionStart(); nSelEnd = mEditText.getSelectionEnd(); nOverMaxLength = (s.length() > Constants.MAX_TEXT_INPUT_LENGTH) ? true : false; if(nOverMaxLength){ if(null == mToast){ mToast = Toast.makeText(mContext, R.string.IDS_MSG_TEXT_OVER_MAXLENGTH, Toast.LENGTH_SHORT); } mToast.show(); s.delete(nSelStart - 1, nSelEnd); mEditText.setTextKeepState(s);//请读者注意这一行,保持光标原先的位置,而 mEditText.setText(s)会让光标跑到最前面, //就算是再加mEditText.setSelection(nSelStart) 也不起作用 } } };
方法二:利用InputFilter
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(100)}); //其中100最大输入字数
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(100)}); //其中100最大输入字数
方法三:在XML中设定
Xml代码
<EditText
.
.
.
Android:maxLength="100"
/>
=========================================================
方法二:
利用EditText可以设置filter的特性,自定义一个LengthFilter,当输入字数超过限制时 ,做出自定义的提示
// 输入框限制输入字数
InputFilter[] filters = new InputFilter[1]; filters[0] = new InputFilter.LengthFilter(Constant.TEXT_MAX) { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (source.length() > 0 && dest.length() == Constant.TEXT_MAX) { if ((System.currentTimeMillis() - toastTime) > interval) { toastTime = System.currentTimeMillis(); Toast .makeText(KaguHomeActivity.this, R.string.edit_content_limit, Toast.LENGTH_SHORT).show(); } } if (dest.toString().equals( getResources().getString(R.string.input_default_txt))) { Bundle data = new Bundle(); data.putCharSequence("source", source); Message message = textHandler.obtainMessage(); message.setData(data); message.sendToTarget(); } return super.filter(source, start, end, dest, dstart, dend); } }; editText.setFilters(filters); private Handler textHandler = new Handler() { @Override public void handleMessage(Message msg) { Bundle data = msg.getData(); CharSequence source = data.getCharSequence("source"); editText.setTextColor(Color.BLACK); editText.setText(source); editText.setSelection(source.length()); } };