Android 中的EditText最大可输入字符数可以通过xml文件中为EditText设置maxLength属性或者在代码中为EditText设置LengthFilter来设置。
例如要设置EditText只能输入10个字符
xml中:
view plain <EditText android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:id = "@+id/mEdit" android:maxLength = "10"/> [html] view plain copy <EditText android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:id = "@+id/mEdit" android:maxLength = "10"/>
代码中:
view plain EditText mEdit = (EditText)findViewById(R.id.mEdit); InputFilter[] filters = {new LengthFilter(10)}; mEdit.setFilters(filters); [java] view plain copy EditText mEdit = (EditText)findViewById(R.id.mEdit); InputFilter[] filters = {new LengthFilter(10)}; mEdit.setFilters(filters);以上任意一种方法都可以满足需求,但这种方法只能为EditText设置统一的最大可输入字符,如果碰到根据实际情况限制不同的可输入字符数时,这种方法就不能用了。
比如SIM卡上的电话本姓名字段长度,纯英文下允许输入17个字符,而中文则只可以输入6个字符。此时可以重写InputFilter类来实现。
即:
view plain EditText mEdit = (EditText)findViewById(R.id.mEdit); InputFilter[] filters = {new AdnNameLengthFilter()}; mEdit.setFilters(filters); public static class AdnNameLengthFilter implements InputFilter { private int nMax; public CharSequence filter (CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Log.w("Android_12", "source("+start+","+end+")="+source+",dest("+dstart+","+dend+")="+dest); if(isChinese(dest.toString())|| isChinese(source.toString())) { nMax = LENGTH_ZNAME; }else { nMax =LENGTH_ENAME; } int keep = nMax - (dest.length() - (dend - dstart)); if (keep <= 0) { return ""; } else if (keep >= end - start) { return null; // keep original } else { return source.subSequence(start, start + keep); } } } [java] view plain copy EditText mEdit = (EditText)findViewById(R.id.mEdit); InputFilter[] filters = {new AdnNameLengthFilter()}; mEdit.setFilters(filters); public static class AdnNameLengthFilter implements InputFilter { private int nMax; public CharSequence filter (CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Log.w("Android_12", "source("+start+","+end+")="+source+",dest("+dstart+","+dend+")="+dest); if(isChinese(dest.toString())|| isChinese(source.toString())) { nMax = LENGTH_ZNAME; }else { nMax =LENGTH_ENAME; } int keep = nMax - (dest.length() - (dend - dstart)); if (keep <= 0) { return ""; } else if (keep >= end - start) { return null; // keep original } else { return source.subSequence(start, start + keep); } } }
其中的isChinese函数是判断是否字符串中是否包含中文字符,具体实现方法就不再赘述了。
LENGTH_ZNAME : 是中文模式下允许输入的最大字符数。
LENGTH_ENAME:是纯英文模式下允许输入的最大字符数。
android怎样判断EditText输入的值是数字还是汉字 ,并限定输入字数 2011-11-25 10:37判断汉字的方法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; }数字就根据unicode的范围判断吧!
方法一:利用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()); } };=============================================================
转载于:https://www.cnblogs.com/merryjd/archive/2013/01/11/2856489.html
相关资源:JAVA上百实例源码以及开源项目