Android TextWatcher三个回调以及监听EditText的输入案例详解

TextWatcher是一个监听字符变化的类。当我们调用EditText的addTextChangedListener(TextWatcher)方法之后,就可以监听EditText的输入了。
在new出一个TextWatcher之后,我们需要实现三个抽象方法:

  • beforeTextChanged
  • onTextChanged
  • afterTextChanged

看下beforeTextChanged的注释:

This method is called to notify you that, within s, the count characters beginning at start are about to be replaced by new text with length after. It is an error to attempt to make changes to s from this callback.

不知道你看懂没有,可能是因为英文水平的问题,我反正是看的很含糊不清。
既然这样,那最好的办法就是自己打个log试一下了。

    EditText et = (EditText) findViewById(R.id.et);
    TextWatcher watcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            Log.d(TAG, "beforeTextChanged: s = " + s + ", start = " + start +
                    ", count = " + count + ", after = " + after);
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.d(TAG, "onTextChanged: s = " + s + ", start = " + start +
                    ", before = " + before + ", count = " + count);
        }

        @Override
        public void afterTextChanged(Editable s) {
            Log.d(TAG, "afterTextChanged: " + s);
        }
    };
    et.addTextChangedListener(watcher);

首先输入abc123

然后在c和1之间添加一个0,现在文字变成了abc0123,再看下LOGCAT的显示:

再把0给删掉,log如下:

把0替换成12:

通过Log,结合Android源码注释,可以得出结论:

  • beforeTextChanged(CharSequence s, int start, int count, int after)
    s: 修改之前的文字。
    start: 字符串中即将发生修改的位置。
    count: 字符串中即将被修改的文字的长度。如果是新增的话则为0。
    after: 被修改的文字修改之后的长度。如果是删除的话则为0。
  • onTextChanged(CharSequence s, int start, int before, int count)
    s: 改变后的字符串
    start: 有变动的字符串的序号
    before: 被改变的字符串长度,如果是新增则为0。
    count: 添加的字符串长度,如果是删除则为0。
  • afterTextChanged(Editable s)
    s: 修改后的文字

Tips:

**需要特别注意的是,在TextWatcher中setText要小心不要陷入死循环。**即:
文字改变->watcher接收到通知->setText->文字改变->watcher接受到通知->…
在watcher中使用setText的解决方案

关于这三个回调方法调用的时机,可以参考这篇文章

当对EditText使用setText之后,记得再使用setSelection()来设置光标位置。

一个完整的TextWatcher例子:

    // 用于屏蔽空格输入的TextWatcher
    TextWatcher watcher = new TextWatcher() {
        private String mBefore;// 用于记录变化前的文字
        private int mCursor;// 用于记录变化时光标的位置

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            mBefore = s.toString();
            mCursor = start;
            Log.d(TAG, "beforeTextChanged: " + s + ", " + mCursor);
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.d(TAG, "onTextChanged: " + s);
        }

        @Override
        public void afterTextChanged(Editable s) {
            Log.d(TAG, "afterTextChanged: " + s);
            // 这里图方便,是在afterTextChanged判断是否输入之后含有空格,并不是最好的方案
            // 理论上应该在onTextChanged中判断输入内容
            if (s.toString().contains(" ")) {
                Log.i(TAG, "onTextChanged: 包含空格, 设置" + mBefore);
                et.removeTextChangedListener(this);
                et.setText(mBefore);
                et.addTextChangedListener(this);
                et.setSelection(mCursor);
            }
        }
    };
    et.addTextChangedListener(watcher);

到此这篇关于Android TextWatcher三个回调以及监听EditText的输入案例详解的文章就介绍到这了,更多相关Android TextWatcher三个回调以及监听EditText的输入内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android TextWatcher监控EditText中的输入内容并限制其个数

    布局中EditText在android布局中经常用到,对EditText中输入的内容也经常需要进行限制,我们可以通过TextWatcher去观察输入框中输入的内容,作个笔记. 主布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:ori

  • Android开发中给EditText控件添加TextWatcher监听实现对输入字数的限制(推荐)

    做这个功能是因为开发项目的时候,由于后台接口的一些参数的值的长度有要求,不能超过多少个字符,所以在编辑框中输入的字符是要有限制的. 下面就来看一下demo的实现过程: 首先,在xml控件中放置一个EditText控件,然后初始化该控件并对该控件添加文本监听.xml自己简单的设计一下,代码较为简单,直接上代码: package com.example.edittext; import android.app.Activity; import android.os.Bundle; import an

  • Android TextWatcher内容监听死循环案例详解

    Android TextWatcher内容监听死循环 TextWatcher如何避免在afterTextChanged中调用setText后导致死循环,今天在用TextView时,添加了addTextChangedListener方法监听内容改变,在afterTextChanged方法中又执行了setText方法,结果造成afterTextChanged方法再次调用,然后setText,因此造成了死循环的问题.列出此问题,以备后忘. 先贴Google文档原文说明: /** * This meth

  • Android中AutoCompleteTextView与TextWatcher结合小实例

    AutoCompleteTextView是实现动态匹配输入内容的一种输入框(EditText),如输入"and"时,会提示"Android" 效果图: 实现代码: package com.conowen.test; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import an

  • Android TextWatcher三个回调以及监听EditText的输入案例详解

    TextWatcher是一个监听字符变化的类.当我们调用EditText的addTextChangedListener(TextWatcher)方法之后,就可以监听EditText的输入了. 在new出一个TextWatcher之后,我们需要实现三个抽象方法: beforeTextChanged onTextChanged afterTextChanged 看下beforeTextChanged的注释: This method is called to notify you that, with

  • Ajax 文件上传进度监听之upload.onprogress案例详解

    $.ajax实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compati

  • Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

    目录 Springboot整合zookeeper教程 1.环境准备 2.代码编写 2.1.在pom.xml文件中增加zookeeper依赖(记得跟自己的zookeeper版本对应) 2.2.API测试 3.全部代码 Springboot整合zookeeper教程 1.环境准备 zookeeper集群环境 一个简单的springboot项目环境 不懂如何搭建zookeeper集群的小伙伴可以移步到我的另一篇文章喔,里面有详细的zookeeper集群搭建教程~ zookeeper集群搭建步骤(超详细

  • Android ListView监听滑动事件的方法(详解)

    ListView的主要有两种滑动事件监听方法,OnTouchListener和OnScrollListener 1.OnTouchListener OnTouchListener方法来自View中的监听事件,可以在监听三个Action事件发生时通过MotionEvent的getX()方法或getY()方法获取到当前触摸的坐标值,来对用户的滑动方向进行判断,并可在不同的Action状态中做出相应的处理 mListView.setOnTouchListener(new View.OnTouchLis

  • Android编程实现实时监听EditText文本输入的方法

    本文实例讲述了Android编程实现实时监听EditText文本输入的方法.分享给大家供大家参考,具体如下: 平时在做Android开发过程中经常要用到EditText,有时候可能需要监听你在TextView中输入的字数的状态和变化,以便于我们能做相应的提示和操作.我们可以通过下面的方式来实现. class EditChangedListener implements TextWatcher { private CharSequence temp;//监听前的文本 private int edi

  • Python脚本实现监听服务器的思路代码详解

    开前准备 Schedule使用方法. 基本的Linux操作 Python3环境 Step1 首先我得先假设你会了如何每十五分钟去运行一次检查这件事情.(后期我会补上如何去做定时任务,相信我!) 代码量比较少,选择在Linux环境下直接写脚本. import os #使用os的popen执行bash命令 content=os.popen("lsof -i:8080").read() 输出一下content看看,就是命令行执行输出的内容,看关键词webcache,但是输出的已经是文本文件了

  • Android下载进度监听和通知的处理详解

    本文实例为大家分享了Android下载进度监听和通知的具体代码,供大家参考,具体内容如下 下载管理器 关于下载进度的监听,这个比较简单,以apk文件下载为例,需要处理3个回调函数,分别是: 1.下载中 2.下载成功 3.下载失败 因此对应的回调接口就有了: public interface DownloadCallback { /** * 下载成功 * @param file 目标文件 */ void onComplete(File file); /** * 下载失败 * @param e */

  • Android监听home键的方法详解

    本文实例分析了Android监听home键的方法.分享给大家供大家参考,具体如下: 如何知道Home按钮被点击了呢?做launcher的时候,看源代码发现原因 如果你的Activity具备这些属性 <activity android:name="com.woyou.activity.HomeActivity" android:launchMode="singleInstance" > <intent-filter> <action an

  • Oracle监听口令及监听器安全详解

    很多Oracle用户都知道,Oracle的监听器一直存在着一个安全隐患,假如对此不设置安全措施,那么能够访问的用户就可以远程关闭监听器. 相关示例如下: D:>lsnrctl stop eygle LSNRCTL for 32-bit Windows: Version 10.2.0.3.0 - Production on 28-11月-2007 10:02:40 Copyright (c) 1991, 2006, Oracle. All rights reserved. 正在连接到 (DESCR

  • Bootstrap滚动监听(Scrollspy)插件详解

    滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标.其基本的实现是随着您的滚动,基于滚动条的位置向导航栏添加 .active class. 如果您想要单独引用该插件的功能,那么您需要引用 scrollspy.js.或者,正如 Bootstrap 插件概览 一章中所提到,您可以引用 bootstrap.js 或压缩版的 bootstrap.min.js. 一.用法 您可以向顶部导航添加滚动监听行为: 1.通过 data 属性:向您想要监听的元素(通常是

随机推荐