2011-06-29 47 views
10

EditText組件上,我試圖設置一個KeyListener以捕獲ENTER鍵(用於表單驗證)。Android的EditText問題:KeyListener

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類型,所有按鍵被忽略,它無視我的按鍵。但是,仿真器設備上的緩衝區正在工作。

如何解決此問題?

回答

28

我會用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); 
+0

很好的回答... onKey聽衆不總是工作...這個工程!謝謝! – Rawr

+0

當EditText重新加載時,是否調用了'TextWatcher' –

+1

addTextChangedListener **浪費了幾分鐘,發現它嘿.. caps C – Dhina

0

它,因爲你回來從你的onkeyup方法錯誤,在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

UPDATE:僅此手柄硬件鍵盤,用於其他操作使用TextWatcher。