setonkeylistener - onkeylistener android
onKeyListener no funciona con un teclado suave(Android) (6)
Estoy usando onKeyListener para obtener los eventos onKey. Funciona bien con el teclado normal. Pero no funciona con el teclado suave. Solo puedo obtener eventos onKey para números y no alfabetos. ¿Hay alguna solución para resolver esto? Cualquier tipo de ayuda será muy apreciada.
Esto parece ser específico del dispositivo. Puedo confirmar que esto funciona en el Xoom y el Acer A100. Sin embargo, el Samsung Galaxy Tab Plus solo activa el evento para los botones que no son de carácter. (Todos los dispositivos ejecutan Honeycomb)
No creo que se llame a un OnKeyListener con el teclado del software. Tiene algo que ver con que el teclado del software sea un dispositivo IME y los dispositivos IME posiblemente sean cosas distintas de los teclados. Sin embargo, parece que onKeyListener es bastante inútil, ya que solo funciona en teléfonos con teclados de hardware. Recientemente TextWatcher este problema usando TextWatcher en el campo EditText en mi actividad en lugar de usar OnKeyListener.
Probablemente sea estúpido, pero así es como funciona Android en este momento.
La documentación indica que los eventos clave solo se propagarán para las pulsaciones de hardware, no para el software.
Los fabricantes de dispositivos están realmente desanimados para propagar eventos de teclado suave a través de escuchas clave, aunque es completamente responsabilidad del fabricante cumplir con eso o tratar realmente los teclados suaves y duros con los mismos términos.
A partir de Android 4.2.2, el sistema Android en sí mismo no admitirá eventos clave para los teclados programables, por lo que incluso los fabricantes no podrán elegir su camino.
Entonces, la única opción infalible aquí es implementar su propio IME (teclado suave) y manejar las pulsaciones de teclas usted mismo.
TextWatcher se puede utilizar principalmente para reemplazar los escuchas clave, sin embargo editText.setText (...); También activará los eventos de TextWatcher, por lo que si a uno solo le interesan las teclas escritas, probablemente TextWatcher tampoco sea una solución.
Tenga cuidado al utilizar TextWatcher con AutocomleteTextView o EditText. No modifique el texto del contenido de AutocompleteTextView / EditText desde los eventos de TextWatcher, ya que de lo contrario probablemente terminará en un bucle de escucha / evento infinito.
Espero que esto ayude a aclarar las opciones disponibles, pero lamentablemente no proporciona una solución de trabajo.
Es decepcionante que Google se haya perdido este importante aspecto de su interfaz de usuario.
Resolví esto poniendo al oyente en su propio método y volviéndolo a llamar después de la primera vez. En el onCreate llamo setKeyListenerForEnter ();
Entonces, aquí está el método:
public void setKeyListenerForEnter () {
final EditText search_entry = (EditText) findViewById(R.id.search_entry);
search_entry.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// If the event is a key-down event on the "enter" button
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
getSearchResults(v);
setKeyListenerForEnter();
return true;
}
return false;
}
});
}
No estoy seguro de si esta es una mejor solución que manejar el teclado IME en sí, pero es una solución.
onKeyListener funcionó perfectamente en Android 1.5 a través del teclado suave
Desde Android 1.6 en adelante, las teclas de caracteres y números no van a través del evento onKey, pero la tecla DEL sí
Frustrante
setFocusableInTouchMode(true); //Enable soft keyboard on touch for target view
setFocusable(true); //Enable hard keyboard to target view
ejemplo:
public class CanvasView extends View{
public CanvasView(Context c){
super(c);
//enable keyboard
setOnKeyListener(new KeyBoard());
setFocusable(true);
setFocusableInTouchMode(true);
}
}