【问题标题】:Problem with Android's EditText : KeyListenerAndroid 的 EditText 问题:KeyListener
【发布时间】:2011-09-24 18:27:07
【问题描述】:

EditText 组件上,我尝试设置KeyListener 以捕获ENTER 键(用于表单验证)。

    text.setKeyListener(new KeyListener() {

        @Override
        public boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {
            return false;
        }

        @Override
        public boolean onKeyOther(View view, Editable text, KeyEvent event) {
            return false;
        }

        @Override
        public boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_ENTER) {
                onKeyEnterPressedListener.onKeyEnterPressed(AKText.this);
                return true;
            } else {
                return false;
            }
        }

        @Override
        public int getInputType() {
            return 1;
        }

        @Override
        public void clearMetaKeyState(View view, Editable content, int states) {

        }
    });

问题是,每当我使用键盘输入EditText 时,所有的键都会被忽略,它也忽略了我的击键。但是,模拟器设备上的软板正在工作。

请问如何解决?

【问题讨论】:

    标签: android android-edittext keylistener


    【解决方案1】:

    我会改用TextWatcher 类:

    private TextWatcher tw = new TextWatcher() {
        public void afterTextChanged(Editable s){
    
        }
        public void  beforeTextChanged(CharSequence s, int start, int count, int after){
          // you can check for enter key here
        }
        public void  onTextChanged (CharSequence s, int start, int before,int count) {
        } 
    };
    
    EditText et = (EditText) findViewById(R.id.YOUR_EDITTEXT_ID);
    et.addTextChangedListener(tw);
    

    【讨论】:

    • 很好的答案... onKey 侦听器并不总是有效...这有效!谢谢!
    • TextWatcher 是在EditText 再次重新加载时调用
    • addTextChangedListener ** 浪费了几分钟找到它,呵呵.. caps C
    【解决方案2】:

    您的意思是使用 setOnKeyListener() 吗?

    http://developer.android.com/reference/android/view/View.html#setOnKeyListener(android.view.View.OnKeyListener)

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

    editText.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.i("KEY", Integer.toString(keyCode));
            return false;
        }
    });
    

    【讨论】:

      【解决方案3】:

      这是因为您从 onKeyUp 方法返回 false,在 android 中具体操作是在 onKeyUp 方法之后处理的。

      除了使用 KeyListener 之外,大多数活动都有一个可以覆盖的 onKeyUp 方法。

      这是我一直在处理的一些代码示例。

      @Override
      public boolean onKeyUp(int keyCode, KeyEvent event) {
          if(keyCode == KeyEvent.KEYCODE_TAB) editText1.tab();
          if(event.isCtrlPressed())
          {
              if(keyCode == KeyEvent.KEYCODE_O) // ctrl+o
              {
                  onClick(open);
              }
              else if(keyCode == KeyEvent.KEYCODE_N) // ctrl+n
              {
                  addFileTab(null);                   // add untitled tab
                  editText1.setText("");
              }
              else if(keyCode == KeyEvent.KEYCODE_A) // ctrl+a
              {
                  editText1.selectAll();
              }
              else if(keyCode == KeyEvent.KEYCODE_S) // ctrl+s
              {
                  onClick(save);
              }
              else if(keyCode == KeyEvent.KEYCODE_C) // ctrl+c
              {
                  String selected = editText1.selection();
                  ClipData clip;
                  if(current != null) 
                      clip = ClipData.newPlainText(current.getName() + " selection", selected);
                  else
                      clip = ClipData.newPlainText("Cerulean selection", selected);
                  clipMan.setPrimaryClip(clip);
              }
              else if(keyCode == KeyEvent.KEYCODE_P && clipMan.hasPrimaryClip()) // ctrl+p
              {
                  if(clipMan.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN))
                  {
                      CharSequence clip = clipMan.getPrimaryClip().getItemAt(0).coerceToText(getBaseContext());
                      editText1.insert(clip.toString());
                  }
              }
              return false;
          }
          if(keyCode == KeyEvent.KEYCODE_SPACE || keyCode == KeyEvent.KEYCODE_ENTER)
          {
              onTabClicked(current, curTab);
          }
          return super.onKeyUp(keyCode, event);
      }
      

      我将超类称为 onKeyUp 用于其他所有内容。希望它可以帮助某人。

      -c

      更新:仅处理硬件键盘,其他操作使用 TextWatcher。

      【讨论】:

        猜你喜欢
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 2016-07-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        相关资源
        最近更新 更多