Estoy tratando de llamar a algunas javascript
funciones que se encuentran en una html
página que se ejecuta dentro de un android webview
. Bastante simple lo que el código intenta hacer a continuación: desde la aplicación de Android, llame a una javascript
función con un mensaje de prueba, que a su vez llama a una función de Java en la aplicación de Android que muestra el mensaje de prueba a través de una tostada.
La javascript
función se ve así:
function testEcho(message){
window.JSInterface.doEchoTest(message);
}
Desde WebView, he intentado llamar a javascript
las siguientes formas sin suerte:
myWebView.loadUrl("javascript:testEcho(Hello World!)");
mWebView.loadUrl("javascript:(function () { " + "testEcho(Hello World!);" + "})()");
Lo habilité javascript
en elWebView
myWebView.getSettings().setJavaScriptEnabled(true);
// register class containing methods to be exposed to JavaScript
myWebView.addJavascriptInterface(myJSInterface, "JSInterface");
Y aquí está la Java
clase
public class JSInterface{
private WebView mAppView;
public JSInterface (WebView appView) {
this.mAppView = appView;
}
public void doEchoTest(String echo){
Toast toast = Toast.makeText(mAppView.getContext(), echo, Toast.LENGTH_SHORT);
toast.show();
}
}
He pasado mucho tiempo buscando en Google para ver qué puedo estar haciendo mal. Todos los ejemplos que he encontrado utilizan este enfoque. ¿Alguien ve algo mal aquí?
Editar: Hay varios otros javascript
archivos externos a los que se hace referencia y se usan en el html
, ¿podrían ser el problema?
fuente
@JavascriptInterface
decorador en los métodos Java que desea poner a disposición de WebView a través de la interfaz de JavaScript.myWebView.loadUrl("javascript:testEcho('Hello World!')");
, entiendo que ya ha adjuntado el archivo html a esa vista web. ¿Podrías decirme cómo hiciste eso?Respuestas:
Descubrí cuál era el problema: faltan comillas en el parámetro testEcho (). Así es como recibí la llamada para trabajar:
fuente
Desde kitkat en adelante, use el método evalJavascript en lugar de loadUrl para llamar a las funciones de javascript como a continuación
fuente
loadUrl
también causó que el teclado del software apareciera cuando intento completar el valor en un campo de entrada.fuente
Creé un buen contenedor para llamar a los métodos de JavaScript; También muestra errores de JavaScript en el registro:
Necesitas agregar esto también:
Y agregue esta interfaz a su vista web:
fuente
final Object a = new Object(); callJavaScript(mBrowser, "alert", 1, true, "abc", a);
cederáSyntaxError
con loUnexpected token
que no es sorprendente cuando veas la llamada js generada:javascript:try{alert(,,'abc',,)}catch(error){console.error(error.message);}
callJavaScript(mBrowser, "alert", "abc", "def");
genera un error, ya que siempre hay una coma deshonesta al final. -1 de mi parte.callJavascript(mBrowser, "can't do it");
Sí, tienes el error de sintaxis. Si desea obtener sus errores de Javascript y las declaraciones de impresión en su logcat, debe implementar el
onConsoleMessage(ConsoleMessage cm)
método en su WebChromeClient. Proporciona los rastros completos de la pila como la consola web (elemento Inspeccionar). Aquí está el método.Después de la implementación, obtendrá sus errores de Javascript y las declaraciones de impresión (
console.log
) en su logcat.fuente
Modificación de la respuesta de @Ilya_Gazman
creará correctamente llamadas JS, por ejemplo
Tenga en cuenta que los objetos no se pasarán correctamente, pero puede serializarlos antes de pasarlos como argumento.
También he cambiado dónde va el error, lo he desviado al registro de la consola que puede ser escuchado por:
y cliente
fuente
callJavascript(mBrowser, "can't do it");
:?activity_main.xml
MainActivity.java
archivo de activos
fuente