2017-05-10 10 views
1

私が達成したいことを説明するために、私はできることを書いた後、問題が発生したときに書きました。2つのWebView間で通信できない

1)私はインターフェイスをバインドさロードされたHTML

<button onclick="android.buttonPressed();">Click</button> 

に含むwebView1を持っている:何がうまく機能

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.loadUrl("javascript:f();"); 

呼び出すと、それはあまりにも動作しますロードされたHTMLに

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

を含むwebView2を持っています。


は、今私はwebView1のボタンを押すことでwebView2のページを修正したいです。技術的には、私はf()webView2内にJSインターフェイスが検出されたときにwebView1をクリックして呼び出すことを意味します。だから私はこの行を追加する

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

buttonPressed()関数は、JSのインターフェイス内に追加します。しかし、それは効果がありません。何が問題を引き起こす可能性がありますか?これらの受信者と送信者を接続する際に制限はありますか?たぶん私はいくつかの設定やアクセス許可を忘れましたか?

私のプロジェクトファイルがありますが、私はできるだけ彼らは同じくらい簡単作ってみました:layouthtmljava。他のファイルを編集しませんでした。必要に応じて追加情報を提供することができます。

+0

削除セミコロンwebView2.loadUrl( "ジャバスクリプト:F()")。 –

+0

@AndyDeveloper残念ながらそれは役に立たない – Pavel

答えて

0

私は私の問題は別の問題に関連していることが分かる:1は、非メインスレッド(SO herehereに覆われていた)からUIを更新することはできません。しかし、私の場合、何らかの理由でエラーはありません。多分JavaScriptのためにJavaのように "厳格"ではありません。

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

buttonPressed機能でそれをアクセス:

handler.obtainMessage(1).sendToTarget(); 

P.S.そうonCreate機能でそれを割り当てる、私の活動のクラスにandroid.os.Handlerを追加することで解決

もう1つの方法は、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. app/build.gradleEnabling Java 8はさらにきちんとそれを書くことを可能にする:

runOnUiThread(()->{webView2.loadUrl("javascript:f()");}); 
関連する問題