为了解释我想要实现的目标,我写下了我能够做的事情然后 - 出现问题时。什么效果很好:
1)我有webView1
包含加载的HTML
<button onclick="android.buttonPressed();">Click</button>
与界面绑定:
private class WebAppInterface1 {
Context context;
WebAppInterface1(Context c) {
context = c;
}
@JavascriptInterface
public void buttonPressed() {
Toast.makeText(context, "buttonPressed", Toast.LENGTH_LONG).show();
}
}
HTML按钮有效。
2)我有webView2
包含加载的HTML
<script>
function f() {
document.write("bla bla bla");
}
</script>
然后我打电话给
webView2.loadUrl("javascript:f();");
在Android代码中也可以。
现在我想按webView2
中的按钮修改webView1
的页面。从技术上讲,这意味着当JS接口检测到f()
中的点击时,我想在webView2
内调用webView1
。所以我添加了这一行
webView2.loadUrl("javascript:f();");
在JS接口内的buttonPressed()
函数中。但它没有效果。什么可能导致问题?连接这些接收器和发送器是否有任何限制?也许我错过了一些设置或权限?
有我的项目文件,我试图让它们变得尽可能简单:layout,html,java。没有编辑其他文件。如果需要,可以提供任何其他信息。
答案 0 :(得分:0)
我了解到我的问题与另一个问题有关:无法从非主线程更新用户界面(SO here和here已涵盖)。但就我而言,出于某种原因没有任何错误。也许是因为JavaScript不是&#34;严格&#34;作为Java。
通过在我的活动类中添加 if($(".body-class-name").length > 0){
var firstname = $(localStorage.getItem("first_name");
if (firstname) {
$('#title-text').text(firstname));
}
}
来解决,在android.os.Handler
函数中分配它:
onCreate
并在handler = new Handler() {
public void handleMessage(Message msg) {
webView2.loadUrl("javascript:f()");
}
}
函数中访问它:
buttonPressed
P.S。另一种方法是通过handler.obtainMessage(1).sendToTarget();
包裹调用webView2.loadUrl("javascript:f()");
并调用Runnable
。它看起来更整洁:
runOnUiThread(runnable)
P.P.S。 webView1.addJavascriptInterface(new Object() {
@JavascriptInterface
public void buttonPressed() {
runOnUiThread(new Runnable() {
@Override
public void run() {
webView2.loadUrl("javascript:f()");
}
});
}
}, "android");
中的Enabling Java 8允许写得更整洁:
app/build.gradle