无法在两个WebView之间进行通信

时间:2017-05-10 07:26:07

标签: android android-webview

为了解释我想要实现的目标,我写下了我能够做的事情然后 - 出现问题时。什么效果很好:

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()函数中。但它没有效果。什么可能导致问题?连接这些接收器和发送器是否有任何限制?也许我错过了一些设置或权限?

有我的项目文件,我试图让它们变得尽可能简单:layouthtmljava。没有编辑其他文件。如果需要,可以提供任何其他信息。

1 个答案:

答案 0 :(得分:0)

我了解到我的问题与另一个问题有关:无法从非主线程更新用户界面(SO herehere已涵盖)。但就我而言,出于某种原因没有任何错误。也许是因为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