WebView

WebView

       目前很多android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性。
WebView的一些优点:
1、可以直接显示和渲染web页面,直接显示网页
2、webview可以直接用html文件(网络上或本地assets中)作布局
3、和JavaScript交互调用

WebView使用的步骤:
1.)添加权限
        <uses-permission android:name="android.permission.INTERNET" />  

 2.)布局文件
 <WebView
   android:id="@+id/webView"
   android:layout_width="match_parent"
   android:layout_height="match_parent" />

 3.)数据加载
 加载本地资源
        webView.loadUrl("file:///android_asset/example.html");
 加载网络资源
         webView.loadUrl("www.xxx.com/index.html");
 添加请求头信息
Map<String,String> map=new HashMap<String,String>();
map.put("User-Agent","Android");
webView.loadUrl("www.xxx.com/index.html",map);
也可以加载html片段
 String data = " Html 数据";
 webView.loadData(data, "text/html", "utf-8");
实测会发现loadData会导致中文乱码,所以一般情况使用如下代码
String data = " Html 数据";
webView.loadDataWithBaseURL(null,data, "text/html", "utf-8",null);

4.)支持JavaScript
     比如项目中js触发一个native函数关闭Activity
    设置支持JavaScript
 WebSettings webSettings = webView.getSettings();
 webSettings.setJavaScriptEnabled(true);//设置支持javascript
 webView.addJavascriptInterface(new JavaScriptInterface(), "xueleapp");
 JavaScriptInterface 接口定义
    public class JavaScriptInterface {
        @android.webkit.JavascriptInterface
        public void doTrainFinish() {
           finish();
        }
    }

5.)设置WebViewClient 主要辅助WebView处理各种通知、请求事件
比如要实现WebView中链接在WebView内部跳转 
    webView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

除此之外WebViewClient更多的处理网页的地址的解析和渲染,例如
      onLoadResource//加载资源时响应
  onPageStart//在加载页面时响应
  onPageFinish//在加载页面结束时响应
  onReceiveError//在加载出错时响应
  onReceivedHttpAuthRequest//获取返回信息授权请求

  6.)设置WebChromeClient主要辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
   比如加载进度获取title
   
   
  1. webView.setWebChromeClient(new WebChromeClient() {
  2.             @Override
  3.             public void onProgressChanged(WebView view, int newProgress) {
  4.                 if (newProgress == 100) {
  5.                     //网页加载完成
  6.                 } else {
  7.                     //网页加载中
  8.                 }
  9.             }
  10.         });

除了上面检测进度之外还有
  onCloseWindow//关闭WebView
  onCreateWindow() //触发创建一个新的窗口
  onJsAlert //触发弹出一个对话框
  onJsPrompt //触发弹出一个提示
  onJsConfirm//触发弹出确认提示
  onProgressChanged //加载进度
  onReceivedIcon //获取网页icon
   onReceivedTitle//获取网页title

 7.)设置网页栈返回
    webview会默认把浏览过去的网页进行压栈存储,所以我们有时需要实现回退到上一目录
   
   
  1. @Override
  2.     public boolean onKeyDown(int keyCode, KeyEvent event) {
  3.         if (keyCode == KeyEvent.KEYCODE_BACK) {
  4.             if (webView.canGoBack()) {
  5.                 webView.goBack();//返回上一浏览页面
  6.                 return true;
  7.             } else {
  8.                 finish();//关闭Activity
  9.             }
  10.         }
  11.         return super.onKeyDown(keyCode, event);
  12.     }

8.)WebView 缓存控制
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据。
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
WebSettings webSettings = webView.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  

9.)WebView屏幕自适应
 WebSettings webSettings = webView.getSettings();
 webSettings.setUseWideViewPort(true);
 webSettings.setLoadWithOverviewMode(true);

 10.)其他不常用设置
  WebSettings webSettings = webView.getSettings();
  webSettings.setSupportZoom(true);  //支持缩放
  webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
  webSettings.supportMultipleWindows();  //多窗口
  webSettings.setAllowFileAccess(true);  //设置可以访问文件
  webSettings.setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点
  webSettings.setBuiltInZoomControls(true); //设置支持缩放
  webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
  webSettings.setLoadsImagesAutomatically(true);  //支持自动加载图片

11.)知识扩展WebViewJSBridge
       虽然谷歌也提供了js与native函数互相调用的方式,但是通过addjavascriptInterface这种方式在Android 4.2以下版本存在一定的安全隐患,在Android 4.2以上也需要加@JavascriptInterface注解,否则无法调用。基于上面的原因建议学习一下 WebViewJSBridge这个比较不错的开源框架,地址:https://github.com/firewolf-ljw/WebViewJSBridge

12.)硬件加速
      开启硬件加速强制使用GPU渲染,确实给app流畅度带来不小的提升,但是在使用过程中遇见webview闪烁,也有导致加载webView黑屏或者白屏
解决办法:关闭硬件加速
 webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
 这是把webview 中的硬件加速关闭。设置LAYER_TYPE_SOFTWARE后会把当前view转为bitmap保存。这样就不能开多个webview,否则会报out of memory。
需要在在webview中加入如下代码
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        invalidate();
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

13.)WebView 一些相关属性用法:
setPluginsEnabled(true) ;//支持插件
setUserWideViewPort(false) ;//将图片调整到适合webview的大小
setSupportZoom(true) ;//支持缩放
setLayoutAlgorithm(LayoutAlgrithm.SINGLE_COLUMN) ;//支持内容从新布局
supportMultipleWindows() ;//多窗口
setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK) ;//关闭webview中缓存
setAllowFileAccess(true) ;//设置可以访问文件
setNeedInitialFocus(true) ;//当webview调用requestFocus时为webview设置节点
setjavaScriptCanOpenWindowsAutomatically(true) ;//支持通过JS打开新窗口
setLoadsImagesAutomatically(true) ;//支持自动加载图片
setBuiltInZoomControls(true);
//支持缩放
webView.setInitialScale(35);
//设置缩放比例
webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
//设置滚动条隐藏 
webView.getSettings().setGeolocationEnabled(true);
//启用地理定位
webView.getSettings().setRenderPriority(RenderPriority.HIGH);
//设置渲染优先级
String dir = "/sdcard/temp";//设置定位的数据库路径 
webView.getSettings().setGeolocationDatabasePath(dir);
这里是使用webview以及webview的相关设置,课根据实际情况进行设置.
WebViewClient的方法全解
doUpdateVisitedHistory(WebView view, String url ,boolean isReload)
更新历史记录
onFormResubmission(WebView view, Message dontResend, Message resend)
应用程序重新请求页面数据
onLoadResource(WebView view, String url)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值