首先,目前接触到的键盘监听主要有2大类,分别为setOnKeyListener和addTextChangedListener。它们二者的适用范围也有所不同:前者只适用于硬键盘的监听,后者则软、硬键盘均可监听。
可以通过重写setOnKeyListener中的onKey方法来实现,根据参数中的event.getAction()的值进行按键的监听处理。
示例代码如下:
private EditText et;
...
et.setOnKeyListener(new MyKeyListener);
...
class MyKeyListener implements OnKeyListener{
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case KeyEvent.ACTION_UP: // 键盘松开
...
break;
case KeyEvent.ACTION_DOWN: // 键盘按下
...
break;
default:
break;
}
return false;
}
});
}
在该监听中需要了解的几个参数有如下几个:
Parameters:
1. v The view the key has been dispatched to.
2. keyCode The code for the physical key that was pressed.
3. event The KeyEvent object containing full information about the event.
Returns:
1. True if the listener has consumed the event, false otherwise.
在添加监听后重写了3个方法beforeTextChanged、onTextChanged和afterTextChanged。从方法名不难看出每个方法的意义。
下面对以上3个方法进行相关的说明。
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
...
}
该方法在整个输入过程中是最早发生的,里面的几个参数的意义分别如下:
1. s 为改变之前的内容;
2. start 为开始变化位置的索引,从0开始计数;
3. count 为将要发生变化的字符数;
4. after 为用来替换旧文本的长度,比如s由1变为12,after为1,由12变为1,after为0。
该方法可以用于获取在输入之前的文本内容。
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
...
}
这是该监听的核心方法,在beforeTextChanged方法之后调用,代表正在输入的过程,里面各个参数的意义如下:
1. s 为变化后的内容;
2. start 为开始变化位置的索引,从0开始计数;
3. before 为被取代的老文本的长度,比如s由1变为12,before为0,由12变为1,before为1;
4. count 为将要发生变化的字符数。
该方法主要的作用在于可以改变输入的界面显示,例如输入数字可以进行相应的格式化,或者大小写、粗体、斜体等的改变。这些改变通常都是通过手动调用EditText的setText()进行更改后的文本的设置(默认都是直接将s设置进去,不做处理)。值得注意的是,在进行改变的过程中需要设置一个条件来跳出循环(可以是字符长度,也可以是值的大小或者格式等),否则,当改变文字时,onTextChanged就认为有所变化,会进入死循环。
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
...
}
该方法在整个输入过程是最后调用的,参数也只有一个Editable,它其实也是输入后的文本内容。在该方法中可以设置输入光标的位置,通常都是放在最后。
et.setSelection(s.length());
源码就不上了,网上也有很多例子可以参考,重点还是理解里面的实现原理。
最后祝愿大伙在新的一年工作顺利。Fighting!!!