Android程序开发之WebView使用总结
前言:
今天修改项目中一个有关webview使用的bug,激起了我总结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
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 缓存控制
•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); }
以上所述是小编给大家介绍的android程序开发之webview使用总结,希望对大家有所帮助
推荐阅读
-
Android程序开发之WebView使用总结
-
Android程序开发之使用Design包实现QQ动画侧滑效果和滑动菜单导航
-
学习Android开发之RecyclerView使用初探
-
Android程序开发之使用PullToRefresh实现下拉刷新和上拉加载
-
Android程序开发之ListView实现横向滚动(带表头与固定列)
-
Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多
-
Android开发之WebView输入框提示解决办法
-
Android程序开发之WebView使用总结
-
Android 开发调试工具的使用总结
-
Android学习之使用SharedPreferences存储应用程序数据