android中webview控件和javascript交互實例

當咱們要實現豐富的圖文混排效果的時候,咱們通常會使用webview,這是一個功能十分強大的的控件,來看看官方的解釋:javascript

複製代碼 代碼以下:html

A View that displays web pages. This class is the basis upon which you can roll your own web browser or simply display some online content within your Activity. It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.java

一個能顯示網頁內容的View。該類是你實現一個本身的瀏覽器,或者只是在activity中顯示網頁內容的基礎;它基於WebKit內核來顯示網頁,而且包含了實現先後翻頁、放大縮小,文字搜索方法。android

從上面你應該瞭解到了基本功能,也就是顯示網頁。這篇文章中咱們主要討論webview和Javascript的交互。若是你的js基礎比java基礎好的話那麼採用這種方式作一些複雜的處理是個不錯的選擇。web

WebView和js的交互包含兩方面,一是在html中經過js調用安卓的java代碼;二是在安卓java代碼中調用js。瀏覽器

1、html中經過js調用java代碼安全

js中調用java代碼其實就記住一點,webview設置一個和js交互的接口(注意這裏只是通常的意思,並非java中接口的含義),這個接口實際上是一個通常的類,同時爲這個接口取一個別名。這個過程以下:
app

複製代碼 代碼以下:ide


mWebView.addJavascriptInterface(new DemoJavaScriptInterface(),"demo");函數


new DemoJavaScriptInterface就是這個接口,demo就是這個接口的別名。
上面的代碼執行以後在html的js中就能經過別名(這裏是「demo」)來調用newDemoJavaScriptInterface類中的任何方法。

如咱們想讓html中的一個button點擊以後調用java中的函數能夠這樣:

複製代碼 代碼以下:


<input type="button" value="click me" onclick="window.demo.clickOnAndroid()"/>

可是由於安全問題,在Android4.2中(若是應用的android:targetSdkVersion數值爲17+)JS只能訪問帶有 @JavascriptInterface註解的Java函數。所以若是你的開發版本比較高,須要在被調用的函數前加上@JavascriptInterface註解。

下面是谷歌給出的代碼示例:
WebViewDemo.java

複製代碼 代碼以下:


package com.google.android.webviewdemo;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
/**
* Demonstrates how to embed a WebView in your activity. Also demonstrates how
* to have javascript in the WebView call into the activity, and how the activity
* can invoke javascript.
* <p>
* In this example, clicking on the android in the WebView will result in a call into
* the activities code in {@link DemoJavaScriptInterface#clickOnAndroid()}. This code
* will turn around and invoke javascript using the {@link WebView#loadUrl(String)}
* method.
* <p>
* Obviously all of this could have been accomplished without calling into the activity
* and then back into javascript, but this code is intended to show how to set up the
* code paths for this sort of communication.
*
*/
public class WebViewDemo extends Activity {
private static final String LOG_TAG = "WebViewDemo";
private WebView mWebView;
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
mWebView.loadUrl("file:///android_asset/demo.html");
}
final class DemoJavaScriptInterface {
DemoJavaScriptInterface() {
}
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
public void clickOnAndroid() {
mHandler.post(new Runnable() {
public void run() {
mWebView.loadUrl("javascript:wave()");
}
});
}
}
/**
* Provides a hook for calling "alert" from javascript. Useful for
* debugging your javascript.
*/
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d(LOG_TAG, message);
result.confirm();
return true;
}
}
}

demo.html

複製代碼 代碼以下:


<html>
<script language="javascript">
/* This function is invoked by the activity */
function wave() {
alert("1");
document.getElementById("droid").src="android_waving.png";
alert("2");
}
</script>
<body>
<!-- Calls into the javascript interface for the activity -->
<a onClick="window.demo.clickOnAndroid()"><div style="width:80px;
margin:0px auto;
padding:10px;
text-align:center;
border:2px solid #202020;" >
<img id="droid" src="android_normal.png"/><br>
Click me!
</div></a>
</body>
< /html>

main.xml

複製代碼 代碼以下:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/intro"
android:padding="4dip"
android:textSize="16sp"
/>
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
< /LinearLayout>

2、android調用js

上面的代碼在演示如何在js中調用java代碼的同時也演示瞭如何在java中調用js
調用形式:

複製代碼 代碼以下:

mWebView.loadUrl("javascript:wave()");


其中wave()是js中的一個方法,固然你能夠把這個方法改爲其餘的方法,也就是android調用其餘的方法。

demo的解釋:

如今你必定了解了android和js的交互了。是時候分析一些demo了,根據上面講的你也應該比較清楚了。具體交互流程以下:

①點擊圖片,則在js端直接調用android上的方法clickOnAndroid();
②clickOnAndroid()方法(利用線程)調用js的方法。
③被②調用的js直接控制html。

我的總結:利用webView的這種方式在有些時候UI佈局就能夠轉成相應的html代碼編寫了,而html佈局樣式之類有DW這樣強大的工具,並且網上不少源碼,不少代碼片。在UI和視覺效果上就會節省不少時間,重複發明輪子沒有任何意義。

您可能感興趣的文章:

相關文章
相關標籤/搜索