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

1. 文本变化监听(TextWatcher

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

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

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

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

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

java 复制代码
@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 正在被修改,但还没有完全修改完成时,会调用这个方法。比如现在修改文本的时候,输入了不被允许的特殊符号,比如输入银行卡号的时候自动添加了空格,注意,触发都是实时的,每键入一个字符都会触发,而不是失去焦点的时候才触发。

java 复制代码
@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 的内容已经完全修改完成,这个方法会被调用。比如输入检验,看输入的手机号、修改后的手机号是否符合要求。这个也不是失去焦点才触发,而是文本完全改变后就触发。

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

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

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

2.焦点变化监听(OnFocusChangeListener

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

java 复制代码
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

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

java 复制代码
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) 按钮,通常用于搜索框或登录框。

java 复制代码
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:表示 发送 按钮被按下。

相关推荐
彬sir哥1 小时前
Cannot import to svn: ‘C:\Program‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
svn·android studio
九思x5 小时前
Android Studio安装配置及运行
android·ide·android studio
B.-7 小时前
在 Flutter 中实现文件读写
开发语言·学习·flutter·android studio·xcode
胖虎120 小时前
2025 新版Android Studio创建Java语言项目
android·java·android studio·创建java项目
lavins2 天前
android studio kotlin项目build时候提示错误 Unknown Kotlin JVM target: 21
jvm·kotlin·android studio
燕满天2 天前
android studio 高版本创建项目时,修改setting跟build后,运行不了的问题解决
android·ide·android studio
彬sir哥2 天前
Android studio如何把新项目上传到svn仓库
android studio·svn仓库·新项目
-优势在我3 天前
android studio 使用maven-publish 插件上传aar到远程maven仓库
android·maven·android studio
且随疾风前行.3 天前
Android Studio 提示 !Failed to initialize editor
android·ide·android studio
剑客狼心3 天前
Android Studio:用handler实现计数
java·开发语言·android studio