在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件.
使用
1代码或xml创建webview对象
2调用WebView的loadUrl()方法,加载WevView要显示的网页
互联网用:webView.loadUrl(“http://www.google.com“);
本地文件用:webView.loadUrl(“file:///android_asset/XX.html”); 本地文件存放在:assets 文件中
3调用Activity的setContentView( )
参考代码
public class MiniBrowser extends Activity {
WebView show;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取页面WebView组件
show = (WebView) findViewById(R.id.show);
//加载需要显示的网页
show.loadUrl("http://www.51cto.com/");
//设置Web视图,webview里点击链接时默认使用浏览器打开的
//如果希望点击链接继续在当前中响应,而不是浏览器响应该链接,必须覆盖webview的WebViewClient对象
show.setWebViewClient(new HelloWebViewClient());
}
@Override
//设置回退
//用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && show.canGoBack()) {
show.goBack(); //goBack()表示返回WebView的上一页面
return true;
}
return false;
}
//Web视图,WebViewClient就是帮助WebView处理各种通知、请求事件的
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);//WebView加载网页
return true;
}
}
}
WebView在开发总结
1.AndroidManifest.xml中必须使用许可”android.permission.INTERNET”,否则会出Webpage not available错误。
2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。
WebSettings webSetting = webview.getSettings();
webSetting.setJavaScriptEnabled(true);
3.如果页面中链接,如果希望点击链接继续在当前中响应,而不是浏览器响应该链接,必须覆盖webview的WebViewClient对象。
mWebView.setWebViewClient(new WebViewClient(){
publicboolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
returntrue;
}
});
4.如果不做任何处理,浏览网页,点击系统“Back”键,会调用finish()而结束自身,如果希望浏览的网页回退而不是退出,需要在当前Activity中 重写onKeyDown。
publicboolean onKeyDown(int keyCode, KeyEventevent) {
if((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode,event);
}
5如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。
webview.requestFocusFromTouch();
6.WebView 加载界面主要调用三个方法:LoadUrl、LoadData、LoadDataWithBaseURL.
1、LoadUrl 直接加载网页、图片并显示.(本地或是网络上的网页、图片、gif)
2、LoadData 显示文字与图片内容(模拟器1.5、1.6)
3、LoadDataWithBase 显示文字与图片内容(支持多个模拟器版本)
7 WebView默认没有开启文件下载的功能,如果要实现文件下载的功能,需要设置WebView的DownloadListener,通过实现自己的DownloadListener来实现文件的下载。具体操作如下:
1、设置WebView的DownloadListe
webView.setDownloadListener(new MyWebViewDownLoadListener());
2、实现MyWebViewDownLoadListener这个类:
private class MyWebViewDownLoadListener implements DownloadListener {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,
long contentLength) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
这只是调用系统中已经内置的浏览器进行下载,还没有WebView本身进行的文件下载。
8WebSettings的常用方法介绍
setJavaScriptEnabled(true); //支持js脚步
setPluginsEnabled(true);//支持插件
setUseWideViewPort(false);//将图片调整到适合webview的大小
setSupportZoom(true); //支持缩放
setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);//支持内容从新布局
supportMultipleWindows(); //多窗口
setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//关闭webview中缓存
setAllowFileAccess(true); //设置可以访问文件
setNeedInitialFocus(true);//当webview调用requestFocus时为webview设置节点
webSettings.setBuiltInZoomControls(true);//设置支持缩放
setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
setLoadsImagesAutomatically(true);//支持自动加载图片
WebViewClient的方法全解
doUpdateVisitedHistory(WebViewview,Stringurl, boolean isReload)(更新历史记录)
onFormResubmission(WebViewview,MessagedontResend,Messageresend) (应用程序重新请求网页数据)
onLoadResource(WebViewview,Stringurl) 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
onPageStarted(WebViewview,Stringurl,Bitmapfavicon)这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
onPageFinished(WebViewview,Stringurl)在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。
onReceivedError(WebViewview, int errorCode, Stringdescription,StringfailingUrl)(报告错误信息)
onReceivedHttpAuthRequest(WebViewview,HttpAuthHandlerhandler,Stringhost,Stringrealm)(获取返回信息授权请求)
onReceivedSslError(WebViewview,SslErrorHandlerhandler,SslErrorerror)重写此方法可以让webview处理https请求。
onScaleChanged(WebViewview, float oldScale, float newScale)(WebView发生改变时调用)
onUnhandledKeyEvent(WebViewview,KeyEventevent)(Key事件未被加载时调用)
shouldOverrideKeyEvent(WebViewview,KeyEventevent)重写此方法才能够处理在浏览器中的按键事件。
shouldOverrideUrlLoading(WebViewview,Stringurl)在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做 很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
webview与js交互
webview能做什么?
①webView可以利用html做界面布局,虽然目前还比较少人这么使用,不过我相信当一些客户端需要复杂的图文(图文都是动态生成)混排的时候它肯定是个不错的选择。
②直接显示网页,这功能当然也是它最基本的功能。
③和js交互。(如果你的js基础比java基础好的话那么采用这种方式做一些复杂的处理是个不错的选择)。
android与js的调用需要启用启用javascript调用
contentWebView = (WebView) findViewById(R.id.webview);
//启用javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
Java调用js
Java代码调用js并传参其实是通过WebView的loadUrl方法去调用的、只是参数url的写法不一样而已
// 无参数调用
contentWebView.loadUrl("javascript:javacalljs()");
// 传递参数调用
contentWebView.loadUrl("javascript:javacalljswithargs("
+ "´hello world´" + ")");
javacalljs()和javacalljswithargs()就是javascript中的方法
js调用Java
将对象暴露给javascript脚本
contentWebView.addJavascriptInterface(this, "name");
这样在xxx.html中javascript可以通过js对象名来调用该对象的方法
注:addJavascriptInterface(object,”name”);//把Name=”name”的对象添加到object中。object如果是this,就是window.name
在网页中、只需要像调用js方法一样、进行调用就可以
<a onClick="window.name.jsFunction(´hello world´)" >
点击调用java代码并传递参数
</a>
注
android 4.2 之后版本提供给js调用的函数必须带有注释语句@JavascriptInterface ,4.2版本之前向webview注入的对象所暴露的接口不是必须带有@JavascriptInterface注释语句
(需要注意,android adt,eclipse生成的工程,低版本中会自动带有 anotations.jar,支持@JavascriptInterface, 而高版本中工程中,不会自动带有anotations.jar包,所以要加入注释语句@JavascriptInterface,首先要自己手动加入anotations.jar包,不要忘记import 哦!本人就犯过这么低级的错误哦)
(这里的限制是通过 targetSdkVersion 为标准,即如果工程采用了android sdk的版本是4.2以上,但是 targetSdkVersion 的版本在17之下,那么该状态下生成的应用,不过报错,如果targetSdkVersion 设置为>=17 就需要特别主意,要加上 @JavascriptInterface注释语句了, 所有建议在各种版本下都采用@JavascriptInterface注释,就万无一失了)
js Java 双向调用
Java和js交互注意事项
1、Java 调用 js 里面的函数、效率并不是很高、估计要200ms左右吧、做交互性很强的事情、这种速度很难让人接受、而js去调Java的方法、速度很快、50ms左右、所以尽量用js调用Java方法
2、Java 调用 js 的函数、没有返回值、调用了就控制不到了
3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString() 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间
4、网页中尽量不要使用jQuery、执行起来需要5-6秒、最好使用原生的js写业务脚本、以提升加载速度、改善用户体验