Leer eventos de teclado en Android WebView
Estoy tratando de escuchar los 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 de 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; } ..... }
onKeyUp
de los métodos onKeyDown
, onKeyUp
y onKey
se llaman cuando el usuario escribe en los textbox o textareas. ¿Es posible lograr esto o ha Android restringido este b'cos de una violación de privacidad posible?
- Añadir indicador de carga / barra de progreso a Phonegap Pantalla de bienvenida de Android
- Robolectric no utiliza ShadowWebView como la superclase de una clase que extiende WebView. MustOverrideException en su lugar
- Vista web de Android, cargando archivo javascript en la carpeta de activos
- Android / PhoneGap: destruir la vista web cuando se va de fondo en lugar de keepRunning = false
- De todos modos para capturar datos de formulario a través del método POST en Android WebView?
- Android Load Cache Only no funciona. Mostrar WebView fuera de línea
- WebView con cliente HTTP personalizado
- Fuente personalizada para webview android
- LeakCanary detecta pérdida de memoria de Android WebView
- La página Web Gujarati no se muestra perfecta en la vista Web
- Webview en Scrollview
- WebView de Android cargando en blanco al ver listas anidadas html
- Cómo interceptar datos POST en una vista web de android
¡Precaución! Esta solución sólo admite letras en inglés.
Realizado sin acceso al código fuente HTML o eventos JS. Funciona para mí en Android 5.0.2 para teclados blandos 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: // eg get space and enter events here break; } return dispatchFirst; } }
El truco aquí es sobreponerse a la implementación de entradas proporcionada por el sistema de InputConnection
con una simplificada. Evitar que los desarrolladores accedan a los eventos de forma predeterminada fue hecho por Googlers a propósito. Porque la entrada del evento clave ya no es la única. Hay gestos, voz y más. La recomendación oficial es "dejar de confiar en eventos legados clave para la entrada de texto en absoluto" . Consulta más detalles aquí: https://code.google.com/p/android/issues/detail?id=42904#c15
Puede utilizar la función onUnhandledKeyEvent () sobreescrita en la 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?
No sé si has intentado esto ya, pero … alternativamente, puedes habilitar javascript para tu "MyWebViewClass" y usar eventos javascript para llamar al código java usando webView.addJavascriptInterface (…. etc)
Historia completa: – http://developer.android.com/guide/webapps/webview.html#BindingJavaScript
- Relacionar URI con <data> como http://example.com/algo en AndroidManifest
- Condición de carrera entre la aplicación onCreate y los recursos cargados?