Android 之 设置EditText最大可输入字符

Android 中的EditText最大可输入字符数可以通过xml文件中为EditText设置maxLength属性或者在代码中为EditText设置LengthFilter来设置。

例如要设置EditText只能输入10个字符

xml中:

view plain print ?
  1. <EditTextandroid:layout_width="fill_parent"
  2. android:layout_height="wrap_content"
  3. android:id="@+id/mEdit"
  4. android:maxLength="10"/>
代码中:
view plain print ?
  1. EditTextmEdit=(EditText)findViewById(R.id.mEdit);
  2. InputFilter[]filters={newLengthFilter(10)};
  3. mEdit.setFilters(filters);
EditText mEdit = (EditText)findViewById(R.id.mEdit); InputFilter[] filters = {new LengthFilter(10)}; mEdit.setFilters(filters);
以上任意一种方法都可以满足需求,但这种方法只能为EditText设置统一的最大可输入字符,如果碰到根据实际情况限制不同的可输入字符数时,这种方法就不能用了。

比如SIM卡上的电话本姓名字段长度,纯英文下允许输入17个字符,而中文则只可以输入6个字符。此时可以重写InputFilter类来实现。

即:

view plain print ?
  1. EditTextmEdit=(EditText)findViewById(R.id.mEdit);
  2. InputFilter[]filters={newAdnNameLengthFilter()};
  3. mEdit.setFilters(filters);
  4. publicstaticclassAdnNameLengthFilterimplementsInputFilter
  5. {
  6. privateintnMax;
  7. publicCharSequencefilter(CharSequencesource,intstart,intend,Spanneddest,intdstart,intdend)
  8. {
  9. Log.w("Android_12","source("+start+","+end+")="+source+",dest("+dstart+","+dend+")="+dest);
  10. if(isChinese(dest.toString())||isChinese(source.toString()))
  11. {
  12. nMax=LENGTH_ZNAME;
  13. }else
  14. {
  15. nMax=LENGTH_ENAME;
  16. }
  17. intkeep=nMax-(dest.length()-(dend-dstart));
  18. if(keep<=0){
  19. return"";
  20. }elseif(keep>=end-start){
  21. returnnull;//keeporiginal
  22. }else{
  23. returnsource.subSequence(start,start+keep);
  24. }
  25. }
  26. }
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代码
.
.
.
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());
}
};
=============================================================



你可能感兴趣的:(Android 之 设置EditText最大可输入字符)