您的位置:首页 > 移动开发

Android WebView属性使用详解

2016-01-29 13:41 645 查看

一、简单使用

1、直接打开浏览器使用

[java] view
plain copy







Uri uri = Uri.parse("http://baidu.com");

Intent intent = new Intent(Intent.ACTION_VIEW, uri);

startActivity(intent);

2、使用WebView打开

[java] view
plain copy







//如果页面中使用了JavaScript,不加改代码页面不显示。

webView.getSettings().setJavaScriptEnabled(true);

//加载页面时如果不加改代码,页面会跳转到系统自带浏览器显示。

webView.setWebViewClient(new WebViewClient(){

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);

return true;//返回值为true时在WebView中打开,为false时调用浏览器打开

}

});

//显示页面

webView.loadUrl(“页面地址http:”);//网络地址http://,本地地址file:///


二、常用属性

1、页面缩放

适应手机屏幕:

[java] view
plain copy







webView.getSettings().setUseWideViewPort(true);

webView.getSettings().setLoadWithOverviewMode(true);

[java] view
plain copy







<pre name="code" class="java">webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);


放大设置:



[java] view
plain copy







webView.getSettings().setDisplayZoomControls(true);

无限放大:

webView.getSettings().setSupportZoom(true);

[html] view
plain copy







webView.getSettings().setBuiltInZoomControls(true);

比例缩放:

[java] view
plain copy







webView.setInitialScale(50);

2、页面缓存

缓存构成

[html] view
plain copy







/data/data/package_name/cache/

/data/data/package_name/database/webview.db

/data/data/package_name/database/webviewCache.db

缓存模式(5种)

[html] view
plain copy







LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据

LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。

LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式

LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.

LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

如:www.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取。

www.360.com.cn的cache-control为max-age=60,在两种模式下都使用本地缓存数据。

总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。

清除缓存

[html] view
plain copy







clearCache(boolean)

CacheManager.clear高版本中需要调用隐藏API。

控制大小

无系统API支持。

可选方式:定时统计缓存大小、按时间顺序删除缓存。

优先缓存

既然这些图片已经存在手机缓存里面了,为什么Webview不能再把它显示出来呢?这里我们需要设置下:

[html] view
plain copy







WebSettings webSettings= webView.getSettings();

webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

//webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);// 默认不使用缓存!

3、前进后退

[html] view
plain copy







webView.goBack();//返回上一个浏览页

一般用于重写返回键:

[java] view
plain copy







public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {

webView.goBack();

return true;

} else {

//结束当前页

return super.onKeyDown(keyCode, event);

}

}

4、Table标签显示

[java] view
plain copy







webView.setWebChromeClient(new WebChromeClient(){

@Override

public void onReceivedTitle(WebView view, String title) {

//可以使用TextView显示title标签

super.onReceivedTitle(view, title);

}

});

5、文件下载

参考:Android
WebView详解之文件下载

demo下载

6、错误页面

在加载页面时,有时会出现网络异常、地址不存在的错误问题,而默认的错误页面比较难看,这时需要加载自己设计好的页面。

[java] view
plain copy







webView.setWebViewClient(new WebViewClient(){

public boolean shouldOverrideUrlLoading(WebView view, String url) {

view.loadUrl(url);

return true;

}

//显示错误页面

<span style="white-space:pre"> </span>@Override

public void onReceivedError(WebView view, int errorCode,

String description, String failingUrl) {

// 静态页存放在assets文件夹下

view.loadUrl("file:///android_asset/www/index.html");

super.onReceivedError(view, errorCode, description, failingUrl);

}

});

当然在加载静态页部分也可以显示一张精美的错误也图片,方法是在布局文件中增加图片控件(默认隐藏),加载静态页部分改为隐藏WebView控件显示图片控件。

7、自动登录

在已经登陆过的页面,跳过登录页。

参考:Android
WebView详解之自动登录

8、调用本地方法

在WebView页面上的按钮点击事件响应本地类中的方法。

参考:Android
WebView详解之JS调用Java方法


9、自定义协议拦截

该方法与8的功能基本相同,只是8中页面使用了JS,可能存在安全隐患(远程注入)问题。自定义协议的实现:
1)页面中增加超链接

[html] view
plain copy







<a href="file:///android_asset/www/main.html?cx">点击我</a>

2)在下面方法中增加判断链接地址尾部参数是否相等处理。

[java] view
plain copy







webView.setWebViewClient(new WebViewClient(){

public boolean shouldOverrideUrlLoading(WebView view, String url) {

if(url.endsWith("?cx")){

Toast.makeText(MainActivity.this, "点击了登录按钮!", Toast.LENGTH_SHORT).show();

return true;

}

view.loadUrl(url);

return true;

}

});

10、加载进度显示

[java] view
plain copy







/*

* 需要自己定义一个进度条控件

* 这里已经定义好了progressBar

*/

webView.setWebChromeClient(new WebChromeClient(){

@Override

public void onProgressChanged(WebView view, int newProgress) {

// TODO Auto-generated method stub

if(newProgress < 100){

//更新当前进度

progressBar.setVisibility(View.VISIBLE);

progressBar.setProgress(newProgress);

}else{

//加载完成因此进度条

progressBar.setVisibility(View.GONE);

}

super.onProgressChanged(view, newProgress);

}

});

三、属性总结

WebSettings常用方法:

[html] view
plain copy







setAllowFileAccess 启用或禁止WebView访问文件数据

setBlockNetworkImage 是否显示网络图像

setBuiltInZoomControls 设置是否支持缩放

setCacheMode 设置缓冲的模式

setDefaultFontSize 设置默认的字体大小

setDefaultTextEncodingName 设置在解码时使用的默认编码

setFixedFontFamily 设置固定使用的字体

setJavaSciptEnabled 设置是否支持Javascript

setLayoutAlgorithm 设置布局方式

setLightTouchEnabled 设置用鼠标激活被选项

setSupportZoom 设置是否支持变焦

WebViewClient常用方法:

[html] view
plain copy







doUpdate VisitedHistory 更新历史记录

onFormResubmission 应用程序重新请求网页数据

onLoadResource 加载指定地址提供的资源

onPageFinished 网页加载完毕

onPageStarted 网页开始加载

onReceivedError 报告错误信息

onScaleChanged WebView发生改变

shouldOverrideUrlLoading 控制新的连接在当前WebView中打开

WebChromeClient常用方法:

[html] view
plain copy







onCloseWindow 关闭WebView

onCreateWindow 创建WebView

onJsAlert 处理Javascript中的Alert对话框

onJsConfirm处理Javascript中的Confirm对话框

onJsPrompt处理Javascript中的Prompt对话框

onProgressChanged 加载进度条改变

onReceivedlcon 网页图标更改

onReceivedTitle 网页Title更改

onRequestFocus WebView显示焦点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: