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:表示 发送 按钮被按下。

相关推荐
不想迷路的小男孩7 小时前
Android Studio 中Palette跟Component Tree面板消失怎么恢复正常
android·ide·android studio
yzpyzp8 小时前
Android studio在点击运行按钮时执行过程中输出的compileDebugKotlin 这个任务是由gradle执行的吗
android·gradle·android studio
花王江不语1 天前
android studio 配置硬件加速 haxm
android·ide·android studio
岁月玲珑2 天前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
小蜜蜂嗡嗡2 天前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
summer夏1233 天前
2025.07 做什么
java·android studio
编程乐学13 天前
网络资源模板--基于Android Studio 实现的咖啡点餐App
android·android studio·大作业·奶茶点餐·安卓移动开发·咖啡点餐
编程乐学14 天前
网络资源模板--基于Android Studio 实现的公交线路App
android·android studio·大作业·移动端开发·安卓大作业·公交线路管理
帅次16 天前
Flutter动画全解析:从AnimatedContainer到AnimationController的完整指南
android·flutter·ios·小程序·kotlin·android studio·iphone
技术蔡蔡17 天前
Flutter真实项目中bug解决详解
flutter·面试·android studio