自定义Editext控制输入字数限制的文本框Editext

    作为一个菜鸟程序员,刚开始一些很多牛逼的功能大部分人都自己写不出来,但是这并不影响我们对编程的热情,不会没关系,别人的东西我们看明白学会了就成自己了,编程的路上也不正是如此吗??下来看最近本人看到的一个比较实用的一个控件,相信很多朋友在项目中都会经常用到这个功能,废话不多说,还是看图比较一目了然。


好了,既然效果看到了,是不是确实比较实用呢??接下来看看具体的实现吧。。。。

首先我们新建一个类,让它extends RelativeLayout

重写

public AnFQNumEditText(Context context) {
    this(context, null);
}

public AnFQNumEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    LayoutInflater.from(context).inflate(R.layout.anfq_num_edittext, this, true);
    etContent = (EditText) findViewById(R.id.etContent);
    tvNum = (TextView) findViewById(R.id.tvNum);
    vLine = findViewById(R.id.vLine);
}

还有一些声明类型,这里我暂时给出,以后可以自定义
//类型1(单数类型)TextView显示总字数,然后根据输入递减.例:1009998
//类型2(百分比类型)TextView显示总字数和当前输入的字数,例:0/1001/1002/100
public static final String SINGULAR = "Singular";//类型1(单数类型)
public static final String PERCENTAGE = "Percentage";//类型2(百分比类型)
private EditText etContent;//文本框
private TextView tvNum;//字数显示TextView
private View vLine;//底部横线
private String TYPES = SINGULAR;//类型
private int MaxNum = 100;//最大字符


接下来设置一些必要的属性
这里我们将这些属性进行一个简单的封装,到时候用的话可以根据自己的需要进行不同的set属性
/**
 * 设置显示
 * @return
 */
public AnFQNumEditText show(){
    if(TYPES.equals(SINGULAR)){//类型1
        tvNum.setText(String.valueOf(MaxNum));
    }else if(TYPES.equals(PERCENTAGE)){//类型2
        tvNum.setText(0+"/"+MaxNum);
    }
    //设置长度
    etContent.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MaxNum)});
    //监听输入
    etContent.addTextChangedListener(mTextWatcher);
    return this;
}

/**
 * 设置横线颜色
 * @param color --颜色值
 * @return
 */
public AnFQNumEditText setLineColor(String color){
    vLine.setBackgroundColor(Color.parseColor(color));
    return this;
}

/**
 * 设置类型
 * @param type --类型
 * @return
 */
public AnFQNumEditText setType(String type){
    TYPES = type;
    return this;
}

/**
 * 设置最大字数
 * @param num --字数
 * @return
 */
public AnFQNumEditText setLength(int num){
    this.MaxNum = num;
    return this;
}

/**
 * 设置文本框的Hint
 * @param str --设置内容
 * @return
 */
public AnFQNumEditText setEtHint(String str){
    etContent.setHint(str);
    return this;
}

/**
 * 设置文本框的最小高度
 * @param px --最小高度(单位px)
 * @return
 */
public AnFQNumEditText setEtMinHeight(int px){
    etContent.setMinHeight(px);
    return this;
}

private TextWatcher mTextWatcher = new TextWatcher() {
    private int editStart;
    private int editEnd;
    public void afterTextChanged(Editable s) {
        editStart = etContent.getSelectionStart();
        editEnd = etContent.getSelectionEnd();
        // 先去掉监听器,否则会出现栈溢出
        etContent.removeTextChangedListener(mTextWatcher);
        // 注意这里只能每次都对整个EditText的内容求长度,不能对删除的单个字符求长度
        // 因为是中英文混合,单个字符而言,calculateLength函数都会返回1
        while (calculateLength(s.toString()) > MaxNum) { // 当输入字符个数超过限制的大小时,进行截断操作
            s.delete(editStart - 1, editEnd);
            editStart--;
            editEnd--;
        }
        // 恢复监听器
        etContent.addTextChangedListener(mTextWatcher);
        setLeftCount();
    }

    public void beforeTextChanged(CharSequence s, int start, int count,int after) {}

    public void onTextChanged(CharSequence s, int start, int before,int count) {}
};

/** 刷新剩余输入字数 */
private void setLeftCount() {
    if(TYPES.equals(SINGULAR)){//类型1
        tvNum.setText(String.valueOf((MaxNum - getInputCount())));
    }else if(TYPES.equals(PERCENTAGE)){//类型2
        tvNum.setText(MaxNum-(MaxNum - getInputCount())+"/"+MaxNum);
    }

}

/** 获取用户输入内容字数 */
private long getInputCount() {
    return calculateLength(etContent.getText().toString());
}
接下来我们换得考虑一下关于字数的问题,因为输入英文和汉字所占的单位字数是不一样的。包括英文标点符号和中文的标点符号所占的字数都是不一样的
这里我们再写一个方法进行这些逻辑处理
/**
 * 计算分享内容的字数,一个汉字=两个英文字母,一个中文标点=两个英文标点
 * 注意:该函数的不适用于对单个字符进行计算,因为单个字符四舍五入后都是1
 * @param cs
 * @return
 */
public static long calculateLength(CharSequence cs) {
    double len = 0;
    for (int i = 0; i < cs.length(); i++) {
        int tmp = (int) cs.charAt(i);
        if (tmp > 0 && tmp < 127) {
            len += 1;
        } else {
            len++;
        }
    }
    return Math.round(len);
}
好了,到这里就一个自定义的editext完成了。下来我们看一下调用,在MainActivity中

anetDemo = (AnFQNumEditText) findViewById(R.id.anetDemo);
anetDemo.setEtHint("请任意输入内容")//设置提示文字
        .setEtMinHeight(200)//设置最小高度,单位px
        .setLength(30)//设置总字数
        .setType(AnFQNumEditText.PERCENTAGE)//TextView显示类型(SINGULAR单数类型)(PERCENTAGE百分比类型)
        .setLineColor("#3ee223")//设置横线颜色
        .show();
没错,就是这几行代码就ok了。运行后就会出现上面截图的效果。是不是很简单,很实用呢。
最后在附上源码
 
  

你可能感兴趣的:(自定义View,自定义,EditText,输入限制,输入字数限制,输入限制的文本框)