View.OnKeyListener不起作用

时间:2014-10-29 05:23:13

标签: android xml android-edittext android-keypad

我在android中使用editText的OnKeyListener方法,但似乎设备没有多次调用它的监听器。这是我正在使用的代码。问题有时甚至是删除按钮但是没有做什么应该和有时onKeyListener甚至没有被调用。这个方法有什么问题吗?我应该swich到textwatcher?

    cp_confirm_pin_code1.setOnKeyListener(new OnKeyListener() {                 
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub
            Log.e("keycode action confirm pin1",""+keyCode);
            if(event.getAction()==KeyEvent.ACTION_DOWN)
                if(keyCode == KeyEvent.KEYCODE_DEL){  
                    //this is for backspace
                    Log.e("back space for 1", "back space for 1");
                    cp_confirm_pin_code1.setText("");
                }
                else{
                    Log.e("other numbers 1", "other numbers 1 ");
                    String text=null;
                    Log.e("code", ""+keyCode);
                    switch (keyCode) {
                    case KeyEvent.KEYCODE_0:
                        text="0";
                        break;
                    case KeyEvent.KEYCODE_1:
                        text="1";
                        Log.e("text in 1",""+text);
                        break;
                    case KeyEvent.KEYCODE_2:
                        text="2";
                        break;
                    case KeyEvent.KEYCODE_3:
                        text="3";
                        break;
                    case KeyEvent.KEYCODE_4:
                        text="4";
                        break;
                    case KeyEvent.KEYCODE_5:
                        text="5";
                        break;
                    case KeyEvent.KEYCODE_6:
                        text="6";
                        break;
                    case KeyEvent.KEYCODE_7:
                        text="7";
                        break;
                    case KeyEvent.KEYCODE_8:
                        text="8";
                        break;
                    case KeyEvent.KEYCODE_9:
                        text="9";
                        break;
                    case KeyEvent.KEYCODE_BACK:

                        getActivity().finish();
                        break;
                    default:
                        Log.e("default", "default");
                        break;

                    }
                    Log.e("text vallue", "text value"+text);
                    if(text!=null){
                        Log.e("requesting focus 1", "requesting focus 1");

                        cp_confirm_pin_code1.setText(text);
                        cp_confirm_pin_code2.requestFocus();
                    }
                }
            return true;
        }
    });

1 个答案:

答案 0 :(得分:1)

只使用来自硬件键盘的事件调用

onKeyListener。所以我认为最好使用TextWatcher。

文档指出,关键事件只会传播硬件击键,而不是软件。

http://developer.android.com/reference/android/view/View.OnKeyListener.html

设备制造商实际上不鼓励通过关键的听众传播软键盘事件,尽管完全由制造商来尊重或者用相同的术语来实际处理软键盘和硬键盘。

从Android 4.2.2开始,Android系统本身根本不支持软键盘的关键加油事件,因此即使是制造商也无法选择自己的方式。

所以这里唯一的万无一失的选择是实现你自己的IME(软键盘),并自己处理击键。

TextWatcher主要用于替换键侦听器,但是editText.setText(...);还会触发TextWatcher事件,所以如果只对一个键入的键感兴趣,那么TextWatcher可能也不是解决方案。

将TextWatcher与AutocomleteTextView或EditText一起使用时请务必小心。不要在TextWatcher事件中修改AutocompleteTextView / EditText内容中的文本,否则您很可能最终会进入无限事件/侦听循环。