Ich versuche, einige javascript
Funktionen aufzurufen , die auf einer html
Seite in einem ausgeführt werden android webview
. Ziemlich einfach, was der Code unten versucht - rufen Sie in der Android-App eine javascript
Funktion mit einer Testnachricht auf, die eine Java-Funktion in der Android-App zurückruft, die die Testnachricht per Toast anzeigt.
Die javascript
Funktion sieht aus wie:
function testEcho(message){
window.JSInterface.doEchoTest(message);
}
In WebView habe ich javascript
ohne Glück versucht, die folgenden Methoden aufzurufen :
myWebView.loadUrl("javascript:testEcho(Hello World!)");
mWebView.loadUrl("javascript:(function () { " + "testEcho(Hello World!);" + "})()");
Ich habe javascript
auf dem aktiviertWebView
myWebView.getSettings().setJavaScriptEnabled(true);
// register class containing methods to be exposed to JavaScript
myWebView.addJavascriptInterface(myJSInterface, "JSInterface");
Und hier ist die Java
Klasse
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();
}
}
Ich habe viel Zeit damit verbracht, zu googeln, um zu sehen, was ich möglicherweise falsch mache. Alle Beispiele, die ich gefunden habe, verwenden diesen Ansatz. Hat hier jemand etwas falsch gesehen?
Bearbeiten: Es gibt mehrere andere externe javascript
Dateien, auf die verwiesen und die in verwendet html
werden. Könnten sie das Problem sein?
quelle
@JavascriptInterface
Decorator für die Java-Methoden verwenden müssen, die Sie über die JavaScript-Oberfläche für WebView verfügbar machen möchten.myWebView.loadUrl("javascript:testEcho('Hello World!')");
, dass Sie die HTML-Datei bereits an diese Webansicht angehängt haben. Können Sie mir sagen, wie Sie das gemacht haben?Antworten:
Ich habe herausgefunden, was das Problem war: fehlende Anführungszeichen im Parameter testEcho (). So bekam ich den Ruf zur Arbeit:
quelle
Ab Kitkat verwenden Sie stattdessen die evaluJavascript-Methode loadUrl, um die folgenden Javascript-Funktionen aufzurufen
quelle
loadUrl
Außerdem wurde die Softwaretastatur angezeigt, wenn ich versuche, den Wert in ein Eingabefeld einzugeben.quelle
Ich habe einen schönen Wrapper erstellt, um JavaScript-Methoden aufzurufen. Außerdem werden JavaScript-Fehler im Protokoll angezeigt:
Sie müssen dies auch hinzufügen:
Und fügen Sie diese Schnittstelle zu Ihrer Webansicht hinzu:
quelle
final Object a = new Object(); callJavaScript(mBrowser, "alert", 1, true, "abc", a);
wird ergebenSyntaxError
mitUnexpected token
denen ist nicht verwunderlich , wenn man sich die erzeugte js aussehen nennen:javascript:try{alert(,,'abc',,)}catch(error){console.error(error.message);}
callJavaScript(mBrowser, "alert", "abc", "def");
erzeugt einen Fehler, da am Ende immer ein falsches Komma steht. -1 von mir.callJavascript(mBrowser, "can't do it");
Ja, Sie haben den Syntaxfehler. Wenn Sie Ihre Javascript-Fehler und Druckanweisungen in Ihrem Logcat erhalten möchten, müssen Sie die
onConsoleMessage(ConsoleMessage cm)
Methode in Ihrem WebChromeClient implementieren. Es gibt die vollständigen Stack-Traces wie die Webkonsole (Inspect-Element). Hier ist die Methode.Nach der Implementierung erhalten Sie Ihre Javascript-Fehler und print-Anweisungen (
console.log
) auf Ihrem Logcat.quelle
Änderung der @ Ilya_Gazman-Antwort
erstellt JS-Aufrufe korrekt, z
Beachten Sie, dass Objekte nicht korrekt übergeben werden. Sie können sie jedoch serialisieren, bevor Sie sie als Argument übergeben.
Außerdem habe ich geändert, wohin der Fehler führt. Ich habe ihn in das Konsolenprotokoll umgeleitet, das abgehört werden kann von:
und Client
quelle
callJavascript(mBrowser, "can't do it");
?activity_main.xml
MainActivity.java
Assets-Datei
quelle