什么是WebView?
定义:
WebView是Android提供的一个组件,这个组件本身其实就是一个浏览器的实现,它的内核基于开发WebKit引擎。它使用了WebKit渲染引擎加载显示网页。
WebView加载资源有3种方法:WebView加载网页的三种方式:loadUrl() , loadData(), LoadDataWithBaseURL()
首先在xml中注册WebViewd 组件,然后在自己的AndroidManifest.xml中添加权限<uses-permission android:name="android.permission.INTERNET"/>否则会出现Web page not available错误.
然后第一种://WebView加载互联网网页,loadUrl方式,需传入完整的url
// mWebView.loadUrl("http://www.baidu.com");
// mWebView.loadUrl("http://www.baidu.com");
第二种就是加载本地的资源://访问assets目录下得图片资源(访问本地资源),注意前缀写法:file:///android_asset
mWebView.loadUrl("file:///android_asset/images/pic10.jpg");
mWebView.loadUrl("file:///android_asset/html/index.html");
mWebView.loadUrl("file:///android_asset/images/pic10.jpg");
mWebView.loadUrl("file:///android_asset/html/index.html");
不过第二种加载的时候可能会产生乱码的情况,那么就会使用第三种方式利用loadDataWithBaseURL方法,(mWebView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl))
里面参数的具体含义
1.data:就是指定的需要加载的HTML代码;
2.mineType:指定HTML代码的MIME类型,对于HTML代码可指定为text/html。
3.encoding:指定HTML代码编码所用的字符集。比如指定为GBK。
第三种方式
/* String contentStr = "<a href=http://www.baidu.com>百度</a>";
StringBuilder builder = new StringBuilder();
builder.append("<html><head><title>loadData加载网页</title></head>").append("<body>")
.append(contentStr).append("</body></html>");*/
// mWebView.loadData(builder.toString(), "text/html", "utf-8");
//loadDataWithBaseURL()可以解决乱码
// mWebView.loadDataWithBaseURL(null, builder.toString(), "text/html", "utf-8", null);
StringBuilder builder = new StringBuilder();
builder.append("<html><head><title>loadData加载网页</title></head>").append("<body>")
.append(contentStr).append("</body></html>");*/
// mWebView.loadData(builder.toString(), "text/html", "utf-8");
//loadDataWithBaseURL()可以解决乱码
// mWebView.loadDataWithBaseURL(null, builder.toString(), "text/html", "utf-8", null);
二.了解WebView中的三个辅助类WebSettings, WebViewClient, WebChromClient相对于WebView的功能
1.WebSettings:设置WebView的一些属性,状态等。例如允许使用js,缓存,允许使用内置的缩放组件
在创建WebView时,系统有一个默认的设置,我们可以通过WebView.getSettings来得到这个设置:
WebSettings webSettings=mWebView.getSettings();
当WebView被结束后,如果再使用WebSettings则会抛出IllegalStateException异常。
下面是设置WebSettings一些常用属性、状态的方法:
setAllowFileAccess 启用或禁止WebView访问文件数据
setBlockNetworkImage 是否显示网络图像
setBuiltInZoomControls 设置是否支持缩放
setCacheMode 设置缓存的模式
setDefaultFontSize 设置默认的字体大小
setJavaScriptEnabled 设置是否支持Javascript 默认为false
2.WebViewClinet;
主要就是帮助WebView处理各种通知,请求事件(例如点击链接的时候如何显示界面,页面开始加载,加载完毕后有何动作等)
如果希望点击超链接由自己处理,而不是新开WebView进程中响应该链接。给WebView添加一个事件监听对象(WebViewClient)
并重写其中的一些方法
怎么实现的呢?看下面代码
class MyWebViewClient extends WebViewClient{
/**
* 控制超链接是否再当前WebView中加载(WebViewClient中最重要的方法)
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
return super.shouldOverrideUrlLoading(view, url);
}
* 控制超链接是否再当前WebView中加载(WebViewClient中最重要的方法)
*/
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
return super.shouldOverrideUrlLoading(view, url);
}
/**
* 当页面开始加载时触发
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
}
* 当页面开始加载时触发
*/
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
}
/**
* 当页面加载完成时触发
*/
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
}
* 当页面加载完成时触发
*/
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
}
/**
* 当加载页面出错时触发
*/
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// TODO Auto-generated method stub
super.onReceivedError(view, errorCode, description, failingUrl);
}
}
* 当加载页面出错时触发
*/
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// TODO Auto-generated method stub
super.onReceivedError(view, errorCode, description, failingUrl);
}
}
里面重写了4个方法其中最重要的是shouldOvrrideUrlLoading()方法表示控制超链接是否在当前的WebView中打开,返回false表示当前的WebView会处理此超链接,返回true则表示宿主应用程序处理此链接,API:
Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView.
补充
:对”Back”按键的处理:如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个webView进程会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需 要在当前Activity中处理并消费掉该Back事件。
覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
webview.goBack(); //goBack()表示返回webView的上一页面
3.WebChromeClient
就是辅助WebView处理javescript的对话框,网站图标,加载进度,网站title等
代码如下
class MyWebChromeClient extends WebChromeClient{
//处理js警告对话框,注意返回值,true表示在此拦截
@Override
public boolean onJsAlert(WebView view, String url, String message,
final JsResult result) {
Builder builder = new Builder(mContext);
builder.setTitle("js 警告对话框")
.setMessage(message)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
//处理js确认对话框
@Override
public boolean onJsConfirm(WebView view, String url, String message,
JsResult result) {
// TODO Auto-generated method stub
return super.onJsConfirm(view, url, message, result);
}
//处理js输入对话框
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
// TODO Auto-generated method stub
return super.onJsPrompt(view, url, message, defaultValue, result);
}
//网页加载进度改变时触发
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
}
//修改网页图标
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
// TODO Auto-generated method stub
super.onReceivedIcon(view, icon);
}
//修改网页标题
@Override
public void onReceivedTitle(WebView view, String title) {
// TODO Auto-generated method stub
super.onReceivedTitle(view, title);
}
@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {
// TODO Auto-generated method stub
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
@Override
public void onCloseWindow(WebView window) {
// TODO Auto-generated method stub
super.onCloseWindow(window);
}
}
还有两种方法经常用到
//处理js警告对话框,注意返回值,true表示在此拦截
@Override
public boolean onJsAlert(WebView view, String url, String message,
final JsResult result) {
Builder builder = new Builder(mContext);
builder.setTitle("js 警告对话框")
.setMessage(message)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
result.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
//处理js确认对话框
@Override
public boolean onJsConfirm(WebView view, String url, String message,
JsResult result) {
// TODO Auto-generated method stub
return super.onJsConfirm(view, url, message, result);
}
//处理js输入对话框
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
// TODO Auto-generated method stub
return super.onJsPrompt(view, url, message, defaultValue, result);
}
//网页加载进度改变时触发
@Override
public void onProgressChanged(WebView view, int newProgress) {
// TODO Auto-generated method stub
super.onProgressChanged(view, newProgress);
}
//修改网页图标
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
// TODO Auto-generated method stub
super.onReceivedIcon(view, icon);
}
//修改网页标题
@Override
public void onReceivedTitle(WebView view, String title) {
// TODO Auto-generated method stub
super.onReceivedTitle(view, title);
}
@Override
public boolean onCreateWindow(WebView view, boolean isDialog,
boolean isUserGesture, Message resultMsg) {
// TODO Auto-generated method stub
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
@Override
public void onCloseWindow(WebView window) {
// TODO Auto-generated method stub
super.onCloseWindow(window);
}
}
/**
* 监听按键按下状态
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d(TAG, "onKeyDown keyCode: " + keyCode);
return super.onKeyDown(keyCode, event);
}
/**
* 监听按键弹起状态
* 注意按键事件返回值,true表示在此拦截,不再向下传递
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Log.d(TAG, "onKeyUp keyCode: " + keyCode);
if(keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()){
mWebView.goBack();
return true;
}
return super.onKeyUp(keyCode, event);
}
* 监听按键按下状态
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d(TAG, "onKeyDown keyCode: " + keyCode);
return super.onKeyDown(keyCode, event);
}
/**
* 监听按键弹起状态
* 注意按键事件返回值,true表示在此拦截,不再向下传递
*/
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Log.d(TAG, "onKeyUp keyCode: " + keyCode);
if(keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()){
mWebView.goBack();
return true;
}
return super.onKeyUp(keyCode, event);
}
可能会产生的异常:
在自己的AndroidManifest.xml中添加权限<uses-permission android:name="android.permission.INTERNET"/>否则会出现Web page not available错误
当WebView被结束后,如果再使用WebSettings则会抛出IllegalStateException异常。
在
Android
手机中内置了一款高性能
webkit
内核浏览器,
在
SDK
中封装为一个叫做
WebView
组件。
在
Android
手机中内置了一款高性能
webkit
内核浏览器,
在
SDK
中封装为一个叫做
WebView
组件。
在
Android
手机中内置了一款高性能
webkit
内核浏览器,
在
SDK
中封装为一个叫做
WebView
组件。
在
Android
手机中内置了一款高性能
webkit
内核浏览器,
在
SDK
中封装为一个叫做
WebView
组件。
在
Android
手机中内置了一款高性能
webkit
内核浏览器,
在
SDK
中封装为一个叫做
WebView
组件。