前言:
今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结。
简介
WebView是一个基于webkit引擎、展现web页面的控件。
Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。
作用
WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。
混合开发相关博客:
使用场景:
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
webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress == 100) { //网页加载完成 } else { //网页加载中 } } });
除了上面检测进度之外还有
onCloseWindow//关闭WebView
onCreateWindow() //触发创建一个新的窗口
onJsAlert //触发弹出一个对话框
onJsPrompt //触发弹出一个提示
onJsConfirm//触发弹出确认提示
onProgressChanged //加载进度
onReceivedIcon //获取网页icon
onReceivedTitle//获取网页title
7.)设置网页栈返回
webview会默认把浏览过去的网页进行压栈存储,所以我们有时需要实现回退到上一目录
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (webView.canGoBack()) { webView.goBack();//返回上一浏览页面 return true; } else { finish();//关闭Activity } } return super.onKeyDown(keyCode, event); }
8.)WebView 缓存控制
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); }
干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
本文向大家介绍Android WebView 应用界面开发教程,包括了Android WebView 应用界面开发教程的使用技巧和注意事项,需要的朋友参考一下 WebView组件本身就是一个浏览器实现,Android5.0增强的WebView基于Chromium M37,直接支持WebRTC、WebAudio、WebGL。开发者可以直接在WebView中使用聚合(Polymer)和Material
本文向大家介绍iOS开发教程之XLForm的基本使用方法,包括了iOS开发教程之XLForm的基本使用方法的使用技巧和注意事项,需要的朋友参考一下 前言 在iOS开发中,开发"表单"界面,字段稍微多一点的一般都用UITableView来做,而XLForm就是这样一个框架,它是创建动态表格视图最牛逼的iOS库, 用它实现表单功能,非常简单,省心省力。但是很可惜,搜索了很多文章都只是翻译官方文档,很多
本文向大家介绍21天学习android开发教程之SurfaceView与多线程的混搭,包括了21天学习android开发教程之SurfaceView与多线程的混搭的使用技巧和注意事项,需要的朋友参考一下 上一篇简单介绍了SurfaceView的基本使用,这次就介绍SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用。android的多线
本文向大家介绍Android开发教程之初识Android App,包括了Android开发教程之初识Android App的使用技巧和注意事项,需要的朋友参考一下 一、认识Android操作系统 Android最早由安迪•罗宾(Andy Rubin)创办,2007年被Google公司收购,Google公司凭借Android操作系统在智能手机上取得了巨大的成功。 1、Android操作系统的特点 A
本文向大家介绍Android开发之获取LayoutInflater对象的方法总结,包括了Android开发之获取LayoutInflater对象的方法总结的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android开发之获取LayoutInflater对象的方法。分享给大家供大家参考,具体如下: 在写Android程序时,有时候会编写自定义的View,使用Inflater对象来将布局文件
本文向大家介绍Android开发之Wifi基础教程,包括了Android开发之Wifi基础教程的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android开发Wifi的基础知识。分享给大家供大家参考。具体如下: Android提供了WifiManager这个类,通过这个类可以进行wifi相关的各种操作。 通过 可获取该类的实例。 1. 获取wifi开启状态 (只要手机的wifi打开了,即