封装一个可以控制字数的编辑器(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

电商秒杀场景下,如何用Redis+Lua脚本实现原子性库存扣减(附完整代码)

本文针对电商秒杀场景下的高并发与超卖难题,详细解析了如何利用Redis的原子性命令与Lua脚本实现可靠的库存扣减。通过对比多种方案,阐述了Redis+Lua作为黄金搭档的技术原理,并提供了从基础扣减到预扣减模型的完整代码实现,确保在高并发下数据的一致性与系统性能。

weixin_29219539的博客 503

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

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

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

大模型训练显存瘦身全记录:从ZeRO-3参数分区到CPU Offload的硬件协奏曲

本文详细解析了如何通过ZeRO-3参数分区与CPU/NVMe卸载技术优化大模型训练的显存使用。结合bf16混合精度与梯度累积等策略,实现在消费级GPU上高效训练百亿参数模型,显著提升硬件利用率与训练效率。

weixin_29051245的博客 435

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

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

shyidong的博客 398

VSCode玩转ESP-ADF音频开发:从环境搭建到成功播放MP3的避坑全流程

本文详细介绍了如何在VSCode环境下使用ESP-ADF框架进行ESP32音频开发,从环境搭建到成功播放MP3的全流程。重点解析了`IDF_PATH`和`ADF_PATH`的配置问题,以及如何解决`xTaskCreateRestrictedPinnedToCore`等常见编译错误,帮助开发者快速上手ESP-ADF音频开发。

weixin_42520909的博客 339

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

[PCIE5.0] 2.2.8.3 Error Signaling Messages

错误信号消息用于在 PCI Express 设备之间传递错误信息,帮助系统发现并报告错误。每当发生某种错误时,检测到该错误的设备会通过发送这些消息来通知系统。• 没有数据负载:这些错误信号消息不包含任何数据(即 TLP Type 是 Msg),它们仅用于错误报告。• 长度字段保留:在这些消息中,长度字段是保留的,不使用。• 功能号(Function Number)字段:这个字段标识哪个设备发生了错误。

系统固件工程师 292

【网络基础2】路由器的 “两扇门”:二层接口和三层接口到底有啥不一样?

家里的路由器背后总有几个网线接口,有的标着 “LAN”,有的标着 “WAN”;公司机房的路由器上,接口更是五花八门,有的插着网线,有的连着光纤,旁边还贴着 “GE0/0/1”“Eth-Trunk1” 这样的标签。你可能会想:不就是插网线的地方吗?有啥区别?其实,这些接口分 “二层接口” 和 “三层接口”,它们的作用差得远了 —— 就像你家的门,有的是 “小区内的单元门”(只通小区内部),有的是 “小区的大门”(能通往外面的世界)。接下来,咱们用大白话 + 生活例子,一点点把这两种接口讲透。

jundao1997的专栏 565

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

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

xiaozhu0922的博客 911

【Unity】【Photon】Photon Fusion2 的核心Unity组件 NetworkRunner 学习笔记

本文是学习Photon Fusion2 的核心Unity组件 NetworkRunner的学习笔记。

O青草O的博客 Unity和游戏制作知识分享 1271

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

奥利给

古道西风 357

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

自定义的dialog,文本编辑

qq_28195645的博客 1083

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

holily_的博客 1086

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

扫码枪 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、付费专栏及课程。

余额充值