從WebView初探 瞭解到WebView的強大,。聽說WebView對Javascript的支援也很強,想從網上找些例子,還很難找,最終從google老家找了一個Java和Javascript互調的例子 ,當時看了,下巴“咣當”就掉在地上了,太強了!這樣也行?
整個Eclipse ADT工程例子中都有,這裡重點分析一下代碼:
Java代碼
public class WebViewDemo extends Activity {<br /> private WebView mWebView;<br /> private Handler mHandler = new Handler(); </p><p> public void onCreate(Bundle icicle) {<br /> super.onCreate(icicle);<br /> setContentView(R.layout.webviewdemo);<br /> mWebView = (WebView) findViewById(R.id.webview);<br /> WebSettings webSettings = mWebView.getSettings();<br /> webSettings.setJavaScriptEnabled(true);<br /> mWebView.addJavascriptInterface(new Object() {<br /> public void clickOnAndroid() {<br /> mHandler.post(new Runnable() {<br /> public void run() {<br /> mWebView.loadUrl("javascript:wave()");<br /> }<br /> });<br /> }<br /> }, "demo");<br /> mWebView.loadUrl("file:///android_asset/demo.html");<br /> }<br />}
public class WebViewDemo extends Activity { private WebView mWebView; private Handler mHandler = new Handler(); public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.webviewdemo); mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); mWebView.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { public void run() { mWebView.loadUrl("javascript:wave()"); } }); } }, "demo"); mWebView.loadUrl("file:///android_asset/demo.html"); }}
這裡的重點是addJavascriptInterface(Object obj,String interfaceName)方法,該方法將一個java對象綁定到一個javascript對象中,javascript對象名就是interfaceName,範圍是Global。這樣初始化webview後,在webview載入的頁面中就可以直接通過javascript:window.demo訪問到綁定的java對象了。來看看在html中是怎樣調用的:
Html代碼
<html><br /> <mce:script language="javascript"><!--</p><p> function wave() {<br /> document.getElementById("droid").src="android_waving.png";<br /> } </p><p>// --></mce:script><br /> <body><br /> <a onClick="window.demo.clickOnAndroid()"><br /> <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br><br /> Click me!<br /> </a><br /> </body><br /></html>
<html> <mce:script language="javascript"><!--<br /> function wave() { document.getElementById("droid").src="android_waving.png"; }<br />// --></mce:script> <body> <a onClick="window.demo.clickOnAndroid()"> <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br> Click me! </a> </body></html>
這樣在javascript中就可以調用java對象的clickOnAndroid()方法了,wave()方法是java中調用javascript的例子。
這裡還有幾個知識點:
1)為了讓WebView從apk檔案中載入assets,Android SDK提供了一個schema,首碼為"file:///android_asset/"。WebView遇到這樣的schema,就去當前包中的assets目錄中找內容。如上面的"file:///android_asset/demo.html"
2)addJavascriptInterface方法中要綁定的Java對象及方法要運行另外的線程中,不能運行在構造他的線程中,這也是使用Handler的目的