栗子——自定義EditText實現右下角計數控制元件

碼個蛋發表於2016-10-10

如果喜歡栗子系列可以關注哦~各種栗子正在趕來中......


栗子慣例,先上GIF

栗子——自定義EditText實現右下角計數控制元件
栗子1.gif

栗子——自定義EditText實現右下角計數控制元件
栗子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人生

相關文章