gpt4 book ai didi

javascript - android 无法从 Javascript 运行 Java 函数

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:09:42 25 4
gpt4 key购买 nike

在我的项目中,我有一个加载页面 (HTML) 的 WebView。我想更改所有图像并在用户点击任何图像时显示 toast 。

所以我添加了调用 Java 函数的 javascript 代码:

// code is inside onPageFinished(..) function
JavaScriptInterface jsInterface = new JavaScriptInterface(activity);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(jsInterface, "JSInterface");

webView.evaluateJavascript(
"var imgs = document.getElementsByTagName('img');" +
"for (var i = 0; i < imgs.length; i++) {" +
"imgs[i].src = 'file:///android_asset/rules_images_placeholder.png';" +
"imgs[i].addEventListener('click', function() {" +
"window.JSInterface.showToast(); " + // <-- isn't called: see logs
"});" +
"} " +
"window.JSInterface.showToast();" // <-- is called
, null);

JavaScriptInterface class:

public class JavaScriptInterface {
private Activity activity;
public JavaScriptInterface(Activity activity) {
this.activity = activity;
}
@JavascriptInterface
public void showToast() {
Toast.makeText(activity, "Toast message", Toast.LENGTH_SHORT).show();
}
}

showToast() 应该在什么时候调用

  1. 页面加载完成

  2. 用户点击了图片

问题:showToast() 仅调用一次 - 当页面加载完成时。当用户点击图像时,showToast() 不会被调用,而是会出现以下日志:

Uncaught TypeError: Cannot read property 'showToast' of undefined", source:

问题

如何在图片点击时调用showToast()

最佳答案

我不确定为什么,但您可以通过在加载 HTML 内容之前添加 JavaScript 接口(interface)来解决此问题。

jsInterface = new JavaScriptInterface(activity);
fragmentWebView.getSettings().setJavaScriptEnabled(true);
fragmentWebView.getSettings().setDomStorageEnabled(true);
fragmentWebView.addJavascriptInterface(jsInterface, "JSInterface");

fragmentWebView.loadDataWithBaseURL("file:///android_asset/", fullHtml, "text/html", "utf-8", null);
fragmentWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
view.loadUrl(
"javascript:var imgs = document.getElementsByTagName('img');" +
"for (var i = 0; i < imgs.length; i++) {" +
"imgs[i].src = 'file:///android_asset/rules_images_placeholder.png';" +
"imgs[i].addEventListener('click', function(e) {" +
"window.JSInterface.showToast(); " +
"});" +
"}" +
"console.log(window.JSInterface);" +
"window.JSInterface.showToast(); ");
}
});

关于javascript - android 无法从 Javascript 运行 Java 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51083771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com