封装一个可以控制字数的编辑器(EditText)!

XEditText:带删除功能的EditText;可设置自动添加分隔符分割电话号码、银行卡号等;支持禁止Emoji表情符号输入;自定义右边显示图标作功能选项;仿iOS输入框风格 继承EditText封装了一个多项功能的XEditText,具体非常实用的功能。具有如下特点: 自带清除功能图标,点击清除输入内容 输入时手机号时自动分割:138 0000 0000,提高用户体验,轻松实现; 支持自定义分割符号和分割模板,如分割银行卡号:6000-0000-0000-0000-000; 支持禁止Emoji表情符号输入; drawableRight自定义,点击监听,配合PopupWi 阅读详情

思路:其实就是使用编辑控制器来对输入的字数和内容进行监控,达到控制字数的效果!
实现:
/**
* Created by ML on 2017/1/5.
*/

public class EditTextShowNum extends LinearLayout {

private LayoutInflater mInflater;
private LinearLayout llView;
private EditText etText;
private TextView textNumber;
private TextWatcher mWatcher;   //编辑控制器
private String content;

private int maxWord;
private int levelOneNum;
private int levelTwoNum;
private int levtlOneColor;
private int levelTwoColor;

private float edittextSize;
private int edittextColor;
private float numtextSize;
private int numtextMaxColor;
private int numtextColor;
private String edittexthint;

public EditTextShowNum(Context context) {
    super(context);
}

public EditTextShowNum(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TextNum);
    maxWord = typedArray.getInt(R.styleable.TextNum_maxWord, 500);
    edittextSize = typedArray.getFloat(R.styleable.TextNum_edittextSize, 15.0f);
    numtextSize = typedArray.getFloat(R.styleable.TextNum_numtextSize, 15.0f);
    edittextColor = typedArray.getInt(R.styleable.TextNum_edittextColor, 0x383838);
    numtextColor = typedArray.getInt(R.styleable.TextNum_numtextColor, 0xb3b3b3);
    numtextMaxColor = typedArray.getInt(R.styleable.TextNum_numtextMaxColor, 0xFF0000);
    edittexthint = typedArray.getString(R.styleable.TextNum_edittexthint);
    levelOneNum = typedArray.getInt(R.styleable.TextNum_levrlOneNum, 0);
    levelTwoNum = typedArray.getInt(R.styleable.TextNum_levelTwoNum, 0);
    levtlOneColor = typedArray.getInt(R.styleable.TextNum_levtlOneColor, 0xf89527);
    levelTwoColor = typedArray.getInt(R.styleable.TextNum_levelTwoColor, 0xfc6e42);
    if (levelOneNum != 0 && levelTwoNum != 0) {
        if (levelOneNum > levelTwoNum) {
            int num = levelTwoNum;
            levelTwoNum = levelOneNum;
            levelOneNum = num;
        }
    }
    mInflater = LayoutInflater.from(context);
    initXMLView();
}

private void initXMLView() {
    View view = mInflater.inflate(R.layout.edittext_num, this, false);
    llView = (LinearLayout) view.findViewById(R.id.ll_view);
    etText = (EditText) view.findViewById(R.id.et_text);
    etText.setTextSize(edittextSize);
    etText.setTextColor(edittextColor);
    textNumber = (TextView) view.findViewById(R.id.text_number);
    textNumber.setTextSize(numtextSize);
    textNumber.setTextColor(numtextColor);
    textNumber.setText("0/" + maxWord);
    if (edittexthint != null && edittexthint != "") {
        etText.setHint(edittexthint);
    }
    mWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

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

        @Override
        public void afterTextChanged(Editable s) {
            int number = Integer.valueOf(s.length());
            if (number > maxWord) {
                Toast.makeText(getContext(), "已到达最大字数!", Toast.LENGTH_SHORT).show();
                etText.setText(content);
                if (content != null && content != "") {
                    etText.setSelection(content.length());
                }
                textNumber.setText(Html.fromHtml("<font color='" + numtextMaxColor + "'>" + maxWord + "</font>" + "/" + maxWord));
            } else if (levelTwoNum != 0 && number > levelTwoNum) {
                content = s.toString();
                textNumber.setText(Html.fromHtml("<font color='" + levelTwoColor + "'>" + s.length() + "</font>" + "/" + maxWord));
            } else if (levelOneNum != 0 && number > levelOneNum) {
                content = s.toString();
                textNumber.setText(Html.fromHtml("<font color='" + levtlOneColor + "'>" + s.length() + "</font>" + "/" + maxWord));
            } else {
                content = s.toString();
                textNumber.setText(Html.fromHtml("<font color='" + numtextColor + "'>" + s.length() + "/" + maxWord + "</font>"));
            }
        }
    };
    etText.addTextChangedListener(mWatcher);
    this.addView(llView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}

public String getContent() {
    return content;
}

public void setContent(String content) {
    this.content = content;
}

public EditText getEtText() {

    return etText;
}

public void setEtText(EditText etText) {
    this.etText = etText;
}

public TextView getTextNumber() {
    return textNumber;
}

public void setTextNumber(TextView textNumber) {
    this.textNumber = textNumber;
}

public int getMaxWord() {
    return maxWord;
}

public void setMaxWord(int maxWord) {
    this.maxWord = maxWord;
}

public int getLevelOneNum() {
    return levelOneNum;
}

public void setLevelOneNum(int levelOneNum) {
    this.levelOneNum = levelOneNum;
}

public int getLevelTwoNum() {
    return levelTwoNum;
}

public void setLevelTwoNum(int levelTwoNum) {
    this.levelTwoNum = levelTwoNum;
}

public int getLevtlOneColor() {
    return levtlOneColor;
}

public void setLevtlOneColor(int levtlOneColor) {
    this.levtlOneColor = levtlOneColor;
}

public int getLevelTwoColor() {
    return levelTwoColor;
}

public void setLevelTwoColor(int levelTwoColor) {
    this.levelTwoColor = levelTwoColor;
}

public float getEdittextSize() {
    return edittextSize;
}

public void setEdittextSize(float edittextSize) {
    this.edittextSize = edittextSize;
}

public int getEdittextColor() {
    return edittextColor;
}

public void setEdittextColor(int edittextColor) {
    this.edittextColor = edittextColor;
}

public float getNumtextSize() {
    return numtextSize;
}

public void setNumtextSize(float numtextSize) {
    this.numtextSize = numtextSize;
}

public int getNumtextMaxColor() {
    return numtextMaxColor;
}

public void setNumtextMaxColor(int numtextMaxColor) {
    this.numtextMaxColor = numtextMaxColor;
}

public int getNumtextColor() {
    return numtextColor;
}

public void setNumtextColor(int numtextColor) {
    this.numtextColor = numtextColor;
}

public String getEdittexthint() {
    return edittexthint;
}

public void setEdittexthint(String edittexthint) {
    this.edittexthint = edittexthint;
}
这里是封装的所有代码,上面还自定义了一些控件属性,为了方便在XML生命控件时使用!
<declare-styleable name="TextNum">
    <!--最大编辑字数-->
    <attr name="maxWord" format="integer"/>
    <!--达到最大值时数字文本显示的颜色-->
    <attr name="numtextMaxColor" format="color|integer"/>
    <!--编辑器字体的大小-->
    <attr name="edittextSize" format="float"/>
    <!--编辑器字体的颜色-->
    <attr name="edittextColor" format="color|integer"/>
    <!--编辑器没有内容是显示的提示语-->
    <attr name="edittexthint" format="string"/>
    <!--数字文本显示的颜色-->
    <attr name="numtextColor" format="color|integer"/>
    <!--数字文本的字体大小-->
    <attr name="numtextSize" format="float"/>
    <!--编辑字数到达一等级的级别值,可以不设置)-->
    <attr name="levrlOneNum" format="integer"/>
    <!--编辑字数到达二等级的级别值,可以不设置)-->
    <attr name="levelTwoNum" format="integer"/>
    <!--编辑字数到达一等级时数字文本显示的颜色,可以不设置,当一等级级别值和二等级的级别值相同时,取二等级的颜色值)-->
    <attr name="levtlOneColor" format="color|integer"/>
    <!--编辑字数到达二等级时数字文本显示的颜色,可以不设置)-->
    <attr name="levelTwoColor" format="color|integer"/>
</declare-styleable>

接下来在XML资源文件中声明使用就可以了:

 <com.example.a20161005.custormview.v5.EditTextShowNum
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    num:edittextColor="#383838"
    num:edittextSize="15"
    num:edittexthint="这是一个可以控制字数的编辑器"
    num:levelTwoNum="0"
    num:levrlOneNum="10"
    num:maxWord="50"
    num:numtextColor="#b3b3b3"
    num:numtextSize="15"
    >

其实算是一个挺简单的自定义控件,这样做到好处就是想用的时候可以直接拿过去就用了,很方便!

EditText扩展XEditText EditText内容格式化控件 XEditText 和 输入内容过滤器工具类。 GitHub地址:https://github.com/itrenjunhua/XEditText 立即下载

相关推荐

字符批量修改器,一键修改字符

非常好的批量修改器,可以一键修改所需要的字符。

自己封装的一个Edittext工具,让其只能输入指定位数的小数,同时不大于指定数

在Androi开发中,有关数字的的需求有很对,比如在输入金额的时候,正常的逻辑应该是只能输入小数点后两位,而且,你取得钱不能大于你的余额, 你输入类似01,02这样的数字时,程序会自动把无用的0去掉,这就是我写这个工具类的目的,最开始想写成正则的形式,但是没有想好,就写了这个工具类, 利用异常处理,抛砖引玉吧,希望大家能写出更好的方法。

a243981326的博客 835

安卓EditText输入框相关-RichEditorforAndroid强大的富文本编辑器.rar

RichEditor for Android强大的富文本编辑器.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

Android的ClearEdtitext自定义封装class

对于android的Edittext控件的自定义,常常会用到带有删除功能的Edittext,我们对此功能进行封装,然后在对Edittext控件进行编写的时候直接进行使用即可。 废话不多说,实现以后的效果图如下所示: 对ClearEditText视图类进行一个封装,代码: import android.content.Context; import

唯一郭大侠 419

字批量修改器

字符批量修改器

批量字符修改器批量字符修改器

批量字符修改器,可以批量修改网页中的字符代码,好像不支持中文

Android 自定义搜索框(带搜索图标、清除图标、语音图标)

相信大家都用过android自带的SearchView,至于疗效如何相信用过的人都知道。既然自带的搜索框疗效不足,那我们就来自己定义。本篇文章是在EditText上给大家自定义搜索框,并且带了搜索图标,清除图标,语音图标。 按照国际惯例,先给大家上最后的效果图: 输入值后: 接下来我们来看看到底是如何自定义EditTextSearch的: public class EditTextSearch...

u014714188的博客 3485

【gridsample】地平线征程6芯片中gridsample算子的优化与部署实践

本文详细介绍了地平线征程6芯片中gridsample算子的优化与部署实践,重点探讨了PTQ和QAT量化方案在BEV感知任务中的应用。通过双线性插值优化、内存布局调整和混合精度配置等关键技术,显著提升了算子在自动驾驶场景下的性能和精度,为开发者提供了实用的部署指南和调优建议。

zero1的博客 1019

Android基础控件——EditText的自定义、高仿iOS的UITextField

EditText的自定义、高仿iOS的UITextField 学习,学习,学以致用,让基础控件贴近实战效果 EditText是常用的文本框输入控件,它没有像iOS的UITextField那样,只要一个属性就可以在输入的时候弹出一个清除所有文本的图标,那么我们就要自定义一个,废话不多说,Hensen老师开车啦iOS的效果要实现的效果(有点卡,耐心看)1.1 实现分析 使用EditText的setC

点击置顶文章查看博客目录(全站式导航) 3030

UE5网络同步优化:GetLifetimeReplicatedProps高级应用指南

本文深入探讨了UE5中GetLifetimeReplicatedProps函数的高级应用与优化策略。文章超越了基础变量注册,重点阐述了如何通过精细的复制条件控制、频率管理及分层复制机制,构建高效的数据同步通道,从而优化网络带宽与游戏性能,是提升多人游戏体验的实用指南。

weixin_29007243的博客 533

【调试记录】GT ip跑aurora 64b66b协议

如果不用,会出现这种情况:自回环测试,数据收发ok.一旦和对方通信,对方接收的就是一堆乱码,因为GT链路发送数据不能是全1或全0,或者长时间的1或0.否则线路容易受到干扰,毕竟线速率10多G,用了加扰和解扰,就可以提高抗干扰能力。64B66B编码,数据输入是64bit,输出是66bit,所以这之间存在着2bit的带宽差,Gearbox 就是用来解决这种差异的,实现方式是:将66bit数据拿出来2bit先存入Gearbox,然后输出64bit.发送同步码或控制数据时,配置成2.2.4 加扰和解扰!

weixin_41246509的博客 1601

封装的EditText的输入限制(输入的数字前+¥,精确到小数点后两位)

项目中用的EditText的输入金额的功能,在输入金额数字前面加¥符号,精确到小数点后两位,如果第一位输入的是小数点往前面自动补0,不能输入0000000X(X代表1-9)的限制 public static void setPricePoint(final EditText editText) { editText.addTextChangedListener(new TextWatc

shyidong的博客 398

Linux Namespace隔离实战:dd/mkfs/mount/unshare构建终极沙箱

内存占用 | 512MB+ | **<10MB** | 50倍节省 || 启动时间 | 15-45秒 | **0.1-0.5秒** | 100倍加速 || 磁盘空间 | GB级 | **MB级** | 显著减少 || 系统调用性能 | 有损耗 | **原生速度** | 零损耗 |

Loving_enjoy的博客 398

EditText 限制字符类型,个数 (已封装)

package com.ubetween.ubetweenpatient.utils;import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException;import android.text.InputFilter; import andro

Hadis_N的博客 513

手机直连低轨卫星通信:架构、关键技术和未来展望

【摘 要】借助低轨卫星星座全时全域覆盖优势,手机直连卫星通信预期成为6G重要特征之一。首先介绍了手机直连卫星的测试验证、标准化与商业项目发展现状。其次,介绍了基于透明转发、部分可再生处理、完全可再生处理、集成接入和回传的四种手机直连低轨卫星网络架构及组网方式。通过分析手机直连低轨卫星网络场景下高移动性与大传输时延等带来的接入与传输问题,提出对地面移动通信体制进行适应性改进的关键技术方案。最后,探讨了未来手机直连低轨卫星发展发向和潜在思路。通过上述阐述与分析,提供未来发展手机直连低轨卫星通信的可行路径。【关

fzq0625的博客 1707

树根互联Java开发面试题及参考答案

说一下 Java 集合类。 Java 集合类是用于存储和操作一组对象的容器。它提供了多种数据结构,方便程序员对数据进行高效的管理和处理。 Java 集合框架主要包括两大接口:Collection 和 Map。 Collection 接口是一组对象的集合,它有三个主要的子接口:List、Set 和 Queue。 List 接口代表有序的集合,可以包含重复的元素。例如 ArrayList,它是基于数组实现的动态数组。它的优点是随机访问效率高,通过索引访问元素的时间复杂度为 O (1)。当

大模型大数据攻城狮的专栏 856

Android登录界面EditText一键清除内容封装

怎么简单怎么来,本来是自定义EditText嵌入到项目里发现效果不理想,自定义EditText在XML中设置无背景无效......... private void clearEditText(final EditText editText, final ImageView delImageView) { editText.addTextChangedListener(new Text...

xiaozhu0922的博客 911

腾讯微搭低代码开发实战电子书:医疗挂号小程序

本书通过一个完整的“医疗挂号小程序”项目,深度讲解腾讯微搭(WeDa)低代码平台在复杂业务场景下的实战应用。从登录体系搭建、用户注册,到就诊人管理、科室排班与预约下单,全程遵循“配置+逻辑+实战”的思路,带领读者从零实现具备商业级可用性的医疗挂号小程序,掌握低代码开发的核心技巧与业务落地能力。

低代码布道师的博客 952

自定义View(二)Android 自定义EditText一键删除&自定义样式

奥利给

古道西风 357

2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

2026年江苏省职业院校技能大赛高职组“软件测试”赛项智能体辅助测试参考答案

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1327

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

封装的自定义dialog,文本编辑,EditText,按需更改

自定义的dialog,文本编辑

qq_28195645的博客 1083

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

封装输入框文字限制,超出标红(elementui)

<template> <div class="text-size"> <span class="textarea-tip" :class="{isActive: total > max}">{{ total }}/{{ max }}</span> </div> </template> &...

holily_的博客 1086

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

扫码枪 android EditText

USB扫码枪在扫完条形码后会有触发Editext的  KEYCODE_ENTER,而且还是触发两次,如果在Dow /up事件再加上enter事件 ,我这边扫码完成后就不会触发。检测每次的keycode发现在触发enter事件前一个keycode都是触发的条形码最后一位数字,而且都是两次触发。  我也不知道我的方法是否正确,就贴着留个痕迹吧 。。。。   editNo = (EditTe

kenneth95的博客 6348

android 实现edittext的动态可编辑和不可编辑

在实际开发过程中,可能会遇到edittext的编辑和不可编辑,我们不想让用户修改的东西不让他进行修改.而有权限修改的时候就可以直接修改,话不多说直接上代码 editText.setFocusable(false);和editText.setFocusableInTouchMode(false);设置不可编辑状态; editText.setFocusableInTouchMode(tru

我用双手成就你的梦想,所以我必须努力 1111

了解角度和弧度的概念和转换关系

参考文章:http://www.cnblogs.com/xiashengwang/p/3867224.html 唉,以前上学时候学的都还给老师了,现在学习自定义View的时候,还要在重新了解一遍,真是无语! 总结下参考文章里的几个知识点: 1,“ 弧度”和“度”(角度)是度量角大小的两种不同的单位。 2,在旋转角度(rotation)里的角,以“角度”为单位;而在三角函数里的角要以“弧度”为

github_36962753的博客 2万+

绘制弧度方法详解

先看下源码: 讲解下几个参数的意思: RectF :这个参数定义了一个矩形,弧度就是在这个矩形里绘制的,弧度的半径就是在这个矩形里能够绘制的最大圆形的半径(注意:有可能是椭圆也可能是正圆,这取决于矩形本身)如下图的四个紫色的点: 其实你所要绘制的弧形也是根据这个最大圆形绘制的。 startAngle:这个参数就如字面意思,开始的角度。在图中我也标出了几个角度,顺序就是这个顺序! s

github_36962753的博客 2833
上一篇: 自定义View属性
下一篇: 一个简单的饼状图的绘制!
ILoveYouWF
博客等级 码龄10年 6粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值