如果喜歡栗子系列可以關注哦~各種栗子正在趕來中......
栗子慣例,先上GIF
核心程式碼(AnFQNumEditText自定義的組合控制元件)
先看呼叫(是不是很簡單)
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();複製程式碼
實現
首先通過
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);複製程式碼
- 然後提供一些設定值的方法,如右下角的型別(這裡有兩種型別,即:單數型別和百分比型別)、最大字元的長度、EditText的Hint、橫線的顏色。
設定
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人生