写点什么

自定义 View(一) Android 可计数 EditText 实现

用户头像
Android架构
关注
发布于: 5 小时前

3.具体的请看下面的参数说明。


核心代码实现




  1. 文本框监听


private TextWatcher mTextWatcher = new TextWatcher() {


@Override


public void afterTextChanged(Editable s) {


int editStart = etContent.getSelectionStart();


int editEnd = etContent.getSelectionEnd();


// 先去掉监听器,否则会出现栈溢出


etContent.removeTextChangedListener(mTextWatcher);


// 去除首位空格


if (s.toString().startsWith(" ")) {


s.replace(0, 1, "");


}


// 注意这里只能每次都对整个 EditText 的内容求长度,不能对删除的单个字符求长度


// 因为是中英文混合,这里计算的规则是一个汉字对应两个字节,一个数字或字母对应一个字节


// 最后在 UI 上的变化是,一个汉字计数+1,一个字母或数字+1,如果继续输入一个字母或数字则计数不变


while (getInputCount() > mMaxNum * 2) { // 当输入字符个数超过限制的大小时,进行截断操作


s.delete(editStart - 1, editEnd);


editStart--;


editEnd--;


}


etContent.setSelection(s.length());


// 恢复监听器


etContent.addTextChangedListener(mTextWatcher);


setLeftCount();


}


@Override


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


}


@Override


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


}


};


  1. 计数计算规则和颜色刷新


/**


  • 刷新剩余输入字数


*/


private void setLeftCount() {


if (TYPES.equals(SINGULAR)) {//类型 1


mTvNum.setText(String.valueOf((mMaxNum - getInputCount())));


} else if (TYPES.equals(PERCENTAGE)) {//类型 2, 这里需要计算颜色,以"/"区分不同的颜色


String content = (getInputCount() + 1) / 2 + "/" + mMaxNum;


int end = content.indexOf("/");


int start = 0;


SpannableStringBuilder builder = new SpannableStringBuilder(content);


ForegroundColorSpan span = new ForegroundColorSpan(mTextLeftColor);


builder.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);


// 如果输入框内容重新变为空,则计数值为 0


if (getInputCount() == 0) {


mTvNum.setText(0 + "/" + mMaxNum);


} else { // 如果不为空,则为其填充计数和颜色


mTvNum.setText(builder);


}


}


}


/**


  • 获取用户输入内容字数


*/


private long getInputCount() {


return calculateLength(etContent.getText().toString().trim());


}


/**


  • 计算分享内容的字数,一个汉字=两个英文字母,一个中文标点=两个英文标点

  • 注意:该函数的不适用于对单个字符进行计算,因为单个字符四舍五入后都是 1

  • @param s

  • @return


*/


private int calculateLength(String s) {


int len = 0;


for (int i = 0; i < s.length(); i++) {


char


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


charAt = s.charAt(i);


if (charAt < 255) {


len++;


} else {


len += 2;


}


}


return Math.round(len);


}


3.本地引用



  1. xml 布局中使用

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
自定义View(一) Android 可计数EditText实现