2015-06-29 46 views
3

我正在玩Android的WebView:我有一個示例文本「asdf」,當用戶點擊一個按鈕(紅色,綠色或藍色)時應該被染色。爲了讓事情有點複雜,web視圖首先告訴Java代碼來觸發顏色變化,然後從內部的Java web視圖改變:WebView的loadUrl(「javascript:...」)不起作用

public class MainActivity extends ActionBarActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final WebView myWebView = (WebView) findViewById(R.id.webview); 
     WebSettings webSettings = myWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     webSettings.setDomStorageEnabled(true); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      WebView.setWebContentsDebuggingEnabled(true); 
     } 

     final WebAppInterface webAppInterface = new WebAppInterface(this, myWebView); 
     myWebView.addJavascriptInterface(webAppInterface, "Android"); 
     myWebView.loadUrl("file:///android_asset/index.html"); 
    } 
} 

這是接口:

public class WebAppInterface { 

    Context context; 
    WebView webView; 

    WebAppInterface(Context context, WebView webView) { 
     this.context = context; 
     this.webView = webView; 
    } 

    @JavascriptInterface 
    public void dye(String color) { 
     switch (color) { 
      case "red": 
       webView.loadUrl("javascript:dyeRed()"); 
       break; 
      case "green": 
       webView.loadUrl("javascript:dyeGreen()"); 
       break; 
      case "blue": 
       webView.loadUrl("javascript:dyeBlue()"); 
       break; 
     } 
    } 
} 

在我的HTML文件中有3個按鈕,像這樣的:

<button onClick="callDyeRed()"> 
    RED 
</button> 

和得到成功加載我有功能類似於這些的JavaScript文件中:

function callDyeRed() { 
    Android.dye("red"); 
} 
function dyeRed() { 
    document.getElementsByTagName('body')[0].style.color = 'red'; 
} 

當我點擊按鈕時,我看到WebAppInterface內部的行webView.loadUrl("javascript:dyeRed()")被執行。因此,js-> Java通信起作用。然而,相反的情況並非如此:之後不會執行Javascript代碼。

我在這裏錯過了什麼?

如果我從WebViewClient內改變顏色,通信作品:

myWebView.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onPageFinished(WebView webView, String url) { 
     webView.loadUrl("javascript:dyeGreen()"); 
    } 
}); 

回答

0

綁定對JavaScript對象在另一個線程(「爲JavaBridge」)中運行,而不是在螺紋(「活套')在它被修建了。 必須在同一個線程上調用所有WebView方法。因此,您無法在新創建的線程中調用loadUrl方法。

可能的解決方法:

Webappinterface.java

class WebAppInterface { 

    Context context; 
    WebView webView; 

    WebAppInterface(Context context, WebView webView) { 
     this.context = context; 
     this.webView = webView; 
    } 

    @JavascriptInterface 
    public String dye(String color) { 
     switch (color) { 
      case "red": 
       return "dyeRed"; 
      case "green": 
       return "dyeGreen"; 
      case "blue": 
       return "dyeBlue"; 
      default: 
       return "alert"; 

     } 
    } 
} 

的script.js

function callDyeRed() { 
    window[Android.dye("red")](); 
} 
function dyeRed() { 
    document.getElementsByTagName('body')[0].style.backgroundColor = 'red'; 
}