您好,欢迎访问一九零五行业门户网

史上最全WebView使用,附送Html5Activity一份_html/css_WEB-ITnose

如果本文帮助到你,本人不胜荣幸,如果浪费了你的时间,本人深感抱歉。
希望用最简单的大白话来帮助那些像我一样的人。如果有什么错误,请一定指出,以免误导大家、也误导我。
本文来自: http://www.jianshu.com/users/320f9e8f7fc9/latest_articles
感谢您的关注。
webview在现在的项目中使用的频率应该还是非常高的。
我个人总觉得html5是一种趋势。找了一些东西,在此总结。
本篇最后有一个非常不错 的 html5activity 加载类,不想看的可以直接跳下载。
websettings websettings websettings = mwebview .getsettings();//支持获取手势焦点,输入用户名、密码或其他webview.requestfocusfromtouch();setjavascriptenabled(true); //支持jssetpluginsenabled(true); //支持插件 设置自适应屏幕,两者合用setusewideviewport(true); //将图片调整到适合webview的大小 setloadwithoverviewmode(true); // 缩放至屏幕的大小setsupportzoom(true); //支持缩放,默认为true。是下面那个的前提。setbuiltinzoomcontrols(true); //设置内置的缩放控件。 若上面是false,则该webview不可缩放,这个不管设置什么都不能缩放。setdisplayzoomcontrols(false); //隐藏原生的缩放控件setlayoutalgorithm(layoutalgorithm.single_column); //支持内容重新布局 supportmultiplewindows(); //多窗口 setcachemode(websettings.load_cache_else_network); //关闭webview中缓存 setallowfileaccess(true); //设置可以访问文件 setneedinitialfocus(true); //当webview调用requestfocus时为webview设置节点setjavascriptcanopenwindowsautomatically(true); //支持通过js打开新窗口 setloadsimagesautomatically(true); //支持自动加载图片setdefaulttextencodingname(utf-8);//设置编码格式
加载方式 加载一个网页:
webview.loadurl( http://www.google.com/);
加载apk包中的一个html页面
webview.loadurl(file:///android_asset/test.html);
加载手机本地的一个html页面的方法:
webview.loadurl(content://com.android.htmlfileprovider/sdcard/test.html);
webviewclient webviewclient就是帮助webview处理各种通知、请求事件的。
打开网页时不调用系统浏览器, 而是在本webview中显示:
mwebview.setwebviewclient(new webviewclient(){ @override public boolean shouldoverrideurlloading(webview view, string url) { view.loadurl(url); return true; } });
webviewclient 方法
webviewclient mwebviewclient = new webviewclient() { shouldoverrideurlloading(webview view, string url) 最常用的,比如上面的。 //在网页上的所有加载都经过这个方法,这个函数我们可以做很多操作。 //比如获取url,查看url.contains(“add”),进行添加操作 shouldoverridekeyevent(webview view, keyevent event) //重写此方法才能够处理在浏览器中的按键事件。 onpagestarted(webview view, string url, bitmap favicon) //这个事件就是开始载入页面调用的,我们可以设定一个loading的页面,告诉用户程序在等待网络响应。 onpagefinished(webview view, string url) //在页面加载结束时调用。同样道理,我们可以关闭loading 条,切换程序动作。 onloadresource(webview view, string url) // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。 onreceivederror(webview view, int errorcode, string description, string failingurl) // (报告错误信息) doupdatevisitedhistory(webview view, string url, boolean isreload) //(更新历史记录) onformresubmission(webview view, message dontresend, message resend) //(应用程序重新请求网页数据) onreceivedhttpauthrequest(webview view, httpauthhandler handler, string host,string realm) //(获取返回信息授权请求) onreceivedsslerror(webview view, sslerrorhandler handler, sslerror error) //重写此方法可以让webview处理https请求。 onscalechanged(webview view, float oldscale, float newscale) // (webview发生改变时调用) onunhandledkeyevent(webview view, keyevent event) //(key事件未被加载时调用) }
将上面定义的webviewclient设置给webview: webview.setwebviewclient(webviewclient);
webchromeclient webchromeclient是辅助webview处理javascript的对话框,网站图标,网站title,加载进度等 :
方法中的代码都是由android端自己处理。
webchromeclient mwebchromeclient = new webchromeclient() { //获得网页的加载进度,显示在右上角的textview控件中 @override public void onprogresschanged(webview view, int newprogress) { if (newprogress < 100) { string progress = newprogress + %; } else { } } //获取web页中的title用来设置自己界面中的title //当加载出错的时候,比如无网络,这时onreceivetitle中获取的标题为 找不到该网页, //因此建议当触发onreceiveerror时,不要使用获取到的title @override public void onreceivedtitle(webview view, string title) { mainactivity.this.settitle(title); } @override public void onreceivedicon(webview view, bitmap icon) { // } @override public boolean oncreatewindow(webview view, boolean isdialog, boolean isusergesture, message resultmsg) { // return true; } @override public void onclosewindow(webview window) { } //处理alert弹出框,html 弹框的一种方式 @override public boolean onjsalert(webview view, string url, string message, jsresult result) { // return true; } //处理confirm弹出框 @override public boolean onjsprompt(webview view, string url, string message, string defaultvalue, jspromptresult result) { // return true; } //处理prompt弹出框 @override public boolean onjsconfirm(webview view, string url, string message, jsresult result) { // return true; }};
同样,将上面定义的webchromeclient设置给webview: webview.setwebchromeclient(mwebchromeclient);
调用js代码 websettings websettings = mwebview .getsettings(); websettings.setjavascriptenabled(true); mwebview.addjavascriptinterface(gethtmlobject(), jsobj);
上面这是前提!!!
然后实现上面的方法。
private object gethtmlobject(){ object insertobj = new object(){ //给html提供的方法,js中可以通过:var str = window.jsobj.htmlcalljava(); 获取到 public string htmlcalljava(){ return html call java; } //给html提供的有参函数 : window.jsobj.htmlcalljava2(it-homer blog); public string htmlcalljava2(final string param){ return html call java : + param; } //html给我们提供的函数 public void javacallhtml(){ runonuithread(new runnable() { @override public void run() { //这里是调用方法 mwebview.loadurl(javascript: showfromhtml()); toast.maketext(jsandroidactivity.this, clickbtn, toast.length_short).show(); } }); } //html给我们提供的有参函数 public void javacallhtml2(final string param){ runonuithread(new runnable() { @override public void run() { mwebview.loadurl(javascript: showfromhtml2('it-homer blog')); toast.maketext(jsandroidactivity.this, clickbtn2, toast.length_short).show(); } }); } }; return insertobj;}
android 调用js有个漏洞:
http://blog.csdn.net/leehong2005/article/details/11808557
webview的方法 前进、后退 goback () //后退goforward ()//前进gobackorforward (int steps) //以当前的index为起始点前进或者后退到历史记录中指定的steps, 如果steps为负数则为后退,正数则为前进cangoforward () //是否可以前进cangoback () //是否可以后退
清除缓存数据: clearcache(true); //清除网页访问留下的缓存,由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.clearhistory () //清除当前webview访问的历史记录,只会webview访问历史记录里的所有记录除了当前访问记录.clearformdata () //这个api仅仅清除自动完成填充的表单数据,并不会清除webview存储到本地的数据。
webview的状态: onresume () //激活webview为活跃状态,能正常执行网页的响应onpause () //当页面被失去焦点被切换到后台不可见状态,需要执行onpause动过, onpause动作通知内核暂停所有的动作,比如dom的解析、plugin的执行、javascript执行。pausetimers () //当应用程序被切换到后台我们使用了webview, 这个方法不仅仅针对当前的webview而是全局的全应用程序的webview,它会暂停所有webview的layout,parsing,javascripttimer。降低cpu功耗。resumetimers () //恢复pausetimers时的动作。destroy () //销毁,关闭了activity时,音乐或视频,还在播放。就必须销毁。
但是注意:webview调用destory时,webview仍绑定在activity上.这是由于自定义webview构建时传入了该activity的context对象,因此需要先从父容器中移除webview,然后再销毁webview:
rootlayout.removeview(webview); webview.destroy();
判断webview是否已经滚动到页面底端 或者 顶端:
getscrolly() //方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.
getheight()或者getbottom() //方法都返回当前webview 这个容器的高度
getcontentheight() 返回的是整个html 的高度,但并不等同于当前整个页面的高度,因为webview 有缩放功能, 所以当前整个页面的高度实际上应该是原始html 的高度再乘上缩放比例. 因此,更正后的结果,准确的判断方法应该是:
if (webview.getcontentheight() * webview.getscale() == (webview.getheight() + webview.getscrolly())) { //已经处于底端 } if(webview.getscrolly() == 0){ //处于顶端 }
返回键 返回上一次浏览的页面
public boolean onkeydown(int keycode, keyevent event) { if ((keycode == keyevent.keycode_back) && mwebview.cangoback()) { mwebview.goback(); return true; } return super.onkeydown(keycode, event); }
有一个非常不错的 html5activity 加载类帖出来:
package com.lyl.web;import android.graphics.bitmap;import android.os.bundle;import android.os.message;import android.support.v7.app.appcompatactivity;import android.util.log;import android.view.keyevent;import android.webkit.geolocationpermissions;import android.webkit.webchromeclient;import android.webkit.websettings;import android.webkit.webview;import android.webkit.webviewclient;import com.lyl.test.r;public class html5activity extends appcompatactivity { private string murl; private webview mwebview; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_web); bundle bundle = getintent().getbundleextra(bundle); murl = bundle.getstring(url); log.d(url:, murl); mwebview = (webview) findviewbyid(r.id.web); websettings mwebsettings = mwebview.getsettings(); mwebsettings.setsupportzoom(true); mwebsettings.setloadwithoverviewmode(true); mwebsettings.setusewideviewport(true); mwebsettings.setdefaulttextencodingname(utf-8); mwebsettings.setloadsimagesautomatically(true); //调用js方法.安卓版本大于17,加上注解 @javascriptinterface mwebsettings.setjavascriptenabled(true); savedata(mwebsettings); newwin(mwebsettings); mwebview.setwebchromeclient(webchromeclient); mwebview.setwebviewclient(webviewclient); mwebview.loadurl(murl); } /** * 多窗口的问题 */ private void newwin(websettings mwebsettings) { //html中的_bank标签就是新建窗口打开,有时会打不开,需要加以下 //然后 复写 webchromeclient的oncreatewindow方法 mwebsettings.setsupportmultiplewindows(true); mwebsettings.setjavascriptcanopenwindowsautomatically(true); } /** * html5数据存储 */ private void savedata(websettings mwebsettings) { //有时候网页需要自己保存一些关键数据,android webview 需要自己设置 mwebsettings.setdomstorageenabled(true); mwebsettings.setdatabaseenabled(true); mwebsettings.setappcacheenabled(true); string appcachepath = getapplicationcontext().getcachedir().getabsolutepath(); mwebsettings.setappcachepath(appcachepath); } webviewclient webviewclient = new webviewclient(){ /** * 多页面在同一个webview中打开,就是不新建activity或者调用系统浏览器打开 */ @override public boolean shouldoverrideurlloading(webview view, string url) { view.loadurl(url); return true; } }; webchromeclient webchromeclient = new webchromeclient() { //=========html5定位========================================================== //需要先加入权限 // // // @override public void onreceivedicon(webview view, bitmap icon) { super.onreceivedicon(view, icon); } @override public void ongeolocationpermissionshideprompt() { super.ongeolocationpermissionshideprompt(); } @override public void ongeolocationpermissionsshowprompt(final string origin, final geolocationpermissions.callback callback) { callback.invoke(origin, true, false);//注意个函数,第二个参数就是是否同意定位权限,第三个是是否希望内核记住 super.ongeolocationpermissionsshowprompt(origin, callback); } //=========html5定位========================================================== //=========多窗口的问题========================================================== @override public boolean oncreatewindow(webview view, boolean isdialog, boolean isusergesture, message resultmsg) { webview.webviewtransport transport = (webview.webviewtransport) resultmsg.obj; transport.setwebview(mwebview); resultmsg.sendtotarget(); return true; } //=========多窗口的问题========================================================== }; @override public boolean onkeydown(int keycode, keyevent event) { if (keycode == keyevent.keycode_back && mwebview.cangoback()) { mwebview.goback(); return true; } return super.onkeydown(keycode, event); }}
原谅我,忘了出自哪里,如果侵权请联系我,一定删除。
这是下载地址: http://yun.baidu.com/s/1eqwfdvg
觉得不错的点个喜欢呗,要是直接赞赏的话,那真是太荣幸了。
参考链接:
android webview使用详解
android webview 开发详解(一)
还有一些零散的链接。
其它类似信息

推荐信息