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

相关推荐
A__tao9 小时前
SQL 转 PHP Eloquent、Doctrine ORM, 支持多数据库
android·ide·android studio
水w1 天前
【Android Studio】如何卸载干净(详细步骤)
android·开发语言·android studio·activity
Yang-Never1 天前
Open GL ES ->纹理贴图,顶点坐标和纹理坐标组合到同一个顶点缓冲对象中进行解析
android·java·开发语言·android studio·贴图
QING6181 天前
Android 之 Logcat 的使用技巧 —— 新手指南
app·android studio
avi91114 天前
Unity打包崩溃SRP-URP-管线的问题:Shader::SRPBatcherInfoSetup()
unity·android studio·调试·crash·崩溃
Yang-Never4 天前
Open GL ES ->模型矩阵、视图矩阵、投影矩阵等变换矩阵数学推导以及方法接口说明
android·矩阵·kotlin·android studio
千里马学框架5 天前
android studio调试aosp手机userdebug版本无法查看局部变量和参数问题如何解决?
android·智能手机·车载系统·android studio·debug·调试·系统开发
愤怒的代码5 天前
Android 11 SystemUI 导入 Android studio 编译打包过程
android·android studio
我命由我123455 天前
Android Gradle 插件问题:The option ‘android.useDeprecatedNdk‘ is deprecated.
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Mr_万能胶6 天前
要失业了!写在 Android “不再开源”之后
android·android studio·android jetpack