首页 > 代码库 > 自定义EditText动态控制输入的字符数量

自定义EditText动态控制输入的字符数量

      在开发中难免会遇到要控制字符数量的输入限制,比如用户的名字会让你输入10个字符(意思是英文可以输入10个但是汉字只可以输入5个),也许第一反应会在xml中设置EditText的长度,这种情况肯定是达不到我们的要求的。下面介绍一下自己的方法。

    1.声明一个类继承InputFilter,实现filter中的方法,下面有详细的注解读者可以仔细看下

 public class MyLenghtFilter implements InputFilter {

	int nMax=0;
	int keep=0;
	public MyLenghtFilter(int nMax){
		this.nMax=nMax;
	}

	/**
	 * 以下是个人的理解
	 */
	@Override
	public CharSequence filter(CharSequence source, int start, int end,
			Spanned dest, int dstart, int dend){
	   
		//end是要输入的字符长度  dstart,dend默认再输入字符的时候二个长度是想等的    
		//在输入法中执行删除字符时  dstart显示的删除后的字符长度,dend显示的时删除前的字符长度
		try {
			keep = nMax - (dest.toString().getBytes("GBK").length - (dend - dstart));
			if(keep<= 0) {//此处判断已输入的字符长度是否大于等于最大长度 
				return "";
			}else if(keep >=source.toString().getBytes("GBK").length - start){//判断输入的字符长度要是小于最大长度则返回输入的字符
				return null;
			}else {
				return source.subSequence(start,(start + keep)/2);//要是输入的长度大于最大长度则截取前面的几个字符输出
			}
		}catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
}
2.自定义EditText如下

public class MyEditText extends EditText {

	public MyEditText(Context context) {
		super(context);
	}
    
	public void setFileter(int maxLen){
		this.setFilters(new InputFilter[]{new MyLenghtFilter(maxLen)});
	}
	
	public MyEditText(Context context, AttributeSet attrs) {
		super(context, attrs);
		if(attrs!=null){
			TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.myEditInfo);
			setFileter(typedArray.getInt(R.styleable.myEditInfo_maxlen,100));
			typedArray.recycle();
		}
	}
}
<resources>
       <declare-styleable name="myAutoInfo">
           <attr name="au_background" format="reference"/>
           <attr name="focuseable" format="boolean"/>
           <attr name="textsize" format="dimension"></attr>
       </declare-styleable>
</resources>
在这类中用了自定义属性方便在xml中设置要控制输入的长度。

要是读取还有更好的方法,欢迎留言告诉我。

自定义EditText动态控制输入的字符数量