[AS2.3.3]WebView使用学习记录1

前言

关于webview其实很简单的使用也都会,经历一段时间的使用,发现自己都没有很系统的整合一样使用。本篇和之后的续篇就是用来记录从网上和使用webview的文章。


WebView简介

webview是官方提供的一个浏览网页控件。

首先是继承于AbsoluteLayout,所以是可以在webview中直接加入新的控件的。

再是webview当时有js漏洞问题,所以4.4版本官方更新过一次webview,并且从基于WebKit的WebView改成了基于Chromium内核,这一改动大大提升了WebView组件的性能以及对HTML5,CSS3,JavaScript的支持。不过它的API却没有很大的改动,在兼容低版本的同时只引进了少部分新的API。

最后常用的WebSettingsJavaScriptInterfaceWebViewClient以及WebChromeClient组成了一个webview的全部功能。


WebView的使用

基本使用

只要在xml布局文件中加入webview控件 之后再代码中加载网址就可以实现最简单的webview使用

首先记得在清单文件xml中加入<uses-permission android:name="android.permission.INTERNET"/>

    //布局
    <WebView
        android:id="@+id/wv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </WebView>

    //基础调用
    WebView wv = (WebView) findViewById(R.id.wv);
    wv.loadUrl("http://www.baidu.com");
    wv.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });

WebView的常用方法

方法 说明
String getUrl() 获取当前页面的URL
reload() 刷新页面
boolean canGoBack() 是否可以返回
boolean canGoForward() 是否可以前进
boolean canGoBackOrForward(int steps) 判断是否可以前进或者返回,正数为前进,负数为返回
goBack() 返回一页
goForward() 前进一页
goBackOrForward(int steps) 前进或者返回多页,正数为前进,负数为返回
pageUp(boolean top) 页面滑动至顶部
pageDown(boolean bottom) 页面滑动至底部
clearCache(boolean includeDiskFiles) 清空网页访问留下的缓存数据。需要注意的时,由于缓存是全局的,所以只要是WebView用到的缓存都会被清空,即便其他地方也会使用到。该方法接受一个参数,从命名即可看出作用。若设为false,则只清空内存里的资源缓存,而不清空磁盘里的
clearHistory() 清除当前webview访问的历史记录
clearFormData() 清除自动完成填充的表单数据。需要注意的是,该方法仅仅清除当前表单域自动完成填充的表单数据,并不会清除WebView存储到本地的数据
onPause() 当页面被失去焦点被切换到后台不可见状态,需要执行onPause操作,该操作会通知内核安全地暂停所有动作,比如动画的执行或定位的获取等。需要注意的是该方法并不会暂停JavaScript的执行,若要暂停JavaScript的执行请使用接下来的这个方法
onResume() 在先前调用onPause()后,我们可以调用该方法来恢复WebView的运行
pauseTimers() 该方法面向全局整个应用程序的webview,它会暂停所有webview的layout,parsing,JavaScript Timer。当程序进入后台时,该方法的调用可以降低CPU功耗
resumeTimers() 恢复pauseTimers时的所有操作
destroy() 销毁WebView。需要注意的是:这个方法的调用应在WebView从父容器中被remove掉之后。我们可以手动地调用
getScrollY() 该方法返回的当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离
getHeight() 方法都返回当前WebView这个容器的高度。其实以上两个方法都属于View
getContentHeight() 该方法返回整个HTML页面的高度,但该高度值并不等同于当前整个页面的高度,因为WebView有缩放功能, 所以当前整个页面的高度实际上应该是原始HTML的高度再乘上缩放比例

注意点

当要销毁webview的时候,由于一些音频之类的在运行,是需要从父容器中移除webview之后在销毁的

    //销毁webview
    ((ViewGroup) wv.getParent()).removeView(wv);
     wv.removeAllViews();
     wv.destroy();

然后由3个判断距离的方法可以判断页面是否处于顶部或者底部

    if (wv.getContentHeight() * wv.getScale() == (wv.getHeight() + wv.getScrollY())) {
        //已经处于底端
    }
    if(wv.getScrollY() == 0){
        //处于顶端
    }

WebSettings的使用

基本使用

目前基本使用的方法如下

//声明WebSettings子类
WebSettings webSettings = webView.getSettings();

//开启Javascript交互
webSettings.setJavaScriptEnabled(true);  

//支持插件
webSettings.setPluginsEnabled(true); 

//设置自适应屏幕,两者合用
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小 
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

//缩放操作
webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

//其他细节操作
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //只要缓存可用就加载缓存,哪怕已经过期失效。如果缓存不可用就从网络上加载数据。 
webSettings.setAllowFileAccess(true); //设置可以访问文件 
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

//api > 21 需要开启http和https混合加载
if (Build.VERSION.SDK_INT >= 21) {
    webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}

常用方法

方法 说明
setJavaScriptEnabled(boolean flag) 设置WebView是否可以运行JavaScript
setJavaScriptCanOpenWindowsAutomatically(boolean flag) 设置WebView是否可以由JavaScript自动打开窗口,默认为false,通常与JavaScript的window.open()配合使用
setAllowFileAccess(boolean allow) 启用或禁用WebView访问文件数据
setBlockNetworkImage(boolean flag) 禁止或允许WebView从网络上加载图片。需要注意的是,如果设置是从禁止到允许的转变的话,图片数据并不会在设置改变后立刻去获取,而是在WebView调用reload()的时候才会生效。这个时候,需要确保这个app拥有访问Internet的权限,否则会抛出安全异常。通常没有禁止图片加载的需求的时候,完全不用管这个方法,因为当我们的app拥有访问Internet的权限时,这个flag的默认值就是false
setSupportZoom(boolean support) 设置是否支持缩放
setBuiltInZoomControls(boolean enabled) 显示或不显示缩放按钮(wap网页不支持)
setSupportMultipleWindows(boolean support) 设置WebView是否支持多窗口
setLayoutAlgorithm(WebSettings.LayoutAlgorithm l) 指定WebView的页面布局显示形式,调用该方法会引起页面重绘。默认值为LayoutAlgorithm#NARROW_COLUMNS
setNeedInitialFocus(boolean flag) 通知WebView是否需要设置一个节点获取焦点当WebView#requestFocus(int,android.graphics.Rect)被调用时,默认为true
setUserAgentString(String ua) 设置WebView的UserAgent值
setDefaultEncodingName(String encoding) 设置编码格式,通常都设为“UTF-8”
setAppCacheEnabled(boolean flag) 启用或禁用应用缓存
setDatabaseEnabled(boolean flag) 启用或禁用数据库缓存
setDomStorageEnabled(boolean flag) 启用或禁用DOM缓存
setAppCachePath(String appCachePath) 设置应用缓存路径,这个路径必须是可以让app写入文件的。该方法应该只被调用一次,重复调用会被无视
setCacheMode(int mode) 用来设置WebView的缓存模式。当我们加载页面或从上一个页面返回的时候,会按照设置的缓存模式去检查并使用(或不使用)缓存

缓存模式补充

LOAD_DEFAULT:默认的缓存使用模式。在进行页面前进或后退的操作时,如果缓存可用并未过期就优先加载缓存,否则从网络上加载数据。这样可以减少页面的网络请求次数。
LOAD_CACHE_ELSE_NETWORK:只要缓存可用就加载缓存,哪怕它们已经过期失效。如果缓存不可用就从网络上加载数据。
LOAD_NO_CACHE:不加载缓存,只从网络加载数据。
LOAD_CACHE_ONLY:不从网络加载数据,只从缓存加载数据。

WebViewClient的使用

基本使用

一般会实现的方法有5个

    webView.setWebViewClient(new WebViewClient(){
        //拦截到所有的网页中资源请求,比如加载JS,图片以及Ajax请求等
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            return super.shouldInterceptRequest(view, url);
        }
        //加载网页进入的方法,直接设置return为true 就可以手动修改加载网页的方式
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);
        }
        //开始加载网页,必须是加载新的网页才会触发,加载Ajax js之类的并不会触发
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }
        //结束加载网页,和onPageStarted成对存在
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
        }
        //加载出错,可以修改该类实现自定义加载错误提示
        @Override
        public void onReceivedError(WebView view, int errorCode,
                                    String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
        }
    });

常用方法

方法 说明
onLoadResource(WebView view, String url) 该方法在加载页面资源时会回调,每一个资源(比如图片)的加载都会调用一次
onPageStarted(WebView view, String url, Bitmap favicon) 该方法在WebView开始加载页面且仅在Main frame loading(即整页加载)时回调,一次Main frame的加载只会回调该方法一次。我们可以在这个方法里设定开启一个加载的动画,告诉用户程序在等待网络的响应
onPageFinished(WebView view, String url) 该方法只在WebView完成一个页面加载时调用一次(同样也只在Main frame loading时调用),我们可以可以在此时关闭加载动画,进行其他操作
onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) API23加入的新方法,当服务器返回一个HTTP ERROR并且它的status code>=400时,该方法便会回调。这个方法的作用域并不局限于Main Frame,任何资源的加载引发HTTP ERROR都会引起该方法的回调,所以我们也应该在该方法里执行尽量少的操作,只进行非常必要的错误处理等
onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) 当WebView加载某个资源引发SSL错误时会回调该方法,这时WebView要么执行handler.cancel()取消加载,要么执行handler.proceed()方法继续加载(默认为cancel)。需要注意的是,这个决定可能会被保留并在将来再次遇到SSL错误时执行同样的操作
onScaleChanged(WebView view, float oldScale, float newScale) 当WebView得页面Scale值发生改变时回调
boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) 默认值为false,重写此方法并return true可以让我们在WebView内处理按键事件
WebResourceResponse shouldInterceptRequest(WebView view, String url) 当WebView需要请求某个数据时,这个方法可以拦截该请求来告知app并且允许app本身返回一个数据来替代我们原本要加载的数据
WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) API23加入的新方法,当WebView需要请求某个数据时,这个方法可以拦截该请求来告知app并且允许app本身返回一个数据来替代我们原本要加载的数据
boolean shouldOverrideUrlLoading(WebView view, String url) WebView如果要加载一个url会向ActivityManager寻求一个适合的处理者来加载该url(比如系统自带的浏览器),这通常是我们不想看到的。于是我们需要给WebView提供一个WebViewClient,并重写该方法返回true来告知WebView url的加载就在app中进行。这时便可以实现在app内访问网页
boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) API23加入的新方法,WebView如果要加载一个url会向ActivityManager寻求一个适合的处理者来加载该url(比如系统自带的浏览器),这通常是我们不想看到的。于是我们需要给WebView提供一个WebViewClient,并重写该方法返回true来告知WebView url的加载就在app中进行。这时便可以实现在app内访问网页
onReceivedError(WebView view, int errorCode,String description, String failingUrl) 该方法在web页面加载错误时回调,这些错误通常都是由无法与服务器正常连接引起的,最常见的就是网络问题,这个方法只在与服务器无法正常连接时调用,类似于服务器返回错误码的那种错误(即HTTP ERROR),该方法是不会回调的,因为你已经和服务器正常连接上了
onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) 该方法在web页面加载错误时回调,这些错误通常都是由无法与服务器正常连接引起的,最常见的就是网络问题,这个方法只在与服务器无法正常连接时调用,类似于服务器返回错误码的那种错误(即HTTP ERROR),该方法是不会回调的,因为你已经和服务器正常连接上了,从API23开始引进,与旧方法不同的是新方法在页面局部加载发生错误时也会被调用(比如页面里两个子Tab或者一张图片)。这就意味着该方法的调用频率可能会更加频繁,所以我们应该在该方法里执行尽量少的操作

WebChromeClient的使用

基本使用

一般我们都只会监控3个webview的弹出窗口

    webView.setWebChromeClient(new WebChromeClient(){
        //javascript的警告框 只有一个确定按钮
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            return super.onJsAlert(view, url, message, result);
        }
        //javascript的确认框 拥有是和否2个按钮
        @Override
        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
            return super.onJsConfirm(view, url, message, result);
        }
        //javascript的输入框 可以输入值,有一个确认按钮,不输入直接确认等于输入为null
        @Override
        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
            return super.onJsPrompt(view, url, message, defaultValue, result);
        }
    });

常用方法

方法 说明
onProgressChanged(WebView view, int newProgress) 当页面加载的进度发生改变时回调,用来告知主程序当前页面的加载进度
onReceivedIcon(WebView view, Bitmap icon) 用来接收web页面的icon
onReceivedTitle(WebView view, String title) 用来接收web页面的title
onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) 该方法在当前页面进入全屏模式时回调,主程序必须提供一个包含当前web内容(视频 or Something)的自定义的View
onHideCustomView() 该方法在当前页面退出全屏模式时回调,主程序应在这时隐藏之前show出来的View
Bitmap getDefaultVideoPoster() 当我们的Web页面包含视频时,我们可以在HTML里为它设置一个预览图,WebView会在绘制页面时根据它的宽高为它布局。而当我们处于弱网状态下时,我们没有比较快的获取该图片,那WebView绘制页面时的gitWidth()方法就会报出空指针异常.于是app就crash了,这时我们就需要重写该方法,在我们尚未获取web页面上的video预览图时,给予它一个本地的图片,避免空指针的发生
View getVideoLoadingProgressView() 重写该方法可以在视频loading时给予一个自定义的View
boolean onJsAlert(WebView view, String url, String message, JsResult result) 处理Javascript中的Alert对话框
boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) 处理Javascript中的Prompt对话框
boolean onJsConfirm(WebView view, String url, String message, JsResult result) 处理Javascript中的Confirm对话框
boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) 该方法在用户进行了web上某个需要上传文件的操作时回调。我们应该在这里打开一个文件选择器,如果要取消这个请求我们可以调用filePathCallback.onReceiveValue(null)并返回true
onPermissionRequest(PermissionRequest request) 该方法在web页面请求某个尚未被允许或拒绝的权限时回调,主程序在此时调用grant(String [])或deny()方法。如果该方法没有被重写,则默认拒绝web页面请求的权限
onPermissionRequestCanceled(PermissionRequest request) 该方法在web权限申请权限被取消时回调,这时应该隐藏任何与之相关的UI界面

总结

本篇就先讲解到这边。下篇文章主要讲解。webview的JS交互和一些webview的优化建议!

[AS2.3.3]WebView使用学习记录2


资料

Android:这是一份全面 & 详细的Webview使用攻略
WebView·开车指南
Android WebView常见问题及解决方案汇总

猜你喜欢

转载自blog.csdn.net/g777520/article/details/79448599
今日推荐