2011-06-29 14 views
10

Na składniku EditText próbuję ustawić KeyListener w celu przechwycenia klucza ENTER (w celu sprawdzenia poprawności formularza).Problem z EditTextem systemu 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) { 

     } 
    }); 

Problem polega na tym, że ilekroć wpisać EditText za pomocą klawiatury, wszystkie klawisze są ignorowane i to ignorowanie moich klawiszy. Jednak działa softpad na urządzeniu emulatora.

Jak to naprawić?

Odpowiedz

28

chciałbym użyć klasy TextWatcher Zamiast:

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

Świetna odpowiedź ... słuchacze na żywo nie zawsze działają ... to działa! Dzięki! – Rawr

+0

Czy 'TextWatcher' jest wywołaniem, gdy EditText jest ponownie ładowany –

+1

addTextChangedListener ** zmarnował kilka minut, znajdując go hehe .. caps C – Dhina

0

jego ponieważ swój powrót fałszywe od wybranej metody onkeyup w android specjalnie operacje są obsługiwane po metody onkeyup.

Również zamiast używać KeyListener, większość działań ma metodę onKeyUp, którą można przesłonić.

Oto próbka niektórych z mojego kodu, nad którym pracowałem.

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

Wzywam superklasy naKeyUp na wszystko inne. Mam nadzieję, że to komuś pomaga.

-c

UPDATE: tylko tego sprzętu uchwyt klawiszowe, dla innych operacji użyć TextWatcher.