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

Cocos Creator 3D音频定位实战:从原理到沉浸感实现

3D音频定位是游戏开发中实现沉浸感的关键技术,其核心原理基于HRTF(头部相关传输函数)模型,模拟声音在空间中的传播与双耳感知差异。这项技术通过赋予声音空间坐标、距离衰减和方向属性,将音频从背景元素提升为可交互的环境线索,极大增强了虚拟世界的真实感与玩家的空间认知。在工程实践中,开发者需要深入理解声源、听者、衰减曲线与多普勒效应等基础概念,并合理运用音频池、优先级管理与动态混音等技术手段来平衡效果与性能。对于Cocos Creator开发者而言,无论是使用引擎原生的AudioSource组件构建轻量级方案,

weixin_30972263的博客 291

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

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

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

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

嵌入式开发必备:手把手教你用DB-9连接器搞定RS-232串口通信(附万用表测试技巧)

本文详细解析了嵌入式开发中RS-232串口通信的硬件连接核心。从DB-9连接器的引脚定义入手,深入讲解DTE与DCE设备角色,明确直连线与交叉线的选择法则,并重点分享了使用万用表进行线缆连通性测试、电压测量及故障诊断的实战技巧,帮助开发者彻底掌握串口通信的硬件连接与排查方法。

tgb345678的博客 1166

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

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

shyidong的博客 398

从编解码芯片看Tesla T4的隐藏实力:双NVDEC如何实现70路1080P解码?

本文深入剖析了英伟达Tesla T4显卡的隐藏实力,重点解读其独特的双NVDEC硬件解码器设计如何突破性能瓶颈。通过分析Turing架构、对比HEVC/H.264解码差异,并结合驱动与SDK优化,揭示了实现高达70路1080P视频流并发解码的原理与实战配置,为云游戏、直播转码等高并发场景提供高效解决方案。

weixin_29209801的博客 485

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

HFSS仿真3dB微带双分支定向耦合器学习笔记

设计一个3dB微带双分支定向耦合器,各端口微带线特性阻抗为50Ω,中心频率为5GHz,介质基板的介电常数9.6,基板厚度为0.8mm这里重点讲解HFSS的操作,关于理论知识后面文章更新。

qq_36521926的博客 7768

Python之abbrobotegm包语法、参数和实际应用案例

`abbrobotegm` 是用于控制 ABB 机器人的 Python 接口包,主要通过 EGM(Externally Guided Motion,外部引导运动)协议与 ABB 机器人控制器进行通信,实现对机器人的实时位置控制、状态监控和运动引导等功能。该包适用于需要将 ABB 机器人与外部系统(如视觉系统、传感器等)集成的场景。

王国平的博客 1254

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

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

xiaozhu0922的博客 911

【SpringCloud】5、Spring Cloud Gateway网关路由规则

Spring Cloud Gateway 创建 Route 对象时, 使用 RoutePredicateFactory 创建 Predicate 对象,Predicate 对象可以赋值给 Route。

JACKAL 3万+

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

奥利给

古道西风 357

QT实现图片ROI区域的框选、移动、缩放(附完整源码)

QT实现图片ROI区域的框选、移动、缩放(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1193

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

自定义的dialog,文本编辑

qq_28195645的博客 1083

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

holily_的博客 1086

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

余额充值