在android的開發過程中,有很多時候需要用到本地java代碼和javascript進行互動。android對互動進行了很好的封裝,在開發中我們可以很簡單的用java代碼調用webview中的js,也可以用webview中的js來調用本地的java代碼,這樣我們可以實作很多原來做不了的功能,比如點選網頁上的電話号碼後,手機自動撥打電話,點選網頁中的笑話,自動發送短信等.
廢話不多說,這次教程的目标如下
android 中的java代碼調用webview裡面的js腳本
webview中的js腳本調用本地的java代碼
java調用js并傳遞參數
js調用java并傳遞參數
功能一
android中調用webview中的js腳本非常友善,隻需要調用webview的loadurl方法即可(注意開啟js支援)
// 啟用javascript
contentwebview.getsettings().setjavascriptenabled(true);
// 從assets目錄下面的加載html
contentwebview.loadurl("file:///android_asset/wst.html");
// 無參數調用
contentwebview.loadurl("javascript:javacalljs()");
功能二
webview中js調用本地java方法,這個功能實作起來稍微有點麻煩,不過也不怎麼複雜,首先要對webview綁定javascriptinterface,js腳本通過這個接口來調用java代碼。
contentwebview.addjavascriptinterface(this, "wst");
javainterface實際就是一個普通的java類,裡面是我們本地實作的java代碼, 将object 傳遞給webview,并指定别名,這樣js腳本就可以通過我們給的這個别名來調用我們的方法,在上面的代碼中,this是執行個體化的對象,wst是這個對象在js中的别名
功能三
java代碼調用js并傳遞參數
隻需要在待用js函數的時候加入參數即可,下面是傳遞一個參數的情況,需要多個參數的時候自己拼接及行了,注意str類型在傳遞的時候參數要用單引号括起來
mwebview.loadurl("javascript:test('" + aa+ "')"); //aa是js的函數test()的參數
功能四
js調用java函數并傳參,java函數正常書寫,在js腳本中調用的時候稍加注意
然後在html頁面中,利用如下代碼,即可實作調用
<div id='b'><a onclick="window.wst.clickonandroid(2)">b.c</a></div>
這裡準備了一個執行個體,實作上面的功能
這裡是執行個體的html代碼,從assert中加載,原來做項目的時候,從assert中加載的中文網頁會出現亂碼,解決辦法就是給html指定編碼。如下
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=gb2312">
<script type="text/javascript">
function javacalljs(){
document.getelementbyid("content").innerhtml +=
"<br\>java調用了js函數";
}
function javacalljswithargs(arg){
("<br\>"+arg);
</script>
</head>
<body>
this is my html <br/>
<a onclick="window.wst.startfunction()">點選調用java代碼</a><br/>
<a onclick="window.wst.startfunction('hello world')" >點選調用java代碼并傳遞參數</a>
<br/>
<div id="content">内容顯示</div>
</body>
</html>
java代碼 如下
package wst.webview;
import android.annotation.suppresslint;
import android.app.activity;
import android.os.bundle;
import android.view.view;
import android.view.view.onclicklistener;
import android.webkit.webview;
import android.widget.button;
import android.widget.textview;
import android.widget.toast;
public class mainactivity extends activity {
private webview contentwebview = null;
private textview msgview = null;
@suppresslint("setjavascriptenabled")
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
contentwebview = (webview) findviewbyid(r.id.webview);
msgview = (textview) findviewbyid(r.id.msg);
// 啟用javascript
contentwebview.getsettings().setjavascriptenabled(true);
// 從assets目錄下面的加載html
contentwebview.loadurl("file:///android_asset/wst.html");
button button = (button) findviewbyid(r.id.button);
button.setonclicklistener(btnclicklistener);
contentwebview.addjavascriptinterface(this, "wst");
}
onclicklistener btnclicklistener = new button.onclicklistener() {
public void onclick(view v) {
// 無參數調用
contentwebview.loadurl("javascript:javacalljs()");
// 傳遞參數調用
contentwebview.loadurl("javascript:javacalljswithargs(" + "'hello world'" + ")");
}
};
public void startfunction() {
toast.maketext(this, "js調用了java函數", toast.length_short).show();
runonuithread(new runnable() {
@override
public void run() {
msgview.settext(msgview.gettext() + "\njs調用了java函數");
}
});
public void startfunction(final string str) {
toast.maketext(this, str, toast.length_short).show();
msgview.settext(msgview.gettext() + "\njs調用了java函數傳遞參數:" + str);
布局檔案
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<webview
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="9" />
<scrollview
android:id="@+id/scrollview1"
android:layout_height="wrap_content" >
<textview
android:id="@+id/msg"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="text" />
</scrollview>
<button
android:id="@+id/button"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="java調用js函數" />
</linearlayout>
希望對大家有所幫助
資源下載下傳位址
<a target="_blank" href="http://download.csdn.net/download/wangtingshuai/5106571">http://download.csdn.net/download/wangtingshuai/5106571</a>