android - 为 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。
解决方案
切换您loadUrl
和evaluateJavascript
呼叫的顺序。正在重置该loadUrl
状态。注意:这可能需要更改页面上的代码以避免竞争条件触发消息。
在调用 loadUrl(java.lang.String) 之前定义的全局变量和函数将不会存在于加载的页面中
推荐阅读
- javascript - 如何从 React Native 中的 Reference 数据类型获取 Firebase Firestore 中的数据
- c++ - 输出的简单重定向与实现记录器
- asp.net-core - 为什么 Newtonsoft [JsonIgnore] 停止在 asp core mvc 中工作
- regex - 16位身份证的正则表达式如何写,规则如下?
- javascript - 为什么 obj.constructor.prototype 并不总是等于 obj.__proto__?
- javascript - 如何将用于 React SPA 的 Paypal Javascript SDK 与后端服务器验证集成?
- macos - IDE 不尊重 macOS 中的环境变量
- c - 是否可以将结构指针转换为c中的函数指针?
- c# - 如何在 Blazor 中通过 Entity Framework Core 运行原始 SQL 查询
- firebase - 如何解决此错误“无法分配'用户'类型的值?' 键入“字符串?”?