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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45270.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最好理解的,用jeecms搭建一个新闻发布网站

1 前期环境配置 首先需要有jdk、tomcat和mysql&#xff0c;这里对于不同的jeecms版本对以上三种要求是不同的&#xff0c;我本人用的是jdk1.8&#xff0c;tomcat7,mysql5的版本。我们这里需要将从官网下载的压缩包解压出的ROOT文件放入tomcat下面的webapp下&#xff0c;替换掉…

一粒云之钉钉集成

一粒云dingtalk集成- 文章目录 一粒云dingtalk集成-1、一粒云管理后台配置步骤&#xff1a;2、钉钉管理后台配置步骤&#xff1a;2.1、自建应用2.3、填好对应的信息&#xff0c;下一步2.4、申请开通所有的权限——选择全部员工2.5、基础信息->查看详情&#xff0c;获得appke…

YLBs CAPTCHA - 签到题_N种花式签到,任你活动千万场,总有一款适合你

数字化时代&#xff0c;科技办会的理念正在逐步深入每个主办方的心里&#xff0c;如何给参会嘉宾带去好的参会体验&#xff1f;如何在众多的签到方式中找到适合自己活动的签到&#xff1f;31会议给你几款花样签到方式&#xff0c;让你的大会科技感十足。 二 / 微 / 码 / 签/ 到…

Ai配音专家 免费配置教程(适用于mac和windows系统)

Ai配音专家 语音转文字免费配置教程&#xff08;适用于mac和windows系统&#xff09; 推荐一款免费文本转语音的软件&#xff0c;文件来源于github&#xff0c;如果你在做自媒体的时候也不想用真音&#xff0c;那这款软件绝对适合你。配置过程分为以下内容&#xff1a; Ai配音…

vue前端使用Jenkins自动构建项目,保姆级教程

1. 开始前的准备工作 1台服务器&#xff0c;1个镜像仓库&#xff0c;安装docker 练习的话&#xff0c;服务器可以在[阿里云上](https://www.aliyun.com/?spm5176.ecscore_.top-nav.dlogo.509a4df5JhX1PN)领取一个月免费ECS云服务器&#xff0c;如下图在阿里云控台界面搜索容器…

vue 3.x 中使用ele-image时相对路径的图片加载失败

参考文档&#xff1a; https://element.eleme.cn/#/zh-CN/component/installation 环境: Mac OS X 10.12 [zcmele 2]$node -v v12.6.0 [zcmele 3]$npm -v 6.9.0 [zcmele 4]$cnpm -v cnpm6.1.0 (/usr/local/lib/node_modules/cnpm/lib/parse_argv.js) npm6.10.2 (/usr/local/li…

创意3D立体logo设计难不难?怎么设计?

本文由:“学设计上兔课网”原创,图片素材来自网络,仅供学习分享 创意3D立体logo设计难不难?怎么设计?虽然是3D的效果,但是我们也可以通过平面设计软件AI或者PS软件来实现这种伪3D的视觉效果。首先我们来看一看做完的最终效果 1.多边形工具,填充为0,有描边。利用多边形…

PR开场片头模板创意立体3D动态logo展示pr模板

&#xff0c; PR开场片头模板 创意立方体3Dlogo展示pr模板 这是一个整洁和动态动画的Premiere Pro模板&#xff0c;带有一个旋转立方体&#xff0c;时尚地旋转以显示您的媒体。包含1个标志占位符和1个文本占位符。简单介绍您的演示文稿&#xff0c;幻灯片&#xff0c;电视节目…

3D logo制作

3D制作图片 这次用AI来制作3Dlogo,首先把一张立体形状的logo图导入AI里 使用钢笔工具先把侧面白色部分抠下来 像上图一样抠下来之后在菜单里点击效果3D然后选择凸起和斜角,为了更好的去调整3D图形的变化,先点击预览调整凸出厚度数值为482pt,然后再去调整上面的方向环绕…

C4D暑期计划打卡7.30(2)

完成logo破碎小动画跟做 为完成的logo主体添加材质、增加天空、摄像机目标、对主体内部集进行单独材质添加&#xff0c;渲染增加景深&#xff0c;增添变化。 四视图 透视图 渲染图1 渲染图2

修改mars3d内置的文字

在使用mars3d开发中可能会需要修改内置的文字&#xff0c;如下图 mars3d内置的文字都会统一放在 mars3d.lang 这个对象下管理。如下图 如果需要修改&#xff0c;可以使用如下的方式 mars3d.Lang["_单击完成绘制"][0] "单击完成绘制&#xff0c;右键取消绘制&q…

CSS之 2D转换---3D转换(内含过渡)

转换可以实现元素的位移、旋转、缩放等效果 2D转换 translate --- 移动rotate --- 旋转scale --- 缩放 1.translate 语法&#xff1a;(px) transform:translate(x,y); transform:translateX(n); transform:translateY(n); 不会影响其他元素的位置 &#xff08;会变成前后…

chatgpt赋能python:Python的文件导出功能

Python的文件导出功能 作为一种流行的编程语言&#xff0c;Python 提供了广泛的文件导出功能&#xff0c;方便了开发者的日常工作。在本文中&#xff0c;我们将分享如何使用 Python 导出.py 文件&#xff0c;以及如何最大程度地利用这个功能。 什么是.py 文件&#xff1f; 首…

月薪2万,被新同事15秒气走。

今年&#xff0c;AIGC掀起了巨浪&#xff0c;身边不少人感到前所未有的焦虑&#xff1a; 朋友圈好友晒出的AI美图&#xff0c;仅需15秒&#xff0c;竟比我2周的设计更出色&#xff1b; 公司用AI写的文案&#xff0c;转化率提升了10%&#xff0c;可能要优化人员了; 职场危机提前…

AIGC制作的“视觉大片”走红!耗时仅3天,首批玩家吃到“红利”了

3月26日&#xff0c;2023山东省旅游发展大会在青岛拉开帷幕,当天&#xff0c;一条动画小视频惊艳了现场所有人&#xff0c;这条视频很快登上了“学习强国”、微博等社交媒体平台。视频名为《AI眼中的崂山四季》&#xff0c;108秒&#xff0c;呈现了青岛崂山大约十个特色“网红打…

Midjourney注册教程

Midjourney 太火了&#xff01;无论你是画师、设计师&#xff0c;还是淘宝电商等&#xff0c;都不得不熟悉并利用这种超级牛逼的 AI 绘图工具&#xff0c;不然真的保不定哪天就被淘汰了&#xff01; Midjourney 怎么玩&#xff1f;相信很多小白还不清楚&#xff01;这不巧了么…

2023年10个爆火的AI工具,分分钟提高工作质量!

大家好。我是不知名 设计师l1m0_&#xff0c;今天分享内容为&#xff1a;2023年10个爆火的AI工具。对AI感兴趣的朋友一定不能错过&#xff0c;一起来看看吧。 2023年&#xff0c;AIGC爆发式增长&#xff0c;各类AI软件随之应运而生&#xff0c;衍生出不少的设计行业AI黑科技 &a…

基于协同过滤的旅游推荐系统 学渣的毕业设计总结

我的毕业设计选题是《基于协同过滤的旅游推荐系统的设计与实现》&#xff0c;用到了python语言&#xff0c;在pycharm中实现。系统主要包含用户的登录注册、个人信息管理、个性化推荐、景点查找、景点收藏评论和后台管理六大功能模块。同组的一个女生是电影推荐系统&#xff0c…

ProvChain: A Blockchain-based Data Provenance Architecture in Cloud Environment论文翻译+一点点理解

Abstract Cloud data provenance is metadata that records the history of the creation and operations performed on a cloud data object. 云数据源是一种对于云端数据对象记录创作和操作历史记录的元数据。 Secure data provenance is crucial for data accountability, …

多语言海外商城系统平台自带产品库一键铺货上架

在经济步入全球化的过程中&#xff0c;贸易已经不仅仅局限在某个地方交易&#xff0c;而是扩散到全球&#xff0c;因而&#xff0c;很多企业纷纷瞄准国外市场。而且&#xff0c;因为网络的高速发展&#xff0c;人们获取信息的来源越来越多&#xff0c;多语言商城系统就是其中之…