Realizar las llamadas directamente desde java a javascript con Phonegap

Estoy escribiendo un complemento nativo para crear un evento en JavaScript cuando se muestra el teclado. Hago esto:

appView.sendJavascript("cordova.fireWindowEvent('show_keyboard')") 

En mi JavaScript, entonces hago algo como:

 window.addEventListener('show_keyboard', handler); 

Sin embargo, esto ha sido señalado como un gran no no en PhoneGap por un experto PhoneGap en el equipo. ¿Qué hay de malo con este enfoque?

En busca de una respuesta de fuentes creíbles y / o oficiales.

Bueno yo también no soy un experto PhoneGap, pero Apache Cordova , el motor que tiene PhoneGap fuente en GitHub .

¿Qué dice la fuente?

Bueno, como un ejemplo, veamos cómo Cordova envía su evento volumedownbutton . Presento las líneas 613-621 de CordovaWebView.java :

 if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { this.loadUrl("javascript:cordova.fireDocumentEvent('volumedownbutton');"); return true; } // If volumeup key else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { this.loadUrl("javascript:cordova.fireDocumentEvent('volumeupbutton');"); return true; } 

Parece que Cordova emplea un enfoque similar para enviar eventos a JavaScript.

¿Qué hay de malo en lo que tienes?

No estoy seguro de cuál fue el problema exacto que su compañero de trabajo planteó, pero parece que sendJavascript está obsoleto . Así que, ahí está eso. Pero si tu appView es un CordovaWebView , solo puedes llamar a loadUrl de la misma manera que lo hace Córdova (como se muestra arriba).

No soy experto en telefonía, pero ¿por qué no llamas directamente al método en lugar de usar oyentes?

por ejemplo

 function keyboardShown() { alert("test"); //or other code } 

y

 appView.sendJavascript("keyboardShown();") 

De esta manera se elimina la sobrecarga que tiene a través del oyente.

Si esto todavía no satisface a su experto del teléfono, pregúntele qué él haría para mejorar este código.

  • ¿Cómo mostrar el diálogo de alerta de Android en Webview?
  • ¿Cómo incluir archivos '.jar' en React-native para Android?
  • ¿Cuál es la causa de este problema "No se puede convertir el argumento de la clase de tipo org.json.JSONArray" en reaccionar-androide nativo?
  • JQuery indicador de actividad móvil no se muestra en android
  • Cómo traer el campo enfocado en la vista usando iscroll y Android WebView
  • Cómo mostrar la barra de direcciones de nuevo después de salir de pantalla completa en Android
  • DOMException: play () sólo puede iniciarse mediante un gesto del usuario
  • Cordova: Pause evento no disparar
  • (Javascript) window.onblur y window.onfocus no funcionan en el dispositivo móvil android
  • ¿El enlace JavaScript de JNI de Android pasa eficientemente TypedArray / ArrayBuffer a Java como una matriz?
  • Vista web de Android con GSAP: intenta eliminar la referencia local que no sea JNI,
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.