如果喜欢栗子系列可以关注哦~各种栗子正在赶来中......
栗子惯例,先上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人生