栗子——自定义EditText实现右下角计数控件

6,321 阅读2分钟

如果喜欢栗子系列可以关注哦~各种栗子正在赶来中......


栗子惯例,先上GIF

栗子1.gif

栗子2.gif

核心代码(AnFQNumEditText自定义的组合控件)

  1. 先看调用(是不是很简单)
    xml

     <anfq.numedittext.lib.AnFQNumEditText
         android:id="@+id/anetDemo"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"/>

    java

     anetDemo = (AnFQNumEditText) findViewById(R.id.anetDemo);
     anetDemo.setEtHint("内容")//设置提示文字
             .setEtMinHeight(200)//设置最小高度,单位px
             .setLength(50)//设置总字数
             //TextView显示类型(SINGULAR单数类型)(PERCENTAGE百分比类型)
             .setType(AnFQNumEditText.SINGULAR)
             .setLineColor("#3F51B5")//设置横线颜色
             .show();
  2. 实现

    1. 首先通过LayoutInflater.from获取到layout,然后findViewById拿到里面的控件,这里用了三个控件EditText,TextView,View,View是最下面的横线

       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);
    2. 然后提供一些设置值的方法,如右下角的类型(这里有两种类型,即:单数类型和百分比类型)、最大字符的长度、EditText的Hint、横线的颜色。
    3. 设置EditText的监听TextWatcher(这里是参考了网上的一些代码,具体链接找不到了)

       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();
       }
       /** 刷新剩余输入字数 */
       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);
       }

总结:这种EditText显示输入字数的控件在开发中经常用到,但是如果在多个地方用到的话都要做监听代码重复太多,所以做了一下封装,以便以后使用


源码地址


转载请注明出处,简书:淡漠de人生