Android: ¿por qué no se llama a mi OnKeyListener ()?

Definí un campo EditText y quiero ser informado cuando el usuario edita los campos. Así que pensé: simple – añadir un OnKeyListener y así lo hice. Pero a pesar de que el campo de texto se edita (e incluso muestra el texto introducido / modificado) no obtengo ninguna devolución de llamada, es decir, la salida LOG no aparece.

TextView text = new TextView(this); text.setText(...); ... text.setOnKeyListener(new OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { TextView tv = (TextView)v; CharSequence val = tv.getText(); Log.v(TAG, "value: " + val); // ... rest omitted for brevity } }); 

¿Alguna idea, por qué esa llamada nunca se llama?

Miguel

PS .: ¡Suspiro! Android está realmente lleno de rarezas! Parece que casi nada que toqué hasta ahora funcionó inmediatamente como uno esperaría. Y – lo creas o no – tengo mucha experiencia con las interfaces gráficas, especialmente. En Java (AWT, Swing, SWT, lo que sea …) Pero Android es una bestia muy dura!

¿Está utilizando el teclado virtual (ime) para escribir el texto de edición? Creo que el onKeyListener sólo se invoca con eventos desde el teclado de hardware. Es mejor que uses el TextWatcher si puedes. OnKeyListener no funciona con el teclado virtual (Android)

Tuve exactamente el mismo problema, pero en sólo 1 de mis aplicaciones de Android y yo nunca averiguar cuál era la diferencia.

Mi solución, sin embargo, fue hacer lo que Mayra sugirió y agregar un TextWatcher para manejar los eventos TextChanged. Así que funciona no importa cómo se produce la entrada de texto.

 editName.addTextChangedListener(new TextWatcher () { public void afterTextChanged(Editable s) { Button btnSave = (Button)findViewById(R.id.btnSaveToon); if(s.length() > 0) btnSave.setEnabled(true); else btnSave.setEnabled(false); } public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } }); 

Funciona como un encanto en el emulador y en mi HTC Inspire

Usted dice que está tratando con un EditText, pero su código se refiere a un TextView. Mi suposición es que usted tiene un EditText en sus archivos XML de la disposición, pero usted está refiriendo a este TextView recién creado en su código, que de hecho no está uniforme en el UI de la aplicación en absoluto.

Si ya hay un EditText en su archivo XML de diseño, entonces usted necesita para obtener un puntero a él en su código Java, probablemente utilizando el método findViewById() . A continuación, agregue su OnKeyListener a ese EditText.

Definir su diseño en XML realmente tiene mucho más sentido (al menos en muchos casos, si no la mayoría) de definirlo un componente a la vez y luego agregar cada uno de esos componentes a la interfaz de usuario, como lo hace en Swing. Pero se necesita un poco de acostumbrarse, no hay duda.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.