安卓beforetextchanged_安卓onTextChanged参数解释及实现EditText字数监听 Editable使用

尊重原作者:此篇文章是借鉴原作者地址 的博文 并进行修改和增加补充说明,我只是补充和修改:

我感觉这篇文章经过我的补充 市面多少文本操作变化 你都知道怎么做了.并且感觉是非常详细关于 android 文本编辑框的文本变化 并且通俗易懂(内含动态图),

为了大家方便查看 我这里复制作者博文内容 并且修正部分内容 后面在补充

我正参加CSDN明日之星比赛 还希望您投我一票

原作者部分(修改部分)

由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher。

它有三个成员方法,第一个after很简单,这个方法就是在EditText内容已经改变之后调用,重点看下面两个方法:

beforeTextChanged(CharSequence s, int start, int count, int after)

这个方法是在Text改变之前被调用,它的意思就是说在原有的文本s中,从start开始的count个字符将会被一个新的长度为after的文本替换,注意这里是将被替换,还没有被替换。

onTextChanged(CharSequence s, int start, int before, int count)

这个方法是在Text改变过程中触发调用的,它的意思就是说在原有的文本s中,从start开始的count个字符替换长度为before的旧文本,注意这里没有将要之类的字眼,也就是说一句执行了替换动作。

可能说起来比较抽象,我举个简单的例子,比如说我们监听一个EditText,默认开始的时候EditText中没有文本,当我们输入LOVE四个字母的时候,在打印信息中我输出各个参数看一下参数的变化。

10-18 16:40:21.528: D/Debug(4501): beforeTextChanged 被执行----> s=----start=0----after=1----count=0

10-18 16:40:21.528: D/Debug(4501): onTextChanged 被执行---->s=L----start=0----before=0----count=1

10-18 16:40:21.532: D/Debug(4501): afterTextChanged 被执行---->L

10-18 16:40:29.304: D/Debug(4501): beforeTextChanged 被执行----> s=L----start=1----after=1----count=0

10-18 16:40:29.308: D/Debug(4501): onTextChanged 被执行---->s=LO----start=1----before=0----count=1

10-18 16:40:29.308: D/Debug(4501): afterTextChanged 被执行---->LO

10-18 16:40:32.772: D/Debug(4501): beforeTextChanged 被执行----> s=LO----start=2----after=1----count=0

10-18 16:40:32.772: D/Debug(4501): onTextChanged 被执行---->s=LOV----start=2----before=0----count=1

10-18 16:40:32.776: D/Debug(4501): afterTextChanged 被执行---->LOV

10-18 16:40:34.772: D/Debug(4501): beforeTextChanged 被执行----> s=LOV----start=3----after=1----count=0

10-18 16:40:34.772: D/Debug(4501): onTextChanged 被执行---->s=LOVE----start=3----before=0----count=1

10-18 16:40:34.776: D/Debug(4501): afterTextChanged 被执行---->LOVE

通过上面的打印信息我们可以发现在输入L之前beforeTextChanged被执行,s为空,所以s输入空,start=0,也就是从位置0开始,count=0,也就是0个字符将会被替换,after=1,也就是说0个字符将会被一个新的长度为after=1的文本(也就是L)替换。

当输入发生改变的时候onTextChanged被执行,此时s=L也就是输入的字母L,从start=0开始,count=1个字符替换了长度为before=0的旧文本。通俗点将就是字母L从位置0开始替换了原来的空文本,下面的就可以依次类推了。那么我们如何利用这个接口监听EditText的文本变化来实现限制输入字数的功能呢,我相信大家都有自己的想法了,这里我给出自己的一个简单实现,主要代码如下:

source_des.addTextChangedListener(new TextWatcher() {

private CharSequence temp;

private int selectionStart;

private int selectionEnd;

@Override

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

Log.d(TAG, "onTextChanged 被执行---->s=" + s + "----start="+ start

+ "----before="+before + "----count" +count); temp = s;

}

public void beforeTextChanged(CharSequence s, int start, int count,int after) {

Log.d(TAG, "beforeTextChanged 被执行----> s=" + s+"----start="+ start

+ "----after="+after + "----count" +count);

}

public void afterTextChanged(Editable s) {

Log.d(TAG, "afterTextChanged 被执行---->" + s);

//获取光标开始的位置

selectionStart = source_des.getSelectionStart();

//获取光标结束的位置

selectionEnd = source_des.getSelectionEnd();

//这里其实selectionStart == selectionEnd

// 大家可以把获取的位置放入beforeTextChanged 然后选择部分文字(选择部分位置用光标选择2个以上) 删除可以看到效果 我后面做实验

if (temp.length() > MAX_LENGTH) {

Toast.makeText(MainActivity.this, "只能输入九个字",

Toast.LENGTH_SHORT).show();

//删除部分字符串 为[x,y) 包含x位置不包含y

//也就是说删除 位置x到y-1

s.delete(selectionStart - 1, selectionEnd);

int tempSelection = selectionEnd;

//这里我修改了原作者 不需要这部

//source_des.setText(s);

//如果你setText 传入s 的话会将编辑框的光标移到文本框最前面 所以这里我也注释了原作者

//source_des.setSelection(tempSelection);

}

}

});

补充部分

好了大家看到了增加文本动态监听 那么我们看看删除会怎么触发事件

实验代码:

editText.addTextChangedListener(new TextWatcher() {

private CharSequence temp;

private int selectionStart;

private int selectionEnd;

@Override

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

Log.d(TAG, "onTextChanged 被执行---->s=" + s + "----start="+ start

+ "----before="+before + "----count" +count); temp = s;

Log.e(TAG, "onTextChanged--getSelectionStart: " + editText.getSelectionStart());

Log.e(TAG, "onTextChanged---getSelectionEnd: " + editText.getSelectionEnd());

}

public void beforeTextChanged(CharSequence s, int start, int count,int after) {

Log.d(TAG, "beforeTextChanged 被执行----> s=" + s+"----start="+ start

+ "----after="+after + "----count" +count);

Log.e(TAG, "beforeTextChanged---getSelectionStart: " + editText.getSelectionStart());

Log.e(TAG, "beforeTextChanged---getSelectionEnd: " + editText.getSelectionEnd());

}

public void afterTextChanged(Editable s) {

Log.d(TAG, "afterTextChanged 被执行---->" + s);

selectionStart = editText.getSelectionStart();

selectionEnd = editText.getSelectionEnd();

Log.e(TAG, "afterTextChanged---getSelectionStart: " + editText.getSelectionStart());

Log.e(TAG, "afterTextChanged---getSelectionEnd: " + editText.getSelectionEnd());

}

});

我们这里输入LOVE然后删除’ov’两个字母看看会发生

动态图显示步骤:

6869f63dde85dc533e0eadd42089b61f.gif

可以看到我把光标放入ov外面 那么光标开始位置为1 ,结束位置为3.然后删除

我们看看日志

12-03 12:20:22.355 21082-21082/a.fmy.com.test D/FMY: beforeTextChanged 被执行----> s=love----start=1----after=0----count2

12-03 12:20:22.355 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionStart: 1

12-03 12:20:22.355 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionEnd: 3

12-03 12:20:22.359 21082-21082/a.fmy.com.test D/FMY: onTextChanged 被执行---->s=le----start=1----before=2----count0

12-03 12:20:22.359 21082-21082/a.fmy.com.test E/FMY: onTextChanged--getSelectionStart: 1

12-03 12:20:22.359 21082-21082/a.fmy.com.test E/FMY: onTextChanged---getSelectionEnd: 1

12-03 12:20:22.412 21082-21082/a.fmy.com.test D/FMY: afterTextChanged 被执行---->le

12-03 12:20:22.412 21082-21082/a.fmy.com.test E/FMY: afterTextChanged---getSelectionStart: 1

12-03 12:20:22.412 21082-21082/a.fmy.com.test E/FMY: afterTextChanged---getSelectionEnd: 1

这里我放一张有颜色区分图片 (和上面一样的 只不过方便大家查看)

9f8590e911c6cc59acb9281f7dc931a6.png

我们先来看看beforeTextChanged的日志部分

12-03 12:20:22.355 21082-21082/a.fmy.com.test D/FMY: beforeTextChanged 被执行----> s=love----start=1----after=0----count2

12-03 12:20:22.355 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionStart: 1

12-03 12:20:22.355 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionEnd: 3

s:文字没有改变前字符串

start:准备要变化文本的位置下标 ,我们这里选择’ov’位置 所以这里相对应’love’位置为1

count:相对没改变前旧文本文本减少数量 因为我们这里要删除’ov’所以为2

after:新文本新加入的字符数量 这里没有增加反而减少 所以为0

getSelectionStart:我们光标的位置不是o的左边吗?所以为1

getSelectionEnd:光标位置在v右边 所以为3 大家回去看下动态图

我们最后来看一下另外onTextChanged

这部分的日志如下:

12-03 12:20:22.359 21082-21082/a.fmy.com.test D/FMY: onTextChanged 被执行---->s=le----start=1----before=2----count0

12-03 12:20:22.359 21082-21082/a.fmy.com.test E/FMY: onTextChanged--getSelectionStart: 1

12-03 12:20:22.359 21082-21082/a.fmy.com.test E/FMY: onTextChanged---getSelectionEnd: 1

s:被改变后的文本 因为我们这里删除删除’ov’ 所以为le

start:文本开始改变的位置 ‘ov’相对原本文本的开始位置1,所以这里返回1

before:改变之前旧文本减少的数量 这里 ‘love’减少 ‘ov’相当于减少了2

count:新文本添加数量 这里是减少2所以返回0

getSelectionStart 这里删除后的光标状态 所以等于1

getSelectionEnd 这里删除后的光标状态 所以开始坐标等结束坐标 因此等于1

补充部分2

我们假设剪切板内容’12’ (意思是说我们赋值了12字符串在剪切板,只要一粘贴就会出现’12’)

那么我们做一个实验 在love上 用光标选择’ov’ 然后粘贴’12’

动态图(大家耐心等下):

0153d237e129dc783000779bca5cc34a.gif

这里日志为:

12-03 12:51:25.347 21082-21082/a.fmy.com.test D/FMY: beforeTextChanged 被执行----> s=love----start=1----after=2----count2

12-03 12:51:25.347 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionStart: 3

12-03 12:51:25.347 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionEnd: 3

12-03 12:51:25.348 21082-21082/a.fmy.com.test D/FMY: onTextChanged 被执行---->s=l12e----start=1----before=2----count2

12-03 12:51:25.348 21082-21082/a.fmy.com.test E/FMY: onTextChanged--getSelectionStart: 3

12-03 12:51:25.348 21082-21082/a.fmy.com.test E/FMY: onTextChanged---getSelectionEnd: 3

12-03 12:51:25.378 21082-21082/a.fmy.com.test D/FMY: afterTextChanged 被执行---->l12e

12-03 12:51:25.378 21082-21082/a.fmy.com.test E/FMY: afterTextChanged---getSelectionStart: 3

12-03 12:51:25.379 21082-21082/a.fmy.com.test E/FMY: afterTextChanged---getSelectionEnd: 3

这里我就简单说下光标位置的问题:因为替换相同长度的文本 所以光标并没有移动 位于选择的字符串+1的 位置 ,我们这里选择’ov’ 所以开始和结束为:3 (o的位置)

beforeTextChanged 日志解释:

12-03 12:51:25.347 21082-21082/a.fmy.com.test D/FMY: beforeTextChanged 被执行----> s=love----start=1----after=2----count2

12-03 12:51:25.347 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionStart: 3

12-03 12:51:25.347 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionEnd: 3

start:文本开始位置,因为我们从’ov’的’o’开始改变所以为1(love中o不是相对是1嘛)

after:新文本增加的数量 因为增加了12所以两个字符就是2

count:原本旧字符串减少的数量 减少’ov’所以是2

其他的同学们可以自己推断

补充部分3

这里我们再看看替换不同长度的文本

我们这里 光标选择’ov’ 替换为’12345’(剪切板以保存)

0d784eb9cee7aedfcec370d03d743fe6.gif

12-03 13:01:25.735 21082-21082/a.fmy.com.test D/FMY: beforeTextChanged 被执行----> s=love----start=1----after=5----count2

12-03 13:01:25.735 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionStart: 3

12-03 13:01:25.735 21082-21082/a.fmy.com.test E/FMY: beforeTextChanged---getSelectionEnd: 3

12-03 13:01:25.737 21082-21082/a.fmy.com.test D/FMY: onTextChanged 被执行---->s=l12345e----start=1----before=2----count5

12-03 13:01:25.737 21082-21082/a.fmy.com.test E/FMY: onTextChanged--getSelectionStart: 6

12-03 13:01:25.737 21082-21082/a.fmy.com.test E/FMY: onTextChanged---getSelectionEnd: 6

12-03 13:01:25.770 21082-21082/a.fmy.com.test D/FMY: afterTextChanged 被执行---->l12345e

12-03 13:01:25.770 21082-21082/a.fmy.com.test E/FMY: afterTextChanged---getSelectionStart: 6

12-03 13:01:25.770 21082-21082/a.fmy.com.test E/FMY: afterTextChanged---getSelectionEnd: 6

可以 替换字符串的时候光标 开始等于结束的

补充部分4 Editable

我们想直接操作文本编辑框的文本的时候 想快速插入和添加 可以考虑这个方法

我们看看两个例子 获取 文本编辑框中的字符串并且添加 ‘你好’在后面;

不使用Editable

String s = editText.getText().toString();

s +="你好";

editText.setText(s);

来我们看看使用Editable

editText.getText().append("你好");

我们看看怎么获取Editable

非常简单只需要用文本编辑框调用getText()方法

Editable text=editText.getText();

相关API

在文本编辑框后面添加字符串

Editable editable = editText.getText();

editable.append("你好");

删除文本编辑框部分内容,假设你此时文本编辑框的内容’love’你想删除中间的ov

Editable editable = editText.getText();

//start为要删除文本的开始下标 end为结束下标(不包括)

//也就是说 [start,end)

//editable.delete(start,end);

//注意end必须等于start 不然奔溃

// 也就是 end>=start

//我们看看删除love 中的ov

editable.delete(1,3);

在文本编辑框中字符串的某个部分插入字符,假设我们的文本编辑框内容为’love’那么我们想插入 ‘a’到’o’后面也就是’loave’

Editable editable = editText.getText();

String a = "a";

//love 插入o后面 o位置相对于字符的1

//第一个参数 插入 的位置

// 第二个参数 要插入字符串

// 第三个参数 插入的字符串的开始位置

// 第四个参数 插入的字符串的结束位置(不包含)

editable.insert(1,"a",0,a.length());

// 下面方法和上面的等价

//editable.insert(1,"a");

删除文本编辑框所有内容

Editable editable = editText.getText();

editable.clear();

替换文本编辑框部分内容

假设我们将文本框 ‘love’中”o”替换为”a” 也就是说’lave’

Editable editable = editText.getText();

//第一个参数 替换位置

//第二个 替换结束为止(不包含)

//第三个 替换的字符串

editable.replace(1,2,"a");

String a = "a";

//第一个参数 替换位置

//第二个 替换结束为止(不包含)

//第三个 替换的字符串

//第四个 替换文本的开始位置

//第五个 替换文本结束位置 不包含

editable.replace(1,2,"a",0,a.length());

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

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

相关文章

mysql存储过程捕获错误处理_mysql存储过程之异常处理篇

mysql存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现语法如下:DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT condition_value: SQLSTATE [VALUE] sqlstate_value | con…

memlock mysql_mysql配置详解(不断更新)

1. back_log指定MySQL可能的连接数量。当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在…

mysql c2_Mysql具有C2级安全性

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼those who are authorized for audit data. The TCB shall be able to record the following types of events: use of identificationand authentication mechanisms, introduction or objects into a users address space (e.g.,…

mysql orm c语言_【译】Simple MySQL ORM for C

一直不知道有ORM这种东西,直到和 海坡 交流后才接触。在项目中,需要将数据存储到数据库中,首先想到的是生成各种raw SQL的解决方法。但随着项目的进展,发现它很不灵活。譬如可能因为有新的需求,在数据库student表中添加…

ruby mysql 占位符_ruby操作常用数据库

使用Ruby DBI模块目录Ruby DBI模块为ruby程序访问数据库提供了一个与数据库无关的接口,就像perl的DBI模块一样。这篇文章将讲述如何编写基于DBI的ruby程序。这篇文章是对DBI规范文档(specification documents)的补充,而不是要替代规范文档,更…

threejs获取模型坐标_Threejs倒影实现解析

倒影是在自然界中非常常见的一种现象,例如水面倒影、镜子。我们都知道,眼睛之所以能够看到某个物体,是因为物体本身能够发光或者物体能够反射其它的物体所发的光,这些光进入到我们的眼里就形成了该物体影像。倒影形成也是一种光学…

aws java mysql_java - AWS EC2 / MySql - spring boot无法从datasource确定jdbc url - 堆栈内存溢出...

我有一个简单的Spring Boot应用程序,我试图在基于Amazon AMI的Amazon EC2实例上部署。 它使用MySql数据库(版本8.0.15)。我在AWS上创建了数据库,当我从本地系统指向它的配置时,它可以工作。 我也可以从MySql Workbench访问它。但是当我将Spri…

debian 删除mysql数据库_Debian中完全卸载MySQL的方法

作者: 字体:[增加 减小] 类型:转载这篇文章主要介绍了Debian中完全卸载MySQL的方法,同时介绍了清理方法,可以做到彻底卸载mysql,需要的朋友可以参考下之前服务器上配置测试用的服务环境,我偷懒顺手用网上现成的脚本进行安装&#…

python123外汇兑换计算器_Python 3.x--使用re模块,实现计算器运算实例

1 importre23 #乘除运算处理,可以处理不含括号的加减和乘除函数(只处理乘除)4 defmulti_and_divi(arg):5 #传入参数为列表,如:[3*2-1*9/3,0]6 val arg[0]7 #对字符串进行乘除匹配:如3*2-1*9/3,就匹配:3*28 …

python修改文件名字数字_python实现多进程按序号批量修改文件名的方法示例

本文实例讲述了python实现多进程按序号批量修改文件名的方法。分享给大家供大家参考,具体如下:说明文件名命名方式如图,是数字序号开头,但是中间有些文件删掉了,序号不连续,这里将序号连续起来,…

遗传算法求函数最大值实验_小知识:什么是遗传算法

1 什么是遗传算法遗传算法(GeneticAlgorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;…

$dbms=mysql_Oracle dbms

Oracle dbms_random包的用法 Oracle dbms_random包的用法 1.dbms_random.value方法 dbms_random是一个可以生成随机数或者字符串的程序包。这个包有initialize()、seed()、terminate()、value()、normal()、random()、string()等几个函数,但value()是最常用Oracle d…

js定位div坐标存入mysql_JavaScript与Div 对层定位和移动获得坐标

1:移动图层 获得点的x轴y轴坐标,从而进行绝对定位(注意:竖拉框会影响 x 轴 y 轴坐标值)var x,y,z,downfalse,objfunction init(){objevent.srcElement //事件触发对象obj.setCapture() //设置属于当前对象的鼠标捕捉zobj.style.zIndex …

mysql 不指定 长度吗_mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?...

原先对mysql不太理解,但也没有报错。但理解的不够深入。这次补上。原来以为int(11)是指11个字节,int(10)就是10个字节。我错了。http://zhidao.baidu.com/link?urlpuYWaGBQNKNHgffO5kdvXshF3KmX8OuB4Mor3HXapbNHa8m1CdlF8PJTqVuKa1eKcEd6Bv2NKUr3I-KJr5…

python绘制折线图显示数据_漂亮图表也可用python信手拈来!一文教你学会用Python绘制堆积折线图...

今天,和大家聊聊关于Python绘图相关的东东哦,还是和大家继续深耕Python经典的matplotlib库哦!好啦,咱们就开始吧!首先,咱们聊聊如何在Python中去绘制经典的堆积折线图到这可能有些朋友可能会问了&#xff1…

linux下使用odbc连接mysql_Linux环境下通过ODBC访问MSSql Server

为了解决Linux系统连接MSSql Server的问题,微软为Linux系统提供了连接MSSql Server的ODBC官方驱动。通过官方驱动,Linux程序可以方便地对MSSql Server进行访问。官网提供了三个版本的驱动,分别用于以下发行版的Linux系统:64bit Re…

python画图代码对比_Python实现代码差异对比分析

在写代码过程,有时需要对比查看两个代码文件的不同,肉眼查看费事费力,很难进行对比找出不同。例如,程序运行报错时,会对比自己先前写的代码或者参考别人代码,有哪些地方不对,此时便可以通过该程…

insert into user mysql root_跳过授权表登录后使用insert into创建root权限用户

起因:刚刚搭建好的mysql数据库,做基础优化时,不小心把所有用户都删除了,并且退出了。没办法,只好跳过授权表登录,新建root用户。过程如下:一、停掉mysql,跳过授权登录[rootexplnk-za…

matplotlib 设置标注方向_Python 使用matplotlib画图添加标注、及移动坐标轴位置

import matplotlib.pyplot as pltimport matplotlibimport numpy as np#解决中文乱码问题,引入windows字体库myfont matplotlib.font_manager.FontProperties(fnamerC:/Windows/Fonts/msyh.ttf)x np.linspace(-3,3,50)y 2*x 1plt.plot(x,y)plt.figure(1,figsize…

flyway配置mysql_Flyway快速上手教程

一、Flyway是什么官网解释地非常全面,可先大致阅读一下。简单地说,flyway是一个能对数据库变更做版本控制的工具。二、为什么要用Flyway在多人开发的项目中,我们都习惯了使用SVN或者Git来对代码做版本控制,主要的目的就是为了解决…