目前HTML5发展非常迅速,很多native app都会嵌入到网页中,以此来适用多变的市场需求。但是androID的webvIEw默认支持的功能非常弱,很多地方都是需要自定义的,才能达到我们想要的效果。并且webvIEw在不同的版本会有不同程度的BUG。下面小编把webvIEw经常出现的问题给大家整理如下:
1.为WebVIEw自定义错误显示界面:
/** * 显示自定义错误提示页面,用一个VIEw覆盖在WebVIEw */ protected voID showErrorPage() { linearLayout webParentVIEw = (linearLayout)mWebVIEw.getParent(); initErrorPage(); while (webParentVIEw.getChildCount() > ) { webParentVIEw.removeVIEwAt( ); } linearLayout.LayoutParams lp = new linearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); webParentVIEw.addVIEw(mErrorVIEw,lp); mIsErrorPage = true ; } protected voID hIDeErrorPage() { linearLayout webParentVIEw = (linearLayout)mWebVIEw.getParent(); mIsErrorPage = false ; while (webParentVIEw.getChildCount() > ) { webParentVIEw.removeVIEwAt( ); } } protected voID initErrorPage() { if (mErrorVIEw == null ) { mErrorVIEw = VIEw.inflate( this,R.layout.online_error,null ); button button = (button)mErrorVIEw.findVIEwByID(R.ID.online_error_btn_retry); button.setonClickListener( new OnClickListener() { public voID onClick(VIEw v) { mWebVIEw.reload(); } }); mErrorVIEw.setonClickListener( null ); } }
2.WebVIEw cookies清理:
cookieSyncManager.createInstance( this ); cookieSyncManager.getInstance().startSync(); cookieManager.getInstance().removeSessioncookie();
3.清理cache 和历史记录:
复制代码 代码如下:
webVIEw.clearCache( true );
webVIEw.clearHistory();
4.判断WebVIEw是否已经滚动到页面底端:
getScrollY()方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.
getHeight()或者getBottom()方法都返回当前WebVIEw 这个容器的高度
getContentHeight 返回的是整个HTML 的高度,但并不等同于当前整个页面的高度,因为WebVIEw 有缩放功能,所以当前整个页面的高度实际上应该是原始HTML 的高度再乘上缩放比例. 因此,更正后的结果,准确的判断方法应该是:
if (WebVIEw.getContentHeight*WebVIEw.getScale() == (webvIEw.getHeight()+WebVIEw.getScrollY())){ //已经处于底端 }
5.URL拦截:
AndroID WebVIEw是拦截不到页面内的fragment跳转的。但是url跳转的话,又会引起页面刷新,H5页面的体验又下降了。只能给WebVIEw注入Js方法了。
6.处理WebVIEw中的非超链接请求(如AJAX请求):
有时候需要加上请求头,但是非超链接的请求,没有办法再shouldOverrinding中拦截并用webVIEw.loadUrl(String url,HashMap headers)方法添加请求头
目前用了一个临时的办法解决:
首先需要在url中加特殊标记/协议,如在onWebVIEwResource方法中拦截对应的请求,然后将要添加的请求头,以get形式拼接到url末尾
在shouldInterceptRequest()方法中,可以拦截到所有的网页中资源请求,比如加载Js,图片以及AJAX请求等等
Ex: @Suppresslint ( "NewAPI" ) @OverrIDe public WebResourceResponse shouldInterceptRequest(WebVIEw vIEw,String url) { // 非超链接(如AJAX)请求无法直接添加请求头,现拼接到url末尾,这里拼接一个imei作为示例 String AJAXUrl = url; // 如标识:req=AJAX if (url.contains( "req=AJAX" )) { AJAXUrl += "&imei=" + imei; } return super .shouldInterceptRequest(vIEw,AJAXUrl); }
7.在页面中先显示图片:
@OverrIDe public voID onLoadResource(WebVIEw vIEw,String url) { mEventListener.onWebVIEwEvent(CustomWebVIEw. this,OnWebVIEwEventListener.EVENT_ON_LOAD_RESOURCE,url); if (url.indexOf( ".jpg" ) > ) { hIDeProgress(); //请求图片时即显示页面 mEventListener.onWebVIEwEvent(CustomWebVIEw. this,OnWebVIEwEventListener.EVENT_ON_HIDE_PROGRESS,vIEw.getUrl()); } super .onLoadResource(vIEw,url); }
8.屏蔽掉长按事件 因为webvIEw长按时将会调用系统的复制控件:
mWebVIEw.setonLongClickListener( new OnLongClickListener() { @OverrIDe public boolean onLongClick(VIEw v) { return true ; } });
9.在WebVIEw加入 flash支持:
String temp = "<HTML><body bgcolor=/"" + "black" + "/"> <br/><embed src=/"" + url + "/" wIDth=/"" + "100%" + "/" height=/"" + "90%" + "/" scale=/"" + "noscale" + "/" type=/"" + "application/x-shockwave-flash" + "/"> </embed></body></HTML>" ; String mimeType = "text/HTML" ; String enCoding = "utf-8" ; web.loadDataWithBaseURL( "null",temp,mimeType,enCoding,"" );
以上内容就是本文针对AndroID WebVIEw 常见问题及处理方案的全部叙述,希望大家喜欢。
总结以上是内存溢出为你收集整理的Android WebView 常见问题及处理方案全部内容,希望文章能够帮你解决Android WebView 常见问题及处理方案所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)