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"/>
<EditText android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:id = "@+id/mEdit" 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代码
<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());
}
};
=============================================================



更多相关文章

  1. Android生成界面的两种方法:setContentView和inflate的区别
  2. android中的字符长度
  3. Android 使用Canvas在图片上绘制文字的方法
  4. Android 项目快速更改包名的方法
  5. 『ANDROID』 在Android开发过程中,常Android 更新UI的两种方法—
  6. Android 软件盘弹出时把view顶上去的处理方法
  7. android防止APK被反编译的方法

随机推荐

  1. 如何使用php和mysql处理加密的私人消息
  2. 在PHP中更改关联数组索引的位置
  3. 使用php将文件上传到AWS S3
  4. Ajax上传插件。handleError未找到
  5. PHP语言的中回车换行
  6. 正则表达式匹配wordpress类似的短代码,用
  7. 在php项目中, mysql视图常用吗?
  8. mysql_fetch_array返回一个数组,数字为“1
  9. 如何创建自己的wiki-Dokuwiki
  10. 如何在php数组中插入新的键值对?