2009-12-28 17 views
16

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 de tecla para números y no alfabetos. ¿Hay alguna solución para resolver esto? Cualquier tipo de ayuda será muy apreciada.onKeyListener no funciona con el teclado virtual (Android)

+0

Suena raro si usted está recibiendo algunos caracteres pero no otros desde el teclado en pantalla. ¿Puedes publicar el código de tu oyente y dónde lo estás adjuntando? –

+0

public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.login_screen); emailTxt = (EditText) findViewById (R.id.email); emailTxt.setOnKeyListener (nueva OnKeyListener() { \t \t \t OnKey pública booleano (Ver v, int keyCode, evento KeyEvent) \t \t { \t \t \t Log.i ("Key Value", de cadena. valueOf (código de clave)); \t \t}); } –

+0

Solo estoy leyendo las claves por ahora. –

Respuesta

10

No creo que se llame a OnKeyListener en absoluto 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 hacer que onKeyListener sea bastante inútil, ya que solo funciona en teléfonos con teclados de hardware. Trabajé alrededor de este problema recientemente usando TextWatcher en el campo EditText en mi actividad en lugar de utilizar OnKeyListener.

+0

Intenté usar TextWatcher, pero necesito los eventos KeyUp y KeyDown para cada tecla presionada. Textwatcher me acaba de dar el evento clave. –

+0

No creo que sea posible escuchar KeyUp y KeyDown desde el teclado del software. –

7

onKeyListener funcionó a la perfección en Android 1.5 mediante el teclado en pantalla

Desde Android 1.6 en adelante las teclas de caracteres y números no van a través del evento OnKey, sin embargo, la tecla DEL hace

frustrante

3

Este parece ser específico del dispositivo. Puedo confirmar que esto funciona en Xoom y 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)

1

Me salvé esto al poner al oyente en su propio método y llamarlo nuevamente después de la primera vez. En el onCreate I invoco setKeyListenerForEnter();

Entonces, aquí está el método:

setKeyListenerForEnter public void() {

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 si esto es una solución mejor que manipule el teclado IME en sí, pero es una solución .

4

Esto es probablemente 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 tecla de hardware, no para el software.

Los fabricantes de dispositivos están siendo desalentados para propagar eventos de teclado a través de oyentes clave, aunque depende completamente del fabricante respetar eso o tratar realmente los teclados blandos y duros con los mismos términos.

A partir de Android 4.2.2, el sistema Android por sí solo no admitirá los eventos clave de alimentación para los teclados suaves en absoluto, por lo que incluso los fabricantes no podrán elegir su camino.

Por lo tanto, la única opción infalible aquí es implementar su propio IME (teclado virtual), y manejar las teclas usted mismo.

TextWatcher se puede utilizar principalmente para reemplazar los oyentes clave, sin embargo editText.setText (...); también activará los eventos de TextWatcher, por lo que si uno está interesado solo en las claves mecanografiadas, probablemente TextWatcher tampoco sea una solución.

Tenga cuidado al usar TextWatcher con AutocomleteTextView o EditText. No modifique el texto en el contenido de AutocompleteTextView/EditText desde los eventos de TextWatcher, ya que de lo contrario lo más probable es que termine en un ciclo infinito de eventos/escucha.

Espero que esto ayude a aclarar las opciones disponibles, pero lamentablemente no proporciona una solución de trabajo.

Decepcionante que Google haya omitido este importante aspecto de su IU.

-1
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); 
    } 
} 
+0

¿Podría darnos un ejemplo de cómo se puede usar este código? Lo intenté ahora y parece que no funciona. – Simon

+0

CanvasView clase pública se extiende Ver { \t \t CanvasView pública (Contexto c) { \t \t super (c); \t \t \t \t // permitir teclado \t \t setOnKeyListener (nuevo teclado()); \t \t setFocusable (verdadero); \t \t setFocusableInTouchMode (true); \t}} // habilitar el teclado en canvasView – user3309567

Cuestiones relacionadas