我正在玩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()");
}
});