【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,所以又会继续被处理,而这个时候焦点很可能被转移到键盘(其实不是很准确,应该另有原因)