WebView使用总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangguangchao/article/details/54020936

WebView基于webkit引擎展现web页面的控件,使用前需要在Android Manifest file中配置internet访问权限,否则提示页面无法访问。

<manifest ... >
     <uses-permission android:name="android.permission.INTERNET" />
     ...
</manifest>

WebView基本设置和使用

1、设置WebSettings类

WebSettings用来对WebView的配置进行配置和管理,比如是否可以进行文件操作、缓存的设置、页面是否支持放大和缩小、是否允许使用数据库api、字体及文字编码设置、是否允许js脚本运行、是否允许图片自动加载、是否允许数据及密码保存等等

示例代码如下:

WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
webSettings.setDomStorageEnabled(true);
webSettings.setDatabaseEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setAllowFileAccess(true);
webSettings.setSavePassword(true);
webSettings.setSupportZoom(true);
webSettings.setBuiltInZoomControls(true);
/**
* 用WebView显示图片,可使用这个参数 设置网页布局类型:
* 1、LayoutAlgorithm.NARROW_COLUMNS :适应内容大小
* 2、LayoutAlgorithm.SINGLE_COLUMN : 适应屏幕,内容将自动缩放
*/
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSettings.setUseWideViewPort(true);

mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
mWebView.setHorizontalScrollbarOverlay(true);
mWebView.setHorizontalScrollBarEnabled(true);
mWebView.requestFocus();


2、WebChromeClient子类

WebChromeClient会在一些影响浏览器ui交互动作发生时被调用,比如WebView关闭和隐藏、页面加载进展、js确认框和警告框、js加载前、js操作超时、webView获得焦点等等

mWebView.setWebChromeClient(new WebChromeClient());

例子:显示页面加载进度

在WebChromeClient子类中重写父类的onProgressChanged函数 代码如下:

webView.setWebChromeClient(new WebChromeClient() {

      public void onProgressChanged(WebView view, int progress) {
           setTitle("页面加载中,请稍候..." + progress + "%");
           setProgress(progress * 100);

           if (progress == 100) {
                 setTitle(R.string.app_name);
           }
      }
});

onProgressChanged通知应用程序当前页面加载的进度

progress表示当前页面加载的进度,为1至100的整数


3、WebViewClient子类

WebViewClient会在一些影响内容渲染的动作发生时被调用,比如表单的错误提交需要重新提交、页面开始加载及加载完成、资源加载中、接收到https认证需要处理、页面键盘响应、页面中的url打开处理等等

mWebView.setWebViewClient(new WebViewClient());


例子:当加载外部url时,需要设置当前网页的链接仍在WebView中跳转,而不是跳到手机浏览器里显示

在WebViewClient的子类中重写shouldOverrideUrlLoading函数 代码如下:

webView.setWebViewClient(new WebViewClient() {

      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
           view.loadUrl(url);
           return true;
      }
});

shouldOverrideUrlLoading表示当前webView中的一个新url需要加载时,给当前应用程序一个处理机会,如果没有重写此函数,webView请求ActivityManage选择合适的方式处理请求,就像弹出uc和互联网让用户选择浏览器一样。重写后return true表示让当前程序处理,return false表示让当前webView处理。


例子:设置开始加载网页、加载完成、加载错误时处理

在WebViewClient子类中分别重写如下父类函数 代码如下:

webView.setWebViewClient(new WebViewClient() {

      @Override
      public void onPageStarted(WebView view, String url, Bitmap favicon) {
           super.onPageStarted(view, url, favicon);
           // 开始加载网页时处理 如:显示"加载提示" 的加载对话框
           DialogManager.showLoadingDialog(this);
      }

      @Override
      public void onPageFinished(WebView view, String url) {
           super.onPageFinished(view, url);
           // 网页加载完成时处理  如:让 加载对话框 消失
           DialogManager.dismissLoadingDialog();
      }

      @Override
      public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
           super.onReceivedError(view, errorCode, description, failingUrl);
           // 加载网页失败时处理  如:
          view.loadDataWithBaseURL(null, "<span style="0color: #FF0000\&quot;;">网页加载失败</span>",
                                           "text/html", "utf-8", null);
      }
});


例子:处理https请求,为WebView处理ssl证书设置

WebView默认是不处理https请求的,页面显示空白,需要进行如下设置

在WebViewClient子类中重写父类的onReceivedSslError函数 代码如下:

webView.setWebViewClient(new WebViewClient() {

      @Override
      public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
           handler.proceed();  // 接受信任所有网站的证书
           // handler.cancel();   // 默认操作 不处理
           // handler.handleMessage(null);  // 可做其他处理
      }
});


例子:back键控制网页后退

Activity默认的back键处理为结束当前Activity,WebView查看了很多网页后,希望按back键返回上一次浏览的页面,这个时候我们就需要覆盖WebView所在Activity的onKeyDown函数,告诉他如何处理,代码如下:

public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (webView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
          webView.goBack();
          return true;
     }
     return super.onKeyDown(keyCode, event);
}

其中webView.canGoBack()在webView含有一个可后退的浏览记录时返回true
webView.goBack();表示返回至webView的上次访问页面

猜你喜欢

转载自blog.csdn.net/jiangguangchao/article/details/54020936