2017-05-10 23 views
1

为了解释我想实现的目标,我写了我能做的事情,然后 - 当出现问题时。什么工作得很好:无法在两个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)我有一个包含在加载的HTML webView2

<script> 
    function f() { 
     document.write("bla bla bla"); 
    } 
</script> 

然后我打电话

webView2.loadUrl("javascript:f();"); 

在Android的代码和它的作品了。


现在我想在webView1按下按钮来修改webView2的页面。从技术上讲,这意味着我想在webView2内部调用f(),当JS界面检测到点击webView1时。所以我加这条线

webView2.loadUrl("javascript:f();"); 

in buttonPressed()函数里面的JS接口。但它没有效果。什么会导致问题?连接这些接收者和发送者有没有任何限制?也许我错过了一些设置或权限?

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

+0

删除分号webView2.loadUrl( “JavaScript的:F()”); –

+0

@AndyDeveloper不幸没有帮助 – Pavel

回答

0

我明白,我的问题是关系到另一个问题:一个无法更新从非主线程 UI(覆盖在SO herehere)。但在我的情况下,出于某种原因没有任何错误。也许是因为JavaScript不像Java那样“严格”。

所以在我的活动类中添加android.os.Handler,在onCreate功能分配给它解决:

handler = new Handler() { 
    public void handleMessage(Message msg) { 
     webView2.loadUrl("javascript:f()"); 
    } 
} 

buttonPressed功能对其进行访问:

handler.obtainMessage(1).sendToTarget(); 

附:另一种方法是打电话webView2.loadUrl("javascript:f()");Runnable并致电runOnUiThread(runnable)。它看起来更整齐:

webView1.addJavascriptInterface(new Object() { 
    @JavascriptInterface 
    public void buttonPressed() { 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       webView2.loadUrl("javascript:f()"); 
      } 
     }); 
    } 
}, "android"); 

P.P.S. Enabling Java 8app/build.gradle允许写更整齐:

runOnUiThread(()->{webView2.loadUrl("javascript:f()");}); 
相关问题