首页 > 解决方案 > 为 WebView 添加窗口事件监听器并调用 Java 函数

问题描述

我在我的 Android 应用程序中使用 显示一个网页WebView,该网页触发一个窗口消息事件并通过该事件提供一些数据。我需要从消息事件中访问数据。

为此,我通过 usingevaluateJavascript()方法添加 JavaScript 事件侦听器,并尝试使用addJavascriptInterface().

到目前为止我的代码:

public class MyActivity extends AppCompatActivity {
    
    @Override
    @SuppressLint("SetJavaScriptEnabled")
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        WebView webView = new WebView(this);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setDomStorageEnabled(true);
    
        webView.addJavascriptInterface(new JsObject(this), "Android");
    
        webView.evaluateJavascript("window.addEventListener('message', (e) => {Android.logData('Test String')})", null);
    
        webView.loadUrl("https://example.com/mypage");
    
        setContentView(webView);
    }
    
    private class JsObject {
        Context context;
    
        JsObject(Context context) {
            this.context = context;
        }
    
        @JavascriptInterface
        public void logData(String s) {
            Log.v("EEE", s);
        }
    }
    
}

但是事件处理程序没有被调用。我不确定这是否是正确的方法。请帮忙。TIA。

标签: androidandroid-webview

解决方案


切换您loadUrlevaluateJavascript呼叫的顺序。正在重置该loadUrl状态。注意:这可能需要更改页面上的代码以避免竞争条件触发消息。

evaluateJavascript文档

在调用 loadUrl(java.lang.String) 之前定义的全局变量和函数将不会存在于加载的页面中


推荐阅读