程序正在监听你的一举一动?

简介: 程序正在监听你的一举一动?

相信大家在项目中多多少少都用过EditText这个控件吧,但是大家是否熟悉它的监听呢?最近阿Q在使用它的监听的过程中就碰到了几个问题,在这里整理一下,供小伙伴们参考。

首先呢我们先声明一下EditText这个控件:

<EditText
android:id="@+id/et_number"
android:layout_width="50dp"
   android:layout_height="40dp"
   //控制长度
   android:maxLength="5"
   android:textSize="18sp"
   //设置只允许输入数字
   android:inputType="number"
   //可以输入小数
   android:digits="0123456789."/>

在逻辑代码中添监听addTextChangedListener();

eNumber.addTextChangedListener(new TextWatcher(){
   @Override
   public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  }
   @Override
   public void onTextChanged(CharSequence s, int i, int i1, int i2) {
  }
   @Override
   public void afterTextChanged(Editable editable) {
  }
});

先说一下监听中的三个抽象函数,beforeTextChanged()为输入文字之后,还未显示在EditText上的操作;onTextChanged()为输入了文字,正在进行EditText显示的操作;afterTextChanged()为文字显示在EditText上的操作。大家应该注意的是如果在afterTextChanged()函数中去调用setText()方法,就会去重复调用其前两个方法,造成死循环,直到程序崩溃为止。所以我们在最后一个方法中要慎用setText(),所以我们只可将特殊情况的处理 用setText()来表示。

接下来给大家附上部分源码:

eNumber.addTextChangedListener(new TextWatcher(){
   @Override
   public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  }
   @Override
   public void onTextChanged(CharSequence s, int i, int i1, int i2) {
       //删除“.”后面超过2位后的数据
       if (s.toString().contains(".")) {
           if (s.length() - 1 - s.toString().indexOf(".") > digits) {
               s = s.toString().subSequence(0,
                                            s.toString().indexOf(".") + digits+1);
               eNumber.setText(s);
               eNumber.setSelection(s.length()); //光标移到最后
          }
      }
       //如果"."在起始位置,则起始位置自动补0
       if (s.toString().trim().substring(0).equals(".")) {
           s = "0" + s;
           eNumber.setText(s);
           eNumber.setSelection(2);
      }
       //如果起始位置为0,且第二位跟的不是".",则无法后续输入
       if (s.toString().startsWith("0")
           && s.toString().trim().length() > 1) {
           if (!s.toString().substring(1, 2).equals(".")) {
               eNumber.setText(s.subSequence(0, 1));
               eNumber.setSelection(1);
               return;
          }
      }
       eNumber.setSelection(s.length()); //光标移到最后
  }
   @Override
   public void afterTextChanged(Editable editable) {
       //变化后
       String numberString = editable.toString();
       if(numberString == null || "".equals(numberString)){
           eNumber.setText("0");
      }else{
           Float num = Float.parseFloat(numberString);
           if(num<0){
               eNumber.setText("0");
          }else if(num>total){
               eNumber.setText(total+"");
          }
      }
  }
});

最后呢,给大家说一下RecyclerView中含有EditText复用的问题。在使用过程中,如果复用EditText的话,会出现输入数字错乱的问题,这时候我们需要加上监听的唯一标志,用于区分不同的监听,并且监听用完之后要记得移除监听。

//根据tag移除掉监听
if(editText.getTag() instanceof TextWatcher){
   editText.removeTextChangedListener((TextWatcher) editText.getTag());
}
TextWatcher textWatcher = new TextWatcher() {
   @Override
   public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  }
   @Override
   public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  }
   @Override
   public void afterTextChanged(Editable editable) {
       //设置光标位置为最后
       editText.setSelection(editText.getText().toString().length());
  }
};
editText.addTextChangedListener(textWatcher);
editText.setTag(textWatcher);
相关文章
|
3天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
271 116
|
18天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
663 219
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
353 34
Meta SAM3开源:让图像分割,听懂你的话
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1588 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
897 61
|
7天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
295 140