Я пытаюсь вызвать некоторые javascript
функции, сидя на html
странице, работающей внутри android webview
. Довольно просто то, что код пытается сделать ниже - из приложения для Android, вызвать javascript
функцию с тестовым сообщением, которое inturn вызывает функцию Java обратно в приложение для Android, которое отображает тестовое сообщение через тост.
В javascript
функции выглядит следующим образом :
function testEcho(message){
window.JSInterface.doEchoTest(message);
}
Из WebView я безуспешно пытался назвать javascript
следующие способы:
myWebView.loadUrl("javascript:testEcho(Hello World!)");
mWebView.loadUrl("javascript:(function () { " + "testEcho(Hello World!);" + "})()");
Я включил javascript
наWebView
myWebView.getSettings().setJavaScriptEnabled(true);
// register class containing methods to be exposed to JavaScript
myWebView.addJavascriptInterface(myJSInterface, "JSInterface");
И вот Java
класс
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();
}
}
Я потратил много времени на поиски, чтобы понять, что я делаю не так. Все примеры, которые я нашел, используют этот подход. Кто-нибудь видит здесь что-то не так?
Изменить: Есть несколько других внешних javascript
файлов, на которые ссылаются и используются в html
, могут ли они быть проблемой?
источник
@JavascriptInterface
декоратор в методах Java, которые вы хотите сделать доступными для WebView через интерфейс JavaScript.myWebView.loadUrl("javascript:testEcho('Hello World!')");
я понимаю, что вы уже прикрепили HTML-файл к этому веб-представлению. Не могли бы вы сказать мне, как ты это сделал?Ответы:
Я понял, в чем проблема: пропущенные кавычки в параметре testEcho (). Вот как я получил вызов на работу:
источник
Начиная с kitkat, используйте метод loadJavascript вместо loadUrl для вызова функций javascript, как показано ниже
источник
loadUrl
также вызвал появление программной клавиатуры при попытке ввести значение в поле ввода.источник
Я создал хорошую оболочку для вызова методов JavaScript; это также показывает ошибки JavaScript в журнале:
Вы должны добавить это тоже:
И добавьте этот интерфейс в ваше веб-представление:
источник
final Object a = new Object(); callJavaScript(mBrowser, "alert", 1, true, "abc", a);
уступятSyntaxError
сUnexpected token
которой не удивительно , когда вы будете смотреть на сгенерированных JS называют:javascript:try{alert(,,'abc',,)}catch(error){console.error(error.message);}
callJavaScript(mBrowser, "alert", "abc", "def");
генерирует ошибку, так как в конце всегда есть мошенническая запятая. -1 от меня.callJavascript(mBrowser, "can't do it");
Да, у вас есть синтаксическая ошибка. Если вы хотите получать ошибки Javascript и операторы печати в logcat, вы должны реализовать
onConsoleMessage(ConsoleMessage cm)
метод в вашем WebChromeClient. Он дает полные трассировки стека, такие как веб-консоль (элемент Inspect). Вот метод.После реализации вы получите ваши ошибки Javascript и выведите операторы (
console.log
) в logcat.источник
Модификация ответа @Ilya_Gazman
будет правильно создавать вызовы JS, например
Обратите внимание, что объекты не будут переданы правильно - но вы можете сериализовать их перед передачей в качестве аргумента.
Также я изменил, куда идет ошибка, я переместил ее в консольный журнал, который можно прослушать:
и клиент
источник
callJavascript(mBrowser, "can't do it");
?activity_main.xml
MainActivity.java
файл активов
источник