Próbuję wywołać niektóre javascript
funkcje znajdujące się na html
stronie działającej w pliku android webview
. Całkiem proste, co kod próbuje zrobić poniżej - z aplikacji na Androida wywołaj javascript
funkcję z komunikatem testowym, który wywołuje z powrotem funkcję java w aplikacji na Androida, która wyświetla wiadomość testową za pośrednictwem toast.
Te javascript
spojrzenia działać jak:
function testEcho(message){
window.JSInterface.doEchoTest(message);
}
Z WebView próbowałem wywołać javascript
następujące sposoby bez powodzenia:
myWebView.loadUrl("javascript:testEcho(Hello World!)");
mWebView.loadUrl("javascript:(function () { " + "testEcho(Hello World!);" + "})()");
I nie pozwalają javascript
naWebView
myWebView.getSettings().setJavaScriptEnabled(true);
// register class containing methods to be exposed to JavaScript
myWebView.addJavascriptInterface(myJSInterface, "JSInterface");
I oto Java
klasa
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();
}
}
Spędziłem dużo czasu, szukając w Google, co robię źle. Wszystkie znalezione przykłady wykorzystują to podejście. Czy ktoś widzi tutaj coś nie tak?
Edycja: istnieje kilka innych javascript
plików zewnętrznych , do których się odwołuje i które są używane w html
, czy to może być problem?
źródło
@JavascriptInterface
dekoratora w metodach Java, które chcesz udostępnić WebView poprzez interfejs JavaScript.myWebView.loadUrl("javascript:testEcho('Hello World!')");
rozumiem, że już załączyłeś plik HTML do tego widoku. Czy możesz mi powiedzieć, jak to zrobiłeś?Odpowiedzi:
Zrozumiałem, na czym polega problem: brakujące cudzysłowy w parametrze testEcho (). Oto jak dostałem wezwanie do pracy:
źródło
Począwszy od KitKata, użyj metody replaceJavascript zamiast loadUrl, aby wywołać funkcje javascript, jak poniżej
źródło
loadUrl
spowodowało także, że klawiatura oprogramowania wyświetla się, gdy próbuję wpisać wartość w polu wejściowym.źródło
Stworzyłem ładne opakowanie do wywoływania metod JavaScript; pokazuje także błędy JavaScript w logu:
Musisz to również dodać:
I dodaj ten interfejs do swojego widoku internetowego:
źródło
final Object a = new Object(); callJavaScript(mBrowser, "alert", 1, true, "abc", a);
podda sięSyntaxError
zUnexpected token
co nie jest zaskakujące, kiedy obejrzysz generowanych js zadzwonić:javascript:try{alert(,,'abc',,)}catch(error){console.error(error.message);}
callJavaScript(mBrowser, "alert", "abc", "def");
generuje błąd, ponieważ na końcu zawsze występuje nieuczciwy przecinek. -1 ode mnie.callJavascript(mBrowser, "can't do it");
Tak, masz błąd składniowy. Jeśli chcesz uzyskać błędy JavaScript i instrukcje drukowania w logcat, musisz zaimplementować tę
onConsoleMessage(ConsoleMessage cm)
metodę w swoim WebChromeClient. Daje kompletne ślady stosu, takie jak konsola internetowa (element Inspect). Oto metoda.Po wdrożeniu otrzymasz swoje błędy JavaScript i wypisz instrukcje (
console.log
) na swoim logcat.źródło
Modyfikacja odpowiedzi @Ilya_Gazman
poprawnie utworzy połączenia JS np
Zauważ, że obiekty nie zostaną poprawnie przekazane - ale możesz je serializować przed przekazaniem jako argument.
Zmieniłem także, gdzie pojawia się błąd, przekierowałem go do dziennika konsoli, który można odsłuchać:
i klient
źródło
callJavascript(mBrowser, "can't do it");
:?Activity_main.xml
MainActivity.java
plik aktywów
źródło