这些都是曾经收集到的一些关于webview的知识,有些工作中用到了,有些暂时还没有用到,这次统一整理下,希望对自己,对大家有所帮助。另外,欢迎大家补充(当然,有错也要指正呀,不胜感激),如果可以的话,我会 更新到本帖中。
官方文档 更多知识:)
一.权限
二.创建webview对象 webview webview = new webview(this);
三.加载网页的方式 loaddata(string data, string mimetype, string encoding)des:load the given data into the webview.as: string summary = you scored 192 points.; webview.loaddata(summary, text/html, null);
loaddatawithbaseurl(string baseurl, string data, string mimetype, string encoding, string historyurl)des:load the given data into the webview, use the provided url as the base url for the content. loadurl(string url)des:load the given url.as: webview.loadurl(http://www.jianshu.com/); //加载网络网页webview.loadurl(file:///android_asset/html/index.html); //加载本地assert目录下网页webview.loadurl(content://com.android.htmlfileprovider/sdcard/kris.html); // 加载sd卡html loadurl(string url, map extraheaders)load the given url with the extra headers. posturl(string url, byte[] postdata)des: loads the url with postdata using post method into this webview. 利用intent调用系统浏览器 uri uri = uri.parse(http://www.jianshu.com/); intent intent = new intent(intent.action_view, uri); startactivity(intent);
四.设置webview webview.clearhistory();webview.clearcache(true);webview.clearformdata();webview.setscrollbarstyle(webview.scrollbars_outside_overlay);// 隐藏滚动条webview.requestfocus();webview.requestfocusfromtouch();
五.webview辅助类 1>websettings 设置webview的一些属性、状态等,例如允许使用javascript,允许使用缓存,允许使用内置的缩放组件,设置支持is等。
官方文档 获取websettings对象:websettings mwebsettings = webview.getsettings(); for examplewebsettings mwebsettings = webview.getsettings();mwebsettings.setjavascriptenabled(true);// 支持jsmwebsettings.setjavascriptcanopenwindowsautomatically(true);//支持通过js打开新的窗口mwebsettings.setrenderpriority(websettings.renderpriority.high);//提高渲染等级mwebsettings.setbuiltinzoomcontrols(false);// 设置支持缩放mwebsettings.setdomstorageenabled(true);//使用localstorage则必须打开mwebsettings.setblocknetworkimage(true);// 首先阻塞图片,让图片不显示mwebsettings.setblocknetworkimage(false);// 页面加载好以后,在放开图片:mwebsettings.setsupportmultiplewindows(false);// 设置同一个界面mwebsettings.setblocknetworkimage(false);mwebsettings.setcachemode(1);mwebsettings.setneedinitialfocus(false);// 禁止webview上面控件获取焦点(黄色边框)
2>webviewclient 主要帮助webview处理各种通知、请求事件(例如,点击链接时候如何显示界面,页面开始加载,加载完毕之后有何动作等)
官方文档 使用webview.setwebviewclient(new webviewclient() { @override public void onpagestarted(webview view, string url, bitmap favicon) { //页面开始加载时 super.onpagestarted(view, url, favicon); } @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); // 这里进行无网络或错误处理,具体可以根据errorcode的值进行判断, } @override public boolean shouldoverrideurlloading(webview view, string url) { view.loadurl(url); /** * 网页跳转: * 1.在当前的webview跳转到新连接 * view.loadurl(url); * 2.调用系统浏览器跳转到新网页 * intent i = new intent(intent.action_view); * i.setdata(uri.parse(url)); * startactivity(i); */ return true; }});
3>webchromeclient 辅助webview处理javascript的对话框、网站图标、网站title、加载进度等
webview.setwebchromeclient(new webchromeclient() { @override public void onprogresschanged(webview view, int newprogress) { // 获得网页的加载进度 newprogress为当前加载百分比 super.onprogresschanged(view, newprogress); } @override public void onreceivedtitle(webview view, string title) { // 获取网页的title,客户端可以在这里动态修改页面的title // 另外,当加载错误时title为“找不到该网页” super.onreceivedtitle(view, title); }});
六.与js交互addjavascriptinterface 前提mwebview.getsettings().setjavascriptenabled(true);
使用
mwebview.addjavascriptinterface(new jsinterface(), jsinterface); jsinterface对象:public class jsinterface { @javascriptinterface public void methoda() { } @javascriptinterface public void methodb(string webmessage) { }}
注意:1.javascriptinterface是4.2版本google新增的一个注解,为了避免一个安全隐患,详细信息及4.2以下系统版本适配看这里: android webview的js对象注入漏洞解决方案 ;另外,safe-java-js-webview-bridge这个开源项目完全用onjsprompt() 替代了addjavascriptinterface(),有兴趣的可以学习。2.js调用java:
window.js_callback.viewpiconjavascript($('article img').index(this));
3.客户端调用js
mwebview.loadurl(javascript:alert());
七.键盘 webview是否可以返回到上一页面 webview.cangoback() webview返回到上一页面 webview.goback(); webview是否可以前进 webview.cangoforward() webview前进 webview.goforward();*public boolean onkeydown(int keycode, keyevent event) { if ((keycode == keyevent.keycode_back) && mwebview.cangoback()) { mwebview.goback(); return true; } return super.onkeydown(keycode, event);}
八.其他 webviewclient好吧,之前确实不知道有这么个东东,今天写这篇贴子的时候才发现的,看名字,应该是在fragment里对webview的封装,应该是个好东西。有兴趣的小伙伴们 点进来:webviewclient webview cookies清理cookiesyncmanager.createinstance(this);cookiesyncmanager.getinstance().startsync();cookiemanager.getinstance().removesessioncookie();
屏蔽长按事件webview.setonlongclicklistener(new view.onlongclicklistener() { @override public boolean onlongclick(view v) { return true; }});
webiew保留缩放功能但是隐藏缩放控件(这是一招必杀技)webview.getsettings().setsupportzoom(true);webview.getsettings().setbuiltinzoomcontrols(true);webview.getsettings().setdisplayzoomcontrols(false);// setdisplayzoomcontrols是在android 3.0中新增的api.,调用此方法前需要对系统版本进行判断
判断webview是否滑动到顶部或底部if (webview.getcontentheight() * webview.getscale() == (webview.getheight() + webview.getscrolly())) { // 处于底端}if(webview.getscrolly() == 0){ //处于顶部}des:getscrolly() //方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.getheight()或者getbottom() //方法都返回当前webview这个容器的高度getcontentheight()返回的是整个html的高度,但并不等同于当前整个页面的高度,因为webview有缩放功能,所以当前整个页面的高度实际上应该是原始html的高度再乘上缩放比例
================================================
更多内容请关注 我的专题 转载请注明 出处: http://www.jianshu.com/users/c1b4a5542220/latest_articles
thank you and have a nice weekend!