Maneje las teclas de flecha desde D-pad en la aplicación WebView de Google TV
He construido una aplicación para Android que carga una página html en WebView, y está funcionando bien, excepto el hecho de que las acciones deben suceder en las teclas de flecha D-pad no funcionará. Si cambio la acción de las flechas con otras teclas, funciona. Cargar la página html en el navegador web funciona bien, las teclas de flecha del teclado de la PC devuelven las acciones correctas, pero en Android WebView, las teclas de flecha D-pad no funcionan.
Así es como la llave del tigre presionada en js:
- El contenido de Webview de Android no debe perderse en el cambio de orientación, pero la GUI debe actualizarse correctamente
- Android WebView: amplía el zoom a una escala específica después de cargar el contenido
- (Cómo) puedo aumentar el límite de cuota de LocalStorage en Android WebView
- Ajuste del tamaño dinámico del diseño en Android
- cargar pdf desde url en android
window.addEventListener('keydown', keyDownHandler, true); function keyDownHandler(evt){ var keyCode=evt.keyCode; alert(keyCode); }
Excepto teclas de flecha, presionando cualquier otra tecla devuelve el código de la tecla, pero las flechas no.
Esto podría ser duplicado como aquí: androide WebView: manejar las teclas de flecha en JavaScript, pero no encontró una solución para trabajar.
¿Hay alguna manera de obtener los códigos de las teclas de flecha D-pad en Android WebView?
- Reducción inicial de zoom de Webview de Android
- Presentar contenido html como "páginas dinámicas"
- Cómo reproducir URL de vídeo dentro de la vista web de Android
- Android: Limitar la reducción de zoom en la vista web
- Crear un menú contextual personalizado en la selección de texto en WebView
- ¿Puedo obtener contenido de WebView con funciones de accesibilidad de android?
- Dibujo fuera de pantalla WebView a mapa de bits
- ¿Mostrar un mapa enorme con un buen rendimiento en Android?
Hay una aplicación de ejemplo en los ejemplos de Google TV llamada WebAppNativePlayback: https://code.google.com/p/googletv-android-samples/source/browse/#git%2FWebAppNativePlayback
Esencialmente, el d-pad es consumido por la aplicación nativa, por lo que necesita manejarlo, si utiliza un WebView de pantalla completa puede pasar las claves relevantes al WebView inyectándolo en JS.
Las principales piezas de código a prestar atención a son:
En la Actividad, consuma eventos clave y pasa hacia abajo:
/** * This method will check if the key press should be handled by the system * or if we have chosen to override it to pass to the WebView. In * development builds of the application, the R key is used refresh the page * (required to ensure cached versions of the page are not used) */ @Override public boolean dispatchKeyEvent(KeyEvent event) { if (mIsDevelopmentBuild && event.getKeyCode() == KeyEvent.KEYCODE_R) { mWebViewFragment.refresh(); } int eventKeyCode = event.getKeyCode(); for (int i = 0; i < mOverrideKeyCodes.length; i++) { if (eventKeyCode == mOverrideKeyCodes[i]) { if (event.getAction() == KeyEvent.ACTION_UP) { mWebViewFragment.handleKeyInjection(eventKeyCode); } return true; } } return super.dispatchKeyEvent(event); }
Donde las claves de anulación son:
mOverrideKeyCodes = new int[] { KeyEvent.KEYCODE_DPAD_CENTER, KeyEvent.KEYCODE_DPAD_UP, KeyEvent.KEYCODE_DPAD_LEFT, KeyEvent.KEYCODE_DPAD_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT };
En el fragmento donde vive la webview (aunque esto puede estar en tu actividad):
/** * Given a key code, this method will pass it into the web view to handle * accordingly * * @param keycode Native Android KeyCode */ public void handleKeyInjection(int keycode) { String jsSend = "javascript:androidKeyHandler.handleUri('nativewebsample://KEY_EVENT;" + keycode + ";');"; loadJavascriptAction(jsSend); }
LoadJavascriptAction es simplemente
mWebView.loadUrl(jsSend);
A continuación, en su página web, debe establecer un método accesible o objeto – en este caso, la aplicación establece un objeto window.androidKeyHandler
/** * This method will set up any additional key handling (ie Android key handling) * @function */ IndexPage.prototype.setUpKeyHandling = function () { if(this.isEmbedded()) { // We want the native app to access this window.androidKeyHandler = new AndroidKeyHandler(this.getFocusController()); } };
Que de maneja las llaves como así:
/** * Handle a keypress directly from the native app * @function * @param {int} keyCode The native Android key code */ AndroidKeyHandler.prototype.handleNativeKeyPress = function (keyCode) { var focusController = this.getFocusController(); switch(parseInt(keyCode, 10)) { case 23: // DPAD Center console.log("Native Enter"); if(focusController.getCurrentlyFocusedItem()) { focusController.getCurrentlyFocusedItem().onItemClick(); } break; case 20: // DPAD Down console.log("Native Down Pressed"); focusController.moveFocus({x: 0, y: -1}); break; case 21: // DPAD Left console.log("Native Left Pressed"); focusController.moveFocus({x: -1, y: 0}); break; case 22: // DPAD Right console.log("Native RIGHT Pressed"); focusController.moveFocus({x: 1, y: 0}); break; case 19: // DPAD Up console.log("Native UP Pressed"); focusController.moveFocus({x: 0, y: 1}); break; default: console.log("Keycode not registered"); break; } };
Este ejemplo es probablemente mucho más complejo de lo que necesita ser, pero si usted consigue el trabajo a través de cada pieza de arriba y probarlo, usted debe llegar allí sin demasiada molestia
- La cámara no se abre en WebView
- IntelliJ / Android Studio – cómo activar proguard para obfuscate código – paso a paso?