您的位置:首页 > 移动开发 > Android开发

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

2011-12-21 17:52 441 查看
Android 中的EditText最大可输入字符数可以通过xml文件中为EditText设置maxLength属性或者在代码中为EditText设置LengthFilter来设置。

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

xml中:

view plainprint?

<EditText android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:id = "@+id/mEdit"
android:maxLength = "10"/>

<EditText  android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:id = "@+id/mEdit"
android:maxLength = "10"/>
代码中:

view plainprint?

EditText mEdit = (EditText)findViewById(R.id.mEdit); InputFilter[] filters = {new LengthFilter(10)}; mEdit.setFilters(filters);

EditText mEdit = (EditText)findViewById(R.id.mEdit);
InputFilter[] filters = {new LengthFilter(10)};
mEdit.setFilters(filters);


以上任意一种方法都可以满足需求,但这种方法只能为EditText设置统一的最大可输入字符,如果碰到根据实际情况限制不同的可输入字符数时,这种方法就不能用了。
比如SIM卡上的电话本姓名字段长度,纯英文下允许输入17个字符,而中文则只可以输入6个字符。此时可以重写InputFilter类来实现。

即:

view plainprint?

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);
}

}
}

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());

}

};

=============================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: