2011-06-29 34 views
10

Trên một thành phần EditText, tôi đang cố gắng đặt KeyListener để nhận khóa ENTER (để xác thực biểu mẫu).Vấn đề với EditText của Android: 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) { 

     } 
    }); 

Vấn đề là bất cứ khi nào tôi gõ vào EditText sử dụng bàn phím, tất cả các phím được bỏ qua và nó bỏ qua tổ hợp phím của tôi. Tuy nhiên, softpad trên thiết bị giả lập đang hoạt động.

Làm cách nào để sửa lỗi này?

Trả lời

28

tôi sẽ sử dụng lớp TextWatcher thay vì:

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

Câu trả lời hay ... người nghe onKey không phải lúc nào cũng hoạt động ... tác phẩm này! Cảm ơn! – Rawr

+0

Có phải 'TextWatcher' đang gọi khi EditText được Nạp lại một lần nữa –

+1

addTextChangedListener ** lãng phí một vài phút tìm nó hehe .. mũ C – Dhina

0

của nó vì bạn trở về sai từ phương pháp onKeyUp của bạn, trong android đặc biệt là hoạt động được xử lý sau khi phương pháp onKeyUp.

Ngoài ra, thay vì sử dụng KeyListener, hầu hết các hoạt động đều có phương pháp onKeyUp bạn có thể ghi đè lên.

Đây là mẫu của một số mã tôi đã làm việc.

@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); 
} 

Tôi gọi các lớp siêu trênKeyKey cho mọi thứ khác. Hy vọng nó sẽ giúp ai đó.

-c

CẬP NHẬT: Bàn phím phần cứng xử lý chỉ dành cho các hoạt động khác sử dụng Trình quét văn bản.

Các vấn đề liên quan