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

相关推荐
李斯维4 小时前
循序渐进 Android Binder(二):传递自定义对象和 AIDL 回调
android·java·android studio
未来猫咪花10 小时前
# Flutter状态管理对比:view_model vs Riverpod
flutter·ios·android studio
casual_clover11 小时前
Android Studio 解决首次安装时下载 Gradle 慢问题
android·ide·android studio
林林要一直努力1 天前
Android Studio 向模拟器手机添加照片、视频、音乐
android·智能手机·android studio
AD钙奶-lalala1 天前
Mac版本Android Studio配置LeetCode插件
android·ide·android studio
我又来搬代码了1 天前
【Android】Android Studio项目代码异常错乱问题处理(2020.3版本)
android·ide·android studio
花开月满西楼1 天前
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
android·前端·android studio
aningxiaoxixi2 天前
Android Studio 之基础代码解析
android·ide·android studio
偷野的程咬金2 天前
AS中远程 AAR 缓存的位置与 SNAPSHOT 使用详解
android studio
大白要努力!3 天前
在 Android Studio 中使用 GitLab 添加图片到 README.md
android·gitlab·android studio