欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

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

    • 资源ID:3432173       资源大小:40.43KB        全文页数:13页
    • 资源格式: DOCX        下载积分:6.99金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要6.99金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    安卓onTextChanged参数解释及实现EditText字数监听 Editable使用安卓onTextChanged参数解释及实现EditText字数监听 Editable使用 由于最近做项目要检测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两个字母看看会发生 动态图显示步骤: 可以看到我把光标放入ov外面 那么光标开始位置为1 ,结束位置为3.然后删除 我们看看日志 12-03 12:20:22.355 21082-21082/.test D/FMY: beforeTextChanged 被执行-> s=love-start=1-after=0-count2 12-03 12:20:22.355 21082-21082/.test E/FMY: beforeTextChanged-getSelectionStart: 1 12-03 12:20:22.355 21082-21082/.test E/FMY: beforeTextChanged-getSelectionEnd: 3 12-03 12:20:22.359 21082-21082/.test D/FMY: onTextChanged 被执行->s=le-start=1-before=2-count0 12-03 12:20:22.359 21082-21082/.test E/FMY: onTextChanged-getSelectionStart: 1 12-03 12:20:22.359 21082-21082/.test E/FMY: onTextChanged-getSelectionEnd: 1 12-03 12:20:22.412 21082-21082/.test D/FMY: afterTextChanged 被执行->le 12-03 12:20:22.412 21082-21082/.test E/FMY: afterTextChanged-getSelectionStart: 1 12-03 12:20:22.412 21082-21082/.test E/FMY: afterTextChanged-getSelectionEnd: 1 这里我放一张有颜色区分图片 (和上面一样的 只不过方便大家查看) 我们先来看看beforeTextChanged的日志部分 12-03 12:20:22.355 21082-21082/.test D/FMY: beforeTextChanged 被执行-> s=love-start=1-after=0-count2 12-03 12:20:22.355 21082-21082/.test E/FMY: beforeTextChanged-getSelectionStart: 1 12-03 12:20:22.355 21082-21082/.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/.test D/FMY: onTextChanged 被执行->s=le-start=1-before=2-count0 12-03 12:20:22.359 21082-21082/.test E/FMY: onTextChanged-getSelectionStart: 1 12-03 12:20:22.359 21082-21082/.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 动态图(大家耐心等下): 这里日志为: 12-03 12:51:25.347 21082-21082/.test D/FMY: beforeTextChanged 被执行-> s=love-start=1-after=2-count2 12-03 12:51:25.347 21082-21082/.test E/FMY: beforeTextChanged-getSelectionStart: 3 12-03 12:51:25.347 21082-21082/.test E/FMY: beforeTextChanged-getSelectionEnd: 3 12-03 12:51:25.348 21082-21082/.test D/FMY: onTextChanged 被执行->s=l12e-start=1-before=2-count2 12-03 12:51:25.348 21082-21082/.test E/FMY: onTextChanged-getSelectionStart: 3 12-03 12:51:25.348 21082-21082/.test E/FMY: onTextChanged-getSelectionEnd: 3 12-03 12:51:25.378 21082-21082/.test D/FMY: afterTextChanged 被执行->l12e 12-03 12:51:25.378 21082-21082/.test E/FMY: afterTextChanged-getSelectionStart: 3 12-03 12:51:25.379 21082-21082/.test E/FMY: afterTextChanged-getSelectionEnd: 3 这里我就简单说下光标位置的问题:因为替换相同长度的文本 所以光标并没有移动 位于选择的字符串+1的 位置 ,我们这里选择ov 所以开始和结束为:3 (o的位置) beforeTextChanged 日志解释: 12-03 12:51:25.347 21082-21082/.test D/FMY: beforeTextChanged 被执行-> s=love-start=1-after=2-count2 12-03 12:51:25.347 21082-21082/.test E/FMY: beforeTextChanged-getSelectionStart: 3 12-03 12:51:25.347 21082-21082/.test E/FMY: beforeTextChanged-getSelectionEnd: 3 start:文本开始位置,因为我们从ov的o开始改变所以为1(love中o不是相对是1嘛) after:新文本增加的数量 因为增加了12所以两个字符就是2 count:原本旧字符串减少的数量 减少ov所以是2 其他的同学们可以自己推断 补充部分3 这里我们再看看替换不同长度的文本 我们这里 光标选择ov 替换为12345(剪切板以保存) 12-03 13:01:25.735 21082-21082/.test D/FMY: beforeTextChanged 被执行-> s=love-start=1-after=5-count2 12-03 13:01:25.735 21082-21082/.test E/FMY: beforeTextChanged-getSelectionStart: 3 12-03 13:01:25.735 21082-21082/.test E/FMY: beforeTextChanged-getSelectionEnd: 3 12-03 13:01:25.737 21082-21082/.test D/FMY: onTextChanged 被执行->s=l12345e-start=1-before=2-count5 12-03 13:01:25.737 21082-21082/.test E/FMY: onTextChanged-getSelectionStart: 6 12-03 13:01:25.737 21082-21082/.test E/FMY: onTextChanged-getSelectionEnd: 6 12-03 13:01:25.770 21082-21082/.test D/FMY: afterTextChanged 被执行->l12345e 12-03 13:01:25.770 21082-21082/.test E/FMY: afterTextChanged-getSelectionStart: 6 12-03 13:01:25.770 21082-21082/.test E/FMY: afterTextChanged-getSelectionEnd: 6 可以 替换字符串的时候光标 开始等于结束的 补充部分4 Editable 我们想直接操作文本编辑框的文本的时候 想快速插入和添加 可以考虑这个方法 我们看看两个例子 获取 文本编辑框中的字符串并且添加 你好在后面; 不使用Editable String s = editText.getText.toString; s +="你好" editTText(s); 来我们看看使用Editable editText.getText.append("你好"); 1. 2. 我们看看怎么获取Editable 非常简单只需要用文本编辑框调用getText方法 Editable text = editText.getText; 3. 4. 在文本编辑框后面添加字符串 5. 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);

    注意事项

    本文(安卓onTextChanged参数解释及实现EditText字数监听 Editable使用.docx)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开