android中webview控件和javascript交互实例
当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释:
一个能显示网页内容的view。该类是你实现一个自己的浏览器,或者只是在activity中显示网页内容的基础;它基于webkit内核来显示网页,并且包含了实现前后翻页、放大缩小,文字搜索方法。
从上面你应该了解到了基本功能,也就是显示网页。这篇文章中我们主要讨论webview和javascript的交互。如果你的js基础比java基础好的话那么采用这种方式做一些复杂的处理是个不错的选择。
webview和js的交互包含两方面,一是在html中通过js调用安卓的java代码;二是在安卓java代码中调用js。
一、html中通过js调用java代码
js中调用java代码其实就记住一点,webview设置一个和js交互的接口(注意这里只是一般的意思,并不是java中接口的含义),这个接口其实是一个一般的类,同时为这个接口取一个别名。这个过程如下:
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>
二、android调用js
上面的代码在演示如何在js中调用java代码的同时也演示了如何在java中调用js
调用形式:
其中wave()是js中的一个方法,当然你可以把这个方法改成其他的方法,也就是android调用其他的方法。
demo的解释:
现在你一定了解了android和js的交互了。是时候分析一些demo了,根据上面讲的你也应该比较清楚了。具体交互流程如下:
①点击图片,则在js端直接调用android上的方法clickonandroid();
②clickonandroid()方法(利用线程)调用js的方法。
③被②调用的js直接控制html。
个人总结:利用webview的这种方式在有些时候ui布局就可以转成相应的html代码编写了,而html布局样式之类有dw这样强大的工具,而且网上很多源码,很多代码片。在ui和视觉效果上就会节省很多时间,重复发明*没有任何意义。
推荐阅读
-
解析Android中webview和js之间的交互
-
Android中webview与JS交互、互调方法实例详解
-
android中webview控件和javascript交互实例
-
android中WebView和javascript实现数据交互实例
-
解析Android中webview和js之间的交互
-
Android中webview与JS交互、互调方法实例详解
-
Android中Java和JavaScript交互实例
-
android中webview控件和javascript交互实例
-
android中WebView和javascript实现数据交互实例
-
Android中Java和JavaScript交互实例