【Android】EditText的一个问题

EditText用于编辑文字,经常需要监听输入的字符,尤其是回车,删除等特殊字符,除了addTextChangedListener这个比较简单的方法之外,还有类似于下面的方法:

 1 editText.setOnKeyListener(new View.OnKeyListener() {
 2             @Override
 3             public boolean onKey(View v, int keyCode, KeyEvent event) {
 4                 Log.d("RFV", "~~ " + keyCode);
 5                 if (event.getAction() == KeyEvent.ACTION_DOWN
 6                         && keyCode == KeyEvent.KEYCODE_DEL) {
 7                     if (itemList.size() > 0 && editText.length() == 0) {
 8                         removeItem();
 9                         if(listener != null)
10                             listener.dataChange();
11                     }
12                 }
13                 
14                 if(event.getAction() == KeyEvent.ACTION_DOWN
15                         && keyCode == KeyEvent.KEYCODE_BACK){
16                     if(listener != null)
17                         listener.back();
18                 }
19                 
20                 if (keyCode == KeyEvent.KEYCODE_ENTER) {
21                     String name = editText.getText().toString();
22                     if (!TextUtils.isEmpty(name)) {
23                         addItem(name);
24                         if(listener != null)
25                             listener.dataChange();
26                         editText.setText("");
27                         editText.requestFocus();
28                     }
29                     return true;//直接拦截所有DOWN,UP事件
30                 }
31                 return false;
32             }
33         });

从代码中我们很容易看到这个方法不但可以监听事件(Down和Up),还能监听到底是哪一个按键。下面讲两点,我犯过错误:

1)关于最后的return false:我曾经写过return true,发现不能输入数字(标准输入法下),我的猜测是,在每次EditText接受输入之前,事件都会首先经过OnKeyListener,如果返回true,则事件不会再被传递;

2)关于最后一个判断,之前我也和前面两个判断一样,加入了判断是否是Down事件的判断,然后我发现很奇怪事情,那就是当我点击回车之后,editText一直无法获取焦点,去掉之后可以,一个猜测是因为Down事件返回的是true,所以Up事件一定会传递到这里进行处理,又因为Up事件返回的是false,所以又会继续被处理,而这个时候焦点很可能被转移到键盘(其实不是很准确,应该另有原因)

posted @ 2013-03-09 00:25  大脚印  阅读(1146)  评论(0编辑  收藏  举报