浅谈WebView视图显示网页

什么是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");
          第二种就是加载本地的资源://访问assets目录下得图片资源(访问本地资源),注意前缀写法:file:///android_asset        
        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);
二.了解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);
}
/**
    * 当页面开始加载时触发
    */
@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 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);
    }
    }
还有两种方法经常用到
/**
     * 监听按键按下状态
     */
    @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

组件。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值