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", "失去焦点");
}
}
});
hasFocus
为 true
,表示 EditText
获取了焦点,可以弹出键盘。hasFocus
为 false
,表示 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;
}
});
这段代码通过 setOnEditorActionListener
给 EditText
设置了一个 编辑器操作监听器,用于监听软键盘上的 动作按钮(例如“完成”按钮、“发送”按钮)是否被点击。所谓软键盘就是点击文本输入框跳出来的屏幕键盘。
EditorInfo.IME_ACTION_DONE
:表示 完成 按钮被按下。
EditorInfo.IME_ACTION_SEND
:表示 发送 按钮被按下。