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

  • 相关阅读:
    排序二——交换排序
    桥接模式 Bridge
    外观模式Facade(解耦)
    装饰模式和代理模式的区别
    代理模式 proxy
    装饰器模式 Decorator
    适配器模式
    android launcher-启动过程
    ubuntu 编译openwrt
    Eclipse Memory Analyzer tool(MAT)
  • 原文地址:https://www.cnblogs.com/lqminn/p/2950995.html
Copyright © 2011-2022 走看看