Android的EditText超出字数限制,给用户提示

导语

如果项目着急使用,直接将下面代码复制到项目中,当做自定义的EditText使用就可以了。
建议将后面的解决思路看一遍,增强自己阅读源码的能力。

自定义的MaxLengthEditText

/*** Created by Kevin on 2016/6/12.* EditText如果限制了最大输入,超出的话,给出相应的提示*/
public class MaxLengthEditText extends EditText {public MaxLengthEditText(Context context, AttributeSet attrs) {super(context, attrs);initLength(attrs, context);}public MaxLengthEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initLength(attrs, context);}private void initLength(AttributeSet a, Context context) {//命名空间(别告诉我不熟悉)String namespace = "http://schemas.android.com/apk/res/android";//获取属性中设置的最大长度int maxLength = a.getAttributeIntValue(namespace, "maxLength", -1);//如果设置了最大长度,给出相应的处理if (maxLength > -1) {setFilters(new InputFilter[]{new MyLengthFilter(maxLength,context)});}}/*** 从源码中复制出来的* 来源:InputFilter.LengthFilter*** 这里只是添加了一句话:*              Toast.makeText(context, "字数不能超过" + mMax, Toast.LENGTH_SHORT).show();** This filter will constrain edits not to make the length of the text* greater than the specified length.*/class MyLengthFilter implements InputFilter {private final int mMax;private Context context;public MyLengthFilter(int max, Context context) {mMax = max;this.context = context;}public CharSequence filter(CharSequence source, int start, int end, Spanned dest,int dstart, int dend) {int keep = mMax - (dest.length() - (dend - dstart));if (keep <= 0) {//这里,用来给用户提示Toast.makeText(context, "字数不能超过" + mMax, Toast.LENGTH_SHORT).show();return "";} else if (keep >= end - start) {return null; // keep original} else {keep += start;if (Character.isHighSurrogate(source.charAt(keep - 1))) {--keep;if (keep == start) {return "";}}return source.subSequence(start, keep);}}/*** @return the maximum length enforced by this input filter*/public int getMax() {return mMax;}}
}

解决思路

我们是怎么限制输入长度的?

一般,我们是在xml中限制EditText的输入长度的,代码如下:

<EditText
    android:id="@+id/edit_text"android:layout_width="match_parent"android:layout_height="wrap_content"android:maxLength="5" />

思考:在EditText的源码中,肯定做了某些操作,使得在字符的长度超过5时,我们没有办法再输入任何内容
所以在EditText中查找“maxLength”,看源码中做了什么操作

在EditText查找maxLength相关的部分

在搜索栏中搜索maxLength,你会得到下面的结果

没有结果,那么我们从EditText的父类TextView中取搜索,会搜索到以下部分:



解读代码

第一张图片的代码

//maxlength的默认值为-1
int maxlength = -1;

第二张图片的代码

//如果设置了maxlength的属性,获取设置的值,否则为-1
case com.android.internal.R.styleable.TextView_maxLength:maxlength = a.getInt(attr, -1);break;

第三张图片的代码

if (maxlength >= 0) {//如果设置了maxlength,给TextView设置相应的过滤器:LengthFilter//具体的操作,可能就在LengthFilter中setFilters(new InputFilter[] { new InputFilter.LengthFilter(maxlength) });
} else {//没有设置maxLength,设置一个空的过滤器setFilters(NO_FILTERS);
}

LengthFilter中代码的分析

 /*** This filter will constrain edits not to make the length of the text* greater than the specified length.*/public static class LengthFilter implements InputFilter {private final int mMax;//通过构造方法,将maxlength赋值给mMaxpublic LengthFilter(int max) {mMax = max;}public CharSequence filter(CharSequence source, int start, int end, Spanned dest,int dstart, int dend) {//这里的操作可能不太懂,但是这种格式可以简化一下,成为://int keep = mMax - x;//可以猜想:keep表示当前字符超出maxLength的大小int keep = mMax - (dest.length() - (dend - dstart));//这里对keep的值分别作了判断://keep<=0:也就是当前输入的字符数量大于或者等于maxLength//返回"",当字符数量达到maxLength时,我们不能再输入内容,""符合我们的认知if (keep <= 0) {//可以尝试在这里打印日志,看看是否符合我们的需求(这里运气比较好,一次实验就会达到目的,然后就可以封装成一开始给出的代码)return "";} else if (keep >= end - start) {return null; // keep original} else {keep += start;if (Character.isHighSurrogate(source.charAt(keep - 1))) {--keep;if (keep == start) {return "";}}return source.subSequence(start, keep);}}/*** @return the maximum length enforced by this input filter*/public int getMax() {return mMax;}}

如何自定义一个EditText

Created with Raphaël 2.1.0 开始 获取maxLength 判断maxLength>-1? 给EditText添加自定义的过滤器 自定的过滤器只是在源码的基础上做一些小修改,可以复制过来 在keep <= 0的判断下添加提示操作 结束 不做处理 yes no

自定义的EditText代码详情已经在上面的注释加了,这里就不在重复了

结语

看到这里,你可能发现,解决思路也不是很复杂,源码好像也就是那样,只是平常不愿意看而已
Android作为一个开放的平台,我们一定要利用好源码这一部分来提高自己

转载请标明出处http://blog.csdn.net/qq_26411333/article/details/51647888

Android的EditText超出字数限制,给用户提示相关推荐

  1. Android中EditText输入字数统计和限制

    应用场景就是edittext框 下边是字数显示,有字数的限制.比较简单直接上代码了: private int num = 100; //etNoteContent是EditText etNoteCon ...

  2. android edittext输入邮箱,[Android教程]EditText怎样限制用户的输入?数字/字母/邮箱

    有输入必有验证.为了防止用户随便输入确保提交数据的合法性,程序不得不在文本输入框(EditText)中增加限制或验证. 关于输入类型有数字.字母.邮箱.电话等形式,这些具体得根据业务来.那么Andro ...

  3. android edittext字数显示不全,Android的EditText字数检测和限制解决办法

    Android的EditText字数检测和限制解决办法 控件EditText在Android布局中经常用到,对EditText中输入的内容也经常需要进行限制,我们可以通过TextWatcher去观察输 ...

  4. Android之EditText属性详解

    一:EditText简介 EditText是一个非常重要的组件,可以说它是用户和Android应用进行数据传输的窗户,有了它就等于有了一扇和Android应用传输的门,通过它用户可以把数据传给Andr ...

  5. android edittext设置多行,在Android的EditText视图中允许多行?

    在Android的EditText视图中允许多行? 如何在Android的EditText视图中允许多行? 12个解决方案 981 votes 默认情况下,Android中的所有EditText小部件 ...

  6. Android TextView,EditText要求固定行数自动调整TextSize

    最近项目有个需求要求文本最多显示3行,继续输入则字体变小,删除已经输入的文字,那么字体变大,不管变大变小都不能超过3行.网上怎么找也找不到相关的解决方案,自己动手,丰衣足食了! 说一下算法思路,后面给 ...

  7. Android中EditText隐藏/自动弹出输入法的问题

    有些时候我们的应用需要在EditText聚焦时自动弹出输入法,或者隐藏输入法,关于输入法弹出,一般不会有什么问题.但是,有一些情况输入法是没发自动弹出的,比如弹出的对话框里有edittext,介绍一些 ...

  8. android 布局覆盖 超出一部分_内容超出

    内容审核 Moderation 内容审核(Content Moderation),基于图像.文本.视频检测技术,可自动进行涉黄.广告.涉政涉暴.涉政敏感人物等内容检测,帮助客户降低业务违规风险 公测服 ...

  9. android edittext光标太大,Android中EditText样式修改 聚焦光标、背景

    在Android开发中,根据项目的需求,需要定制一些特殊的样式,例如:使用EditText时,聚焦时的背景及光标图片使用自定义而非android系统默认的.这两天,在项目中涉及此需求,现记录如下: 首 ...

最新文章

  1. 【自动化__持续集成】___java___重载
  2. monolith_将Java EE Monolith雕刻成微服务
  3. SpringBoot学习笔记2
  4. Unity超基础学习笔记(四)
  5. vnpy学习11_增加测试评估指标
  6. 蓝桥杯 ADV-11 算法提高 Torry的困惑(提高型)
  7. 怎么用图片编辑器给证件照换底色
  8. Endnote快速上手
  9. android rndis win10,win10系统安装驱动Rndis的教程介绍
  10. Mip-NeRF 360
  11. 手机投屏到电脑显示屏
  12. 牛客小白月赛37 E.紫妹永不服输(构造)
  13. 学习ZYNQ之FPGA2(开发板资源初探)
  14. 卡塔兰(Catalan)数
  15. 2022年全球与中国POS终端市场现状及未来发展趋势
  16. 服务器维护之后大角会刷新吗,大角刷新地点(魔兽世界阿克图瑞斯刷新时间)...
  17. 百度智能云体验馆领取CDN及24小时急速收录
  18. [SCU 4499] 表达式 (IDA*)
  19. depot_tools_tutorial
  20. 如何从ZINC数据库下载小分子用于虚拟筛选

热门文章

  1. VnTrader的数据流
  2. Flask中post和get的区别
  3. C++公有继承,保护继承,私有继承的区别
  4. JMeter循环控制器的使用
  5. 再谈什么是【组织能力】
  6. 开学季蓝牙耳机怎么选?蓝牙耳机性价比排行
  7. this关键字和super关键字
  8. 不协调的世界(2)-肉猪养殖
  9. 苹果系统笔记本更新PHP版本,mac如何升级系统版本
  10. mysql8.0 java数据库连接(JDBC) url配置参数解释