9

Estoy tratando de escuchar eventos clave en la vista web de Android. Ejemplo cuando el usuario está llenando un formulario, debería recibir los eventos clave. Este es mi código WebViewLeer eventos de teclado en Android WebView

public class MyWebView extends WebView implements OnKeyListener 
{ 
    ..... 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     Log.i("PcWebView", "onKeyDown keyCode=" + keyCode); 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) 
    { 
     Log.i("PcWebView", "onKeyUp keyCode=" + keyCode); 
     return super.onKeyUp(keyCode, event); 
    } 

    @Override // Listener is initialized in the constructor 
    public boolean onKey(View v, int keyCode, KeyEvent event) 
    { 
     Log.i("PcWebView", "onKey keyCode=" + keyCode); 
     return false; 
    } 

    ..... 

} 

ninguno de los métodos onKeyDown, onKeyUp y onKey están siendo llamados al usuario escribe en los cuadros de texto o áreas de texto. ¿Es posible lograr esto o tiene Android restringido este b'cos de una posible violación de la privacidad?

+0

que fueron capaces de conseguir que funcione? Tengo exactamente el mismo problema en este momento ... –

+4

No, este tipo de acción se considera insegura ya que se pueden registrar contraseñas, etc. Por lo tanto, no está permitido en Android. –

Respuesta

9

¡Precaución! Esta solución solo admite letras en inglés.

Realizado sin ningún tipo de acceso al código fuente HTML o eventos JS. Funciona para mí en Android 5.0.2 para teclados suaves y de hardware.

public class MyWebView extends WebView { 


    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
     return new BaseInputConnection(this, false); //this is needed for #dispatchKeyEvent() to be notified. 
    } 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 
     boolean dispatchFirst = super.dispatchKeyEvent(event); 
     // Listening here for whatever key events you need 
     if (event.getAction() == KeyEvent.ACTION_UP) 
      switch (event.getKeyCode()) { 
       case KeyEvent.KEYCODE_SPACE: 
       case KeyEvent.KEYCODE_ENTER: 
        // e.g. get space and enter events here 
        break; 
      } 
     return dispatchFirst; 
    } 
} 

El truco aquí es reemplazar la implementación de entrada proporcionado por el sistema de InputConnection con una simplificado. Evitar que los desarrolladores accedan a los eventos por defecto fue realizado por Googlers a propósito. Porque la entrada del evento clave ya no es la única. Hay gestos, voz y más viene. La recomendación oficial es "dejar de confiar en eventos clave heredados para la entrada de texto en absoluto". Consulte más detalles aquí: https://code.google.com/p/android/issues/detail?id=42904#c15

+0

¿funciona cuando el foco está en un cuadro de texto? –

+0

@PC. si seguro. P.ej. si la página cargada en WebView es algo así como https://www.google.com.ua, recibirá una notificación por cada entrada de letra en el cuadro de texto. – riwnodennyk

+0

Esto puede causar problemas. Debido a que ignoras el 'EditorInfo' (que lleva la información de 'InputType') esto puede llevar a que se muestre el teclado incorrecto. p.ej. el último teclado usado es numérico pero el usuario hace clic en el campo de texto, aparece el teclado numérico (curiosamente, esto solo sucedía en ciertos dispositivos, por ejemplo, HTC One M8). Intenté ocultar el teclado en Enter, tuve que lograrlo de otra manera: oculté el teclado cuando la URL está a punto de cargarse ('webViewClient.shouldOverrideUrlLoading()'). – hmac

1

Puede utilizar onUnhandledKeyEvent() función OVERRID en clase WebViewClient. Funciona perfectamente para mí.

onUnhandledKeyEvent

@Override 
public void onUnhandledKeyEvent(WebView view, KeyEvent event) { 
     return; 
} 

whenever a user presses any key on the keyboard, this event will get fire. 
Please let me know if that's works for you?