自定义Editext控制输入字数限制的文本框Editext
来源:互联网 发布:域名注册使用godaddy 编辑:程序博客网 时间:2024/05/16 23:39
作为一个菜鸟程序员,刚开始一些很多牛逼的功能大部分人都自己写不出来,但是这并不影响我们对编程的热情,不会没关系,别人的东西我们看明白学会了就成自己了,编程的路上也不正是如此吗??下来看最近本人看到的一个比较实用的一个控件,相信很多朋友在项目中都会经常用到这个功能,废话不多说,还是看图比较一目了然。
好了,既然效果看到了,是不是确实比较实用呢??接下来看看具体的实现吧。。。。
首先我们新建一个类,让它extends RelativeLayout
重写
public AnFQNumEditText(Context context) { this(context, null);}public AnFQNumEditText(Context context, AttributeSet attrs) { super(context, attrs); 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);}
还有一些声明类型,这里我暂时给出,以后可以自定义
//类型1(单数类型):TextView显示总字数,然后根据输入递减.例:100,99,98//类型2(百分比类型):TextView显示总字数和当前输入的字数,例:0/100,1/100,2/100public static final String SINGULAR = "Singular";//类型1(单数类型)public static final String PERCENTAGE = "Percentage";//类型2(百分比类型)private EditText etContent;//文本框private TextView tvNum;//字数显示TextViewprivate View vLine;//底部横线private String TYPES = SINGULAR;//类型private int MaxNum = 100;//最大字符
接下来设置一些必要的属性
这里我们将这些属性进行一个简单的封装,到时候用的话可以根据自己的需要进行不同的set属性
/** * 设置显示 * @return */public AnFQNumEditText show(){ if(TYPES.equals(SINGULAR)){//类型1 tvNum.setText(String.valueOf(MaxNum)); }else if(TYPES.equals(PERCENTAGE)){//类型2 tvNum.setText(0+"/"+MaxNum); } //设置长度 etContent.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MaxNum)}); //监听输入 etContent.addTextChangedListener(mTextWatcher); return this;}/** * 设置横线颜色 * @param color --颜色值 * @return */public AnFQNumEditText setLineColor(String color){ vLine.setBackgroundColor(Color.parseColor(color)); return this;}/** * 设置类型 * @param type --类型 * @return */public AnFQNumEditText setType(String type){ TYPES = type; return this;}/** * 设置最大字数 * @param num --字数 * @return */public AnFQNumEditText setLength(int num){ this.MaxNum = num; return this;}/** * 设置文本框的Hint * @param str --设置内容 * @return */public AnFQNumEditText setEtHint(String str){ etContent.setHint(str); return this;}/** * 设置文本框的最小高度 * @param px --最小高度(单位px) * @return */public AnFQNumEditText setEtMinHeight(int px){ etContent.setMinHeight(px); return this;}private TextWatcher mTextWatcher = new TextWatcher() { private int editStart; private int editEnd; 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(); } public void beforeTextChanged(CharSequence s, int start, int count,int after) {} public void onTextChanged(CharSequence s, int start, int before,int count) {}};/** 刷新剩余输入字数 */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);}好了,到这里就一个自定义的editext完成了。下来我们看一下调用,在MainActivity中
anetDemo = (AnFQNumEditText) findViewById(R.id.anetDemo);anetDemo.setEtHint("请任意输入内容")//设置提示文字 .setEtMinHeight(200)//设置最小高度,单位px .setLength(30)//设置总字数 .setType(AnFQNumEditText.PERCENTAGE)//TextView显示类型(SINGULAR单数类型)(PERCENTAGE百分比类型) .setLineColor("#3ee223")//设置横线颜色 .show();没错,就是这几行代码就ok了。运行后就会出现上面截图的效果。是不是很简单,很实用呢。
最后在附上源码
1 0
- 自定义Editext控制输入字数限制的文本框Editext
- 限制Editext输入字节长度
- 限制editext输入的字符数不超过140个字符
- EditExt
- Editext
- 动态限制EdiText只能输入特定字符
- 限制文本框的输入字数
- JS控制文本框textarea输入字数限制的方法
- JS控制文本框textarea输入字数限制
- 限制文本框输入字数
- 文本框限制输入字数
- 限制多文本框输入字数的代码
- textarea 限制文本框输入的字数
- js对文本框输入的字数限制、通过复选框控制其他html控件的可用性
- Editext的常见属性
- Jquery 限制文本框输入字数
- 文本框输入字数限制JQuery
- 文本框输入字数限制的实现(限制300字)
- cocos2d-js
- mysql通过“延迟关联”进行limit分页查询优化的一个实例
- Nodejs创建https服务器(Windows 7)
- Codevs1155 金明的预算方案 ——2006年NOIP全国联赛提高组 变种经典背包dp
- HOG 学习
- 自定义Editext控制输入字数限制的文本框Editext
- boosting和adaboost区别
- jQuery笔记--动画篇
- 设计模式六大原则 - (4):接口隔离原则
- Android二維碼掃描
- spring mvc 通过bean获取form的参数和并且进行服务器验证 ,而且支持多个文件上传的用法。html使用form_data
- Struts2为什么无法找到action啊?eclipse和myeclipse不一样吗?
- zabbix trigger表达式
- 对数组的键名进行排序