2011-06-29 13 views
10

En un componente EditText, intento establecer un KeyListener para capturar la tecla ENTRAR (para la validación de formularios).Problema con EditText de 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) { 

     } 
    }); 

El problema es que cada vez que escribo en el EditText usando el teclado, todas las claves son ignorados y está haciendo caso omiso de mis pulsaciones de teclas. Sin embargo, el softpad en el dispositivo del emulador está funcionando.

¿Cómo solucionar esto por favor?

Respuesta

28

me gustaría utilizar la clase TextWatcher lugar:

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

Gran respuesta ... los oyentes onKey no siempre funcionan ... ¡esto funciona! ¡Gracias! – Rawr

+0

Se llama a 'TextWatcher' cuando EditText se vuelve a cargar –

+1

addTextChangedListener ** desperdicia unos minutos encontrándolo jeje .. tapas C – Dhina

0

Su porque su regreso falsa de su método onKeyUp, en Android específicamente las operaciones se manejan después del método onKeyUp.

Además, en lugar de utilizar un KeyListener, la mayoría de las actividades tienen un método onKeyUp que puede anular.

Aquí hay un ejemplo de algunos de los códigos en los que he estado trabajando.

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

me llaman las clases súper onKeyUp para todo lo demás. Espero que ayude a alguien.

-c

ACTUALIZACIÓN: Este hardware mango sólo teclados, para otras operaciones utilizan un TextWatcher.