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

浅谈WebView视图显示网页

2014-04-15 20:02 267 查看
什么是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
组件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  webview 浏览器