Android Studio:EditText常见4种监听方式

1. 文本变化监听(TextWatcher

TextWatcher 主要用于监听 EditText 里的文本变化,它有三个方法:

  • beforeTextChanged(文本变化前)
  • onTextChanged(文本正在变化时)
  • afterTextChanged(文本变化后)

我们分别看看它们的触发时机和适用场景。

(1)beforeTextChanged(文本变化前触发)

触发时机:当 EditText 里的内容 即将改变,但还没真正修改时,会先调用这个方法。就是对一个既成的文本输入框的内容,修改的瞬间之前,该方法启动。它可以记录文本输入框的原始文本。

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    Log.d("EditText", "原始内容:" + s.toString());
}

假设 EditText 里原来是 "Hello",用户打算删除 "o" 之前,这个方法就会先触发,s变量保留了修改之前的文本值。如果用户在 "Hello" 后面加个 "!",在 beforeTextChanged 里,s 仍然是 "Hello"(还没改变)。

(2)onTextChanged(文本正在变化时触发)

触发时机:当 EditText 正在被修改,但还没有完全修改完成时,会调用这个方法。比如现在修改文本的时候,输入了不被允许的特殊符号,比如输入银行卡号的时候自动添加了空格,注意,触发都是实时的,每键入一个字符都会触发,而不是失去焦点的时候才触发。

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    Log.d("EditText", "当前内容:" + s.toString());
}

如果用户从 "Hello" 改成 "Hell",在 onTextChanged 里,s 变成了 "Hell"

(3)afterTextChanged(文本变化后触发)

触发时机:当 EditText 的内容已经完全修改完成,这个方法会被调用。比如输入检验,看输入的手机号、修改后的手机号是否符合要求。这个也不是失去焦点才触发,而是文本完全改变后就触发。

@Override
public void afterTextChanged(Editable s) {
    Log.d("EditText", "最终内容:" + s.toString());
}

如果用户输入 "123456",可以在 afterTextChanged 里检查输入是否是数字

@Override
public void afterTextChanged(Editable s) {
    if (!s.toString().matches("\\d+")) {
        Log.d("EditText", "只能输入数字!");
    }
}

2.焦点变化监听(OnFocusChangeListener

监听 EditText 是否获得或失去焦点。

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            Log.d("EditText", "获取焦点");
        } else {
            Log.d("EditText", "失去焦点");
        }
    }
});

  hasFocustrue,表示 EditText 获取了焦点,可以弹出键盘。hasFocusfalse,表示 EditText 失去焦点,可用于隐藏键盘或验证输入。

3. 键盘按键监听(OnKeyListener

监听物理键盘或返回键的按键事件。在文本输入框中,按下特定键位可以运行特定逻辑。

editText.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) {
            Log.d("EditText", "回车键被按下");
            return true; // 消费事件,避免换行
        }
        return false;
    }
});

        这个方法给 EditText 设置了一个 键盘按键事件监听器。当用户按下物理键盘上的键时,onKey 方法会被调用,监听按键的相关事件。这段代码的作用是,当用户按下 回车键 时,Log.d 会打印 "回车键被按下"

   int keyCode:按下的键的编码,标识是哪一个键。KeyEvent event:包含关于这个按键的更多信息(比如按下或抬起)。

   event.getAction():返回当前按键事件的动作类型。这里判断的是 KeyEvent.ACTION_DOWN,表示按键按下的动作(另一种常见动作是 KeyEvent.ACTION_UP,表示按键松开)。

   KeyEvent.KEYCODE_ENTER 表示回车键。

   return true 表示 消费这个事件,即不再让 EditText 执行默认的行为(比如在按下回车时换行或提交表单)。如果你希望回车键按下时不做换行或其他默认行为,可以通过 return true 来拦截这个事件。如果不返回 true,回车键按下时会执行默认行为,通常是 换行提交表单

         如果 return false,则表示不消费这个事件,EditText 会执行 默认的行为,比如 换行 或其他动作。这样只有回车键的逻辑会被拦截,其他键的按键事件不受影响。

4. 动作监听(OnEditorActionListener

监听软键盘上的 完成(Enter) 按钮,通常用于搜索框或登录框。

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_ACTION_SEND) {
            Log.d("EditText", "输入完成");
            return true; // 消费事件,避免默认行为
        }
        return false;
    }
});

这段代码通过 setOnEditorActionListenerEditText 设置了一个 编辑器操作监听器,用于监听软键盘上的 动作按钮(例如“完成”按钮、“发送”按钮)是否被点击。所谓软键盘就是点击文本输入框跳出来的屏幕键盘。

EditorInfo.IME_ACTION_DONE:表示 完成 按钮被按下。

EditorInfo.IME_ACTION_SEND:表示 发送 按钮被按下。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Qt 常用控件】多元素控件(QListWidget、QTableWidgt、QTreeWidget)

**View和**Widget的区别? **View的实现更底层,**Widget是基于**View封装实现的更易用的类型。 **View使用MVC结构 MVC是软件开发中 经典的 软件结构 组织形式,软件设计模式。 M(model)模型。管理应用程序的核心数据和…

Flappy Bird开发学习记录

概述 为了了解一下Unity的开发过程,或者说感受?先搞简单的练练手。 工具 Unity:2022.3.51f1c1 visual studio 2022 开发过程 项目基本设置 新建2d项目,游戏画面设置为1080*1920(9:16)。 图片素材设…

35~37.ppt

目录 35.张秘书-《会计行业中长期人才发展规划》 题目​ 解析 36.颐和园公园(25张PPT) 题目​ 解析 37.颐和园公园(22张PPT) 题目 解析 35.张秘书-《会计行业中长期人才发展规划》 题目 解析 插入自定义的幻灯片:新建幻灯片→重用…

19.4.6 读写数据库中的二进制数据

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 北风数据库中,类别表的图片字段在【数据表视图】中显示为Bitmap Image&#xff1…

sqli-lab靶场学习(六)——Less18-22(User-Agent、Referer、Cookie注入)

前言 前面的关卡,都是直接在输入框或者浏览器的地址栏上做文章即可。但本文这几关,需要用工具拦截请求修改请求头部才行。 Less18(User-Agent注入) 本关的注入点在User-Agent。我们在用户名和密码框中输入admin/admin后&#xf…

uniapp 使用 鸿蒙开源字体

uniapp vue3 使用 鸿蒙开源字体 我的需求是全局使用鸿蒙字体。 所以: 0. 首先下载鸿蒙字体: 鸿蒙资源 下载后解压,发现里面有几个文件夹: 字体名称说明Sans默认的鸿蒙字体,支持基本的多语言字符(包括字…

【ESP32指向鼠标】——icm20948与esp32通信

【ESP32指向鼠标】——icm20948与esp32通信 ICM-20948介绍 ICM-20948 是一款由 InvenSense(现为 TDK 的一部分)生产的 9 轴传感器集成电路。它结合了 陀螺仪、加速度计和磁力计。 内置了 DMP(Digital Motion Processor)即负责执…

机器学习(李宏毅)——BERT

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention、Transformer,可参阅我其他文章。 二、大纲 BERT简介self-…

NO.12十六届蓝桥杯备战|关系操作符|操作符连用|浮点数比较|练习2道(C++)

关系操作符 关系操作符介绍 ⽤于⽐较的表达式,称为“关系表达式”(relational expression),⾥⾯使⽤的运算符就称为“关 系运算符”(relational operator),主要有下⾯6个。 运算符描述>⼤…

JVM组成

JVM是什么? JVM(Java Virtual Machine):Java程序的运行环境(java二进制字节码的运行环境) 好处: 1.一次编写,到处运行 Java代码是如何做到一次编写,到处运行? 计算机的最底层是计…

不小心删除服务[null]后,git bash出现错误

不小心删除服务[null]后,git bash出现错误,如何解决? 错误描述:打开 git bash、msys2都会出现错误「bash: /dev/null: No such device or address」 问题定位: 1.使用搜索引擎搜索「bash: /dev/null: No such device o…

130,[1] 攻防世界 very_easy_sql

进入靶场 典型SQL注入页面 先查看源码 访问 试试http://127.0.0.1/ 还尝试了其他都是nonono 回归第一个登录页面 提交的内容不在url处显示,反而第二个url页面会在url处显示 明白第一个页面是通过post方式提交,反正没得到什么信息,去抓…

Android10 音频参数导出合并

A10 设备录音时底噪过大,让音频同事校准了下,然后把校准好的参数需要导出来,集成到项目中,然后出包,导出方式在此记录 设备安装debug系统版本调试好后, adb root adb remount adb shell 进入设备目录 导…

django中间件,中间件给下面传值

1、新建middleware.py文件 # myapp/middleware.py import time from django.http import HttpRequest import json from django.http import JsonResponse import urllib.parse from django.core.cache import cache from comm.Db import Db class RequestTimeMiddleware:def …

24电子信息类研究生复试面试问题汇总 电子信息类专业知识问题最全!电子信息复试全流程攻略 电子信息考研复试真题汇总

你是不是在为电子信息考研复试焦虑?害怕被老师问到刁钻问题、担心专业面答不上来?别慌!作为复试面试92分逆袭上岸的学姐,今天手把手教你拆解电子信息类复试通关密码!看完这篇,让你面试现场直接开大&#xf…

LVDS接口总结--(1)LVDS硬件电路接口

1.LVDS差分信号电路原理 LVDS指的是低压差分信号,是一种电平标准。 差分信号在串行通信中有着非常广泛的应用,典型应用有PCIE中的gen1,gen2,gen3,gen4,gen5,SATA接口,USB接口等。 …

【STM32】HAL库Host MSC读写外部U盘及FatFS文件系统的USB Disk模式

【STM32】HAL库Host MSC读写外部U盘及FatFS文件系统的USB Disk模式 在先前 分别介绍了FatFS文件系统和USB虚拟U盘MSC配置 前者通过MCU读写Flash建立文件系统 后者通过MSC连接电脑使其能够被操作 这两者可以合起来 就能够实现同时在MCU、USB中操作Flash的文件系统 【STM32】通过…

第四期书生大模型实战营-第5关-L2G5000

1 Web 版茴香豆 助教说这趴先跳过,那我就跳过 2 茴香豆本地标准版搭建 2.1 环境搭建 2.2 安装茴香豆 2.3 知识库创建 2.4 测试知识助手 2.4.1 命令行运行 2.4.2 Gradio UI 界面测试 确认一下是否正常 完美。 至于选做,我这么懒,怎么可能…

Elastic Cloud Serverless 现已在 Microsoft Azure 上提供技术预览版

作者:来自 Elastic Yuvi Gupta Elastic Cloud Serverless 提供了启动和扩展安全性、可观察性和搜索解决方案的最快方法 — 无需管理基础设施。 今天,我们很高兴地宣布 Microsoft Azure 上的 Elastic Cloud Serverless 技术预览版现已在美国东部地区推出。…

go语言简单快速的按顺序遍历kv结构(map)

文章目录 需求描述用map实现按照map的key排序用二维切片实现用结构体实现 需求描述 在go语言中,如果需要对map遍历,每次输出的顺序是不固定的,可以考虑存储为二维切片或结构体。 假设现在需要在页面的下拉菜单中展示一些基础的选项&#xff…